~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hashcache.py

  • Committer: Martin Pool
  • Date: 2006-01-12 04:54:44 UTC
  • mfrom: (1185.59.10 bzr.cleanup)
  • Revision ID: mbp@sourcefrog.net-20060112045444-cc2e49b5bae40e06
[merge] hashcache and related cleanups from Denys

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
import os, stat, time
33
33
import sha
34
34
 
35
 
from bzrlib.osutils import sha_file
 
35
from bzrlib.osutils import sha_file, pathjoin
36
36
from bzrlib.trace import mutter, warning
37
37
from bzrlib.atomicfile import AtomicFile
38
 
from bzrlib.osutils import pathjoin
39
 
 
40
 
 
 
38
from bzrlib.errors import BzrError
 
39
 
 
40
 
 
41
FP_MTIME_COLUMN = 1
 
42
FP_CTIME_COLUMN = 2
41
43
FP_MODE_COLUMN = 5
42
44
 
43
45
def _fingerprint(abspath):
170
172
        if stat.S_ISREG(mode):
171
173
            digest = sha_file(file(abspath, 'rb', buffering=65000))
172
174
        elif stat.S_ISLNK(mode):
173
 
            link_target = os.readlink(abspath)
174
175
            digest = sha.new(os.readlink(abspath)).hexdigest()
175
176
        else:
176
177
            raise BzrError("file %r: unknown file stat mode: %o"%(abspath,mode))
177
178
 
178
179
        now = int(time.time())
179
 
        if file_fp[1] >= now or file_fp[2] >= now:
 
180
        if file_fp[FP_MTIME_COLUMN] >= now or file_fp[FP_CTIME_COLUMN] >= now:
180
181
            # changed too recently; can't be cached.  we can
181
182
            # return the result and it could possibly be cached
182
183
            # next time.
 
184
            #
 
185
            # the point is that we only want to cache when we are sure that any
 
186
            # subsequent modifications of the file can be detected.  If a
 
187
            # modification neither changes the inode, the device, the size, nor
 
188
            # the mode, then we can only distinguish it by time; therefore we
 
189
            # need to let sufficient time elapse before we may cache this entry
 
190
            # again.  If we didn't do this, then, for example, a very quick 1
 
191
            # byte replacement in the file might go undetected.
183
192
            self.danger_count += 1 
184
193
            if cache_fp:
185
194
                self.removed_count += 1