~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hashcache.py

  • Committer: Robert Collins
  • Date: 2006-01-05 22:30:59 UTC
  • mto: (1534.1.4 integration)
  • mto: This revision was merged to the branch mainline in revision 1536.
  • Revision ID: robertc@robertcollins.net-20060105223059-a8b64f7b47cf12fb
 * bzrlib.osutils.safe_unicode now exists to provide parameter coercion
   for functions that need unicode strings. (Robert Collins)

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, pathjoin
 
35
from bzrlib.osutils import sha_file
36
36
from bzrlib.trace import mutter, warning
37
37
from bzrlib.atomicfile import AtomicFile
38
 
from bzrlib.errors import BzrError
39
 
 
40
 
 
41
 
FP_MTIME_COLUMN = 1
42
 
FP_CTIME_COLUMN = 2
 
38
from bzrlib.osutils import pathjoin
 
39
 
 
40
 
43
41
FP_MODE_COLUMN = 5
44
42
 
45
43
def _fingerprint(abspath):
172
170
        if stat.S_ISREG(mode):
173
171
            digest = sha_file(file(abspath, 'rb', buffering=65000))
174
172
        elif stat.S_ISLNK(mode):
 
173
            link_target = os.readlink(abspath)
175
174
            digest = sha.new(os.readlink(abspath)).hexdigest()
176
175
        else:
177
176
            raise BzrError("file %r: unknown file stat mode: %o"%(abspath,mode))
178
177
 
179
178
        now = int(time.time())
180
 
        if file_fp[FP_MTIME_COLUMN] >= now or file_fp[FP_CTIME_COLUMN] >= now:
 
179
        if file_fp[1] >= now or file_fp[2] >= now:
181
180
            # changed too recently; can't be cached.  we can
182
181
            # return the result and it could possibly be cached
183
182
            # 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.
192
183
            self.danger_count += 1 
193
184
            if cache_fp:
194
185
                self.removed_count += 1