~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:27:02 UTC
  • Revision ID: mbp@sourcefrog.net-20050525032702-395f038adb33c235
- clean up statcache code
- stat files in order by inum
- report on added/deleted files

Show diffs side-by-side

added added

removed removed

Lines of Context:
210
210
    flush -- discard any previous cache and recalculate from scratch.
211
211
    """
212
212
 
 
213
    # load the existing cache; use information there to find a list of
 
214
    # files ordered by inode, which is alleged to be the fastest order
 
215
    # to stat the files.
213
216
    
214
 
    # TODO: It's supposed to be faster to stat the files in order by inum.
215
 
    # We don't directly know the inum of the files of course but we do
216
 
    # know where they were last sighted, so we can sort by that.
 
217
    to_update = _files_from_inventory(inv)
217
218
 
218
219
    assert isinstance(flush, bool)
219
220
    if flush:
220
221
        cache = {}
221
222
    else:
222
223
        cache = load_cache(basedir)
223
 
    return _update_cache_from_list(basedir, cache, _files_from_inventory(inv))
224
 
 
225
 
 
226
 
 
227
 
def _update_cache_from_list(basedir, cache, to_update):
228
 
    """Update and return the cache for given files.
229
 
 
230
 
    cache -- Previously cached values to be validated.
231
 
 
232
 
    to_update -- Sequence of (file_id, path) pairs to check.
233
 
    """
234
 
    stat_cnt = missing_cnt = hardcheck = change_cnt = 0
 
224
 
 
225
        by_inode = []
 
226
        without_inode = []
 
227
        for file_id, path in to_update:
 
228
            if file_id in cache:
 
229
                by_inode.append((cache[file_id][SC_INO], file_id, path))
 
230
            else:
 
231
                without_inode.append((file_id, path))
 
232
        by_inode.sort()
 
233
 
 
234
        to_update = [a[1:] for a in by_inode] + without_inode
 
235
            
 
236
    stat_cnt = missing_cnt = new_cnt = hardcheck = change_cnt = 0
235
237
 
236
238
    # dangerfiles have been recently touched and can't be committed to
237
239
    # a persistent cache yet, but they are returned to the caller.
253
255
                change_cnt += 1
254
256
            missing_cnt += 1
255
257
            continue
 
258
        elif not cacheentry:
 
259
            new_cnt += 1
256
260
 
257
261
        if (fp[FP_MTIME] >= now) or (fp[FP_CTIME] >= now):
258
262
            dangerfiles.append(file_id)
272
276
        change_cnt += 1
273
277
 
274
278
    mutter('statcache: statted %d files, read %d files, %d changed, %d dangerous, '
 
279
           '%d deleted, %d new, '
275
280
           '%d in cache'
276
 
           % (stat_cnt, hardcheck, change_cnt, len(dangerfiles), len(cache)))
 
281
           % (stat_cnt, hardcheck, change_cnt, len(dangerfiles),
 
282
              missing_cnt, new_cnt, len(cache)))
277
283
        
278
284
    if change_cnt:
279
285
        mutter('updating on-disk statcache')