~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hashcache.py

  • Committer: Robert Collins
  • Date: 2005-10-16 23:53:02 UTC
  • mto: This revision was merged to the branch mainline in revision 1459.
  • Revision ID: robertc@lifelesslap.robertcollins.net-20051016235302-818de607403e1c6e
test that the presence of a signature does not make a missing base file magically appear present

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
# TODO: Perhaps return more details on the file to avoid statting it
24
24
# again: nonexistent, file type, size, etc
25
25
 
 
26
# TODO: Perhaps use a Python pickle instead of a text file; might be faster.
 
27
 
26
28
 
27
29
 
28
30
CACHE_HEADER = "### bzr hashcache v5\n"
29
31
 
30
32
import os, stat, time
 
33
import sha
31
34
 
32
35
from bzrlib.osutils import sha_file
33
36
from bzrlib.trace import mutter, warning
34
 
 
35
 
 
 
37
from bzrlib.atomicfile import AtomicFile
 
38
 
 
39
 
 
40
FP_MODE_COLUMN = 5
36
41
 
37
42
def _fingerprint(abspath):
38
43
    try:
47
52
    # we discard any high precision because it's not reliable; perhaps we
48
53
    # could do better on some systems?
49
54
    return (fs.st_size, long(fs.st_mtime),
50
 
            long(fs.st_ctime), fs.st_ino, fs.st_dev)
 
55
            long(fs.st_ctime), fs.st_ino, fs.st_dev, fs.st_mode)
51
56
 
52
57
 
53
58
class HashCache(object):
96
101
        self.update_count = 0
97
102
        self._cache = {}
98
103
 
99
 
 
100
104
    def cache_file_name(self):
 
105
        # FIXME: duplicate path logic here, this should be 
 
106
        # something like 'branch.controlfile'.
101
107
        return os.sep.join([self.basedir, '.bzr', 'stat-cache'])
102
108
 
103
 
 
104
 
 
105
 
 
106
109
    def clear(self):
107
110
        """Discard all cached information.
108
111
 
135
138
                del self._cache[path]
136
139
 
137
140
 
138
 
 
139
141
    def get_sha1(self, path):
140
142
        """Return the sha1 of a file.
141
143
        """
161
163
            return cache_sha1
162
164
        
163
165
        self.miss_count += 1
164
 
        digest = sha_file(file(abspath, 'rb', buffering=65000))
 
166
 
 
167
 
 
168
        mode = file_fp[FP_MODE_COLUMN]
 
169
        if stat.S_ISREG(mode):
 
170
            digest = sha_file(file(abspath, 'rb', buffering=65000))
 
171
        elif stat.S_ISLNK(mode):
 
172
            link_target = os.readlink(abspath)
 
173
            digest = sha.new(os.readlink(abspath)).hexdigest()
 
174
        else:
 
175
            raise BzrError("file %r: unknown file stat mode: %o"%(abspath,mode))
165
176
 
166
177
        now = int(time.time())
167
178
        if file_fp[1] >= now or file_fp[2] >= now:
177
188
            self.update_count += 1
178
189
            self.needs_write = True
179
190
            self._cache[path] = (digest, file_fp)
180
 
        
181
191
        return digest
182
192
        
183
 
 
184
 
 
185
 
 
186
193
    def write(self):
187
194
        """Write contents of cache to file."""
188
 
        from atomicfile import AtomicFile
189
 
 
190
195
        outf = AtomicFile(self.cache_file_name(), 'wb')
191
196
        try:
192
197
            print >>outf, CACHE_HEADER,
222
227
            inf = file(fn, 'rb', buffering=65000)
223
228
        except IOError, e:
224
229
            mutter("failed to open %s: %s" % (fn, e))
 
230
            # better write it now so it is valid
 
231
            self.needs_write = True
225
232
            return
226
233
 
227
234
 
229
236
        if hdr != CACHE_HEADER:
230
237
            mutter('cache header marker not found at top of %s; discarding cache'
231
238
                   % fn)
 
239
            self.needs_write = True
232
240
            return
233
241
 
234
242
        for l in inf:
240
248
 
241
249
            pos += 3
242
250
            fields = l[pos:].split(' ')
243
 
            if len(fields) != 6:
 
251
            if len(fields) != 7:
244
252
                warning("bad line in hashcache: %r" % l)
245
253
                continue
246
254