~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/statcache.py

  • Committer: Martin Pool
  • Date: 2005-05-25 03:11:29 UTC
  • Revision ID: mbp@sourcefrog.net-20050525031129-1c52d22ec270a05b
- refactor handling of dangerous files (changed recently)

Show diffs side-by-side

added added

removed removed

Lines of Context:
114
114
           .replace('\r', '\\u000d')
115
115
 
116
116
 
117
 
def _write_cache(basedir, entry_iter, dangerfiles):
 
117
def _write_cache(basedir, entries):
118
118
    from atomicfile import AtomicFile
119
119
 
120
120
    cachefn = os.path.join(basedir, '.bzr', 'stat-cache')
121
121
    outf = AtomicFile(cachefn, 'wb')
122
122
    outf.write(CACHE_HEADER + '\n')
123
123
    try:
124
 
        for entry in entry_iter:
 
124
        for entry in entries:
125
125
            if len(entry) != 8:
126
126
                raise ValueError("invalid statcache entry tuple %r" % entry)
127
 
            
128
 
            if entry[SC_FILE_ID] in dangerfiles:
129
 
                continue                # changed too recently
130
127
            outf.write(safe_quote(entry[0])) # file id
131
128
            outf.write(' ')
132
129
            outf.write(entry[1])             # hex sha1
142
139
            outf.abort()
143
140
 
144
141
 
145
 
def _write_cache_maybe(basedir, entry_iter, dangerfiles):
 
142
def _try_write_cache(basedir, entries):
146
143
    try:
147
 
        return _write_cache(basedir, entry_iter, dangerfiles)
 
144
        return _write_cache(basedir, entries)
148
145
    except IOError, e:
149
146
        mutter("cannot update statcache in %s: %s" % (basedir, e))
150
147
    except OSError, e:
238
235
 
239
236
    # dangerfiles have been recently touched and can't be committed to
240
237
    # a persistent cache yet, but they are returned to the caller.
241
 
    dangerfiles = {}
 
238
    dangerfiles = []
242
239
    
243
240
    now = int(time.time())
244
241
 
258
255
            continue
259
256
 
260
257
        if (fp[FP_MTIME] >= now) or (fp[FP_CTIME] >= now):
261
 
            dangerfiles[file_id] = True
 
258
            dangerfiles.append(file_id)
262
259
 
263
260
        if cacheentry and (cacheentry[3:] == fp):
264
261
            continue                    # all stat fields unchanged
280
277
        
281
278
    if change_cnt:
282
279
        mutter('updating on-disk statcache')
283
 
        _write_cache_maybe(basedir, cache.itervalues(), dangerfiles)
 
280
 
 
281
        if dangerfiles:
 
282
            safe_cache = cache.copy()
 
283
            for file_id in dangerfiles:
 
284
                del safe_cache[file_id]
 
285
        else:
 
286
            safe_cache = cache
 
287
        
 
288
        _try_write_cache(basedir, safe_cache.itervalues())
284
289
 
285
290
    return cache