~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hashcache.py

  • Committer: Martin Pool
  • Date: 2005-07-08 02:40:22 UTC
  • Revision ID: mbp@sourcefrog.net-20050708024021-731a320c625619f6
- code to re-read hashcache from file

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
 
19
19
 
20
 
CACHE_HEADER = "### bzr statcache v5"    
 
20
CACHE_HEADER = "### bzr statcache v5\n"
21
21
 
22
22
 
23
23
def _fingerprint(abspath):
137
137
 
138
138
        outf = AtomicFile(cachefn, 'wb')
139
139
        try:
140
 
            outf.write(CACHE_HEADER + '\n')
 
140
            print >>outf, CACHE_HEADER,
141
141
 
142
142
            for path, c  in self._cache.iteritems():
143
143
                assert '//' not in path, path
145
145
                outf.write('// ')
146
146
                print >>outf, c[0],     # hex sha1
147
147
                for fld in c[1]:
148
 
                    print >>outf, fld,
 
148
                    print >>outf, "%d" % fld,
149
149
                print >>outf
150
150
 
151
151
            outf.commit()
153
153
            if not outf.closed:
154
154
                outf.abort()
155
155
        
 
156
 
 
157
 
 
158
    def read(self, cachefn):
 
159
        """Reinstate cache from file.
 
160
 
 
161
        Overwrites existing cache.
 
162
 
 
163
        If the cache file has the wrong version marker, this just clears 
 
164
        the cache."""
 
165
        from bzrlib.trace import mutter, warning
 
166
 
 
167
        inf = file(cachefn, 'rb')
 
168
        self._cache = {}
 
169
 
 
170
        hdr = inf.readline()
 
171
        if hdr != CACHE_HEADER:
 
172
            mutter('cache header marker not found at top of %s; discarding cache'
 
173
                   % cachefn)
 
174
            return
 
175
 
 
176
        for l in inf:
 
177
            pos = l.index('// ')
 
178
            path = l[:pos].decode('utf-8')
 
179
            if path in self._cache:
 
180
                warning('duplicated path %r in cache' % path)
 
181
                continue
 
182
 
 
183
            pos += 3
 
184
            fields = l[pos:].split(' ')
 
185
            if len(fields) != 6:
 
186
                warning("bad line in hashcache: %r" % l)
 
187
                continue
 
188
 
 
189
            sha1 = fields[0]
 
190
            if len(sha1) != 40:
 
191
                warning("bad sha1 in hashcache: %r" % sha1)
 
192
                continue
 
193
 
 
194
            fp = tuple(map(long, fields[1:]))
 
195
 
 
196
            self._cache[path] = (sha1, fp)
 
197
 
 
198
 
 
199