X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=lib%2Fbup%2Fgc.py;h=6f645847d181c494ee762ca41287151bcafa2d9e;hb=d4100c81448484b8ea222fb78757bf003e181cf1;hp=c0a1c0e1df489197d66cb58b92229d6d980cf26c;hpb=d418807c4cb329f5956553eece28b5f54a33f707;p=bup.git diff --git a/lib/bup/gc.py b/lib/bup/gc.py index c0a1c0e..6f64584 100644 --- a/lib/bup/gc.py +++ b/lib/bup/gc.py @@ -1,5 +1,8 @@ + +from __future__ import absolute_import import glob, os, subprocess, sys, tempfile from bup import bloom, git, midx +from bup.compat import range from bup.git import MissingObject, walk_object from bup.helpers import Nonlocal, log, progress, qprogress from os.path import basename @@ -109,15 +112,14 @@ def find_live_objects(existing_count, cat_pipe, verbosity=0): if verbosity: report_live_item(approx_live_count, existing_count, ref_name, ref_id, item, verbosity) - bin_id = item.id.decode('hex') if trees_visited is not None and item.type == 'tree': - trees_visited.add(bin_id) + trees_visited.add(item.oid) if verbosity: - if not live_objs.exists(bin_id): - live_objs.add(bin_id) + if not live_objs.exists(item.oid): + live_objs.add(item.oid) approx_live_count += 1 else: - live_objs.add(bin_id) + live_objs.add(item.oid) trees_visited = None if verbosity: log('expecting to retain about %.2f%% unnecessary objects\n' @@ -135,6 +137,8 @@ def sweep(live_objects, existing_count, cat_pipe, threshold, compression, if verbosity and new_pack_prefix: log('created ' + basename(new_pack_prefix) + '\n') for p in ns.stale_files: + if new_pack_prefix and p.startswith(new_pack_prefix): + continue # Don't remove the new pack file if verbosity: log('removing ' + basename(p) + '\n') os.unlink(p) @@ -156,7 +160,7 @@ def sweep(live_objects, existing_count, cat_pipe, threshold, compression, idx = git.open_idx(idx_name) idx_live_count = 0 - for i in xrange(0, len(idx)): + for i in range(0, len(idx)): sha = idx.shatable[i * 20 : (i + 1) * 20] if live_objects.exists(sha): idx_live_count += 1 @@ -180,12 +184,12 @@ def sweep(live_objects, existing_count, cat_pipe, threshold, compression, if verbosity: log('rewriting %s (%.2f%% live)\n' % (basename(idx_name), live_frac * 100)) - for i in xrange(0, len(idx)): + for i in range(0, len(idx)): sha = idx.shatable[i * 20 : (i + 1) * 20] if live_objects.exists(sha): item_it = cat_pipe.get(sha.encode('hex')) - type = item_it.next() - writer.just_write(sha, type, ''.join(item_it)) + _, typ, _ = next(item_it) + writer.just_write(sha, typ, ''.join(item_it)) ns.stale_files.append(idx_name) ns.stale_files.append(idx_name[:-3] + 'pack') @@ -223,15 +227,16 @@ def bup_gc(threshold=10, compression=1, verbosity=0): live_objects = find_live_objects(existing_count, cat_pipe, verbosity=verbosity) except MissingObject as ex: - log('bup: missing object %r \n' % ex.id.encode('hex')) + log('bup: missing object %r \n' % ex.oid.encode('hex')) sys.exit(1) try: # FIXME: just rename midxes and bloom, and restore them at the end if # we didn't change any packs? + packdir = git.repo('objects/pack') if verbosity: log('clearing midx files\n') - midx.clear_midxes() + midx.clear_midxes(packdir) if verbosity: log('clearing bloom filter\n') - bloom.clear_bloom(git.repo('objects/pack')) + bloom.clear_bloom(packdir) if verbosity: log('clearing reflog\n') expirelog_cmd = ['git', 'reflog', 'expire', '--all', '--expire=all'] expirelog = subprocess.Popen(expirelog_cmd, preexec_fn = git._gitenv())