]> arthur.barton.de Git - bup.git/blobdiff - cmd/bloom-cmd.py
get/init: consistently use argv_bytes() for RemoteRepo/Client
[bup.git] / cmd / bloom-cmd.py
index f968fa02e398fab2b55e85a62af30deb9435e7aa..09ed081ed989ea335529ca08b64d83e90e0512d6 100755 (executable)
@@ -5,10 +5,12 @@ exec "$bup_python" "$0" ${1+"$@"}
 """
 # end of bup preamble
 
+from __future__ import absolute_import
 import glob, os, sys, tempfile
 
 from bup import options, git, bloom
-from bup.helpers import (debug1, handle_ctrl_c, log, progress, qprogress,
+from bup.compat import hexstr
+from bup.helpers import (add_error, debug1, handle_ctrl_c, log, progress, qprogress,
                          saved_errors)
 
 optspec = """
@@ -53,13 +55,13 @@ def check_bloom(path, bloomfilename, idx):
     log("bloom:   checking %s\n" % ridx)
     for objsha in git.open_idx(idx):
         if not b.exists(objsha):
-            add_error("bloom: ERROR: object %s missing" 
-                      % str(objsha).encode('hex'))
+            add_error('bloom: ERROR: object %s missing' % hexstr(objsha))
 
 
 _first = None
-def do_bloom(path, outfilename):
+def do_bloom(path, outfilename, k):
     global _first
+    assert k in (None, 4, 5)
     b = None
     if os.path.exists(outfilename) and not opt.force:
         b = bloom.ShaBloom(outfilename)
@@ -81,7 +83,6 @@ def do_bloom(path, outfilename):
         else:
             add.append(name)
             add_count += len(ix)
-    total = add_count + rest_count
 
     if not add:
         debug1("bloom: nothing to do.\n")
@@ -92,7 +93,11 @@ def do_bloom(path, outfilename):
             debug1("bloom: size %d != idx total %d, regenerating\n"
                    % (len(b), rest_count))
             b = None
-        elif (b.bits < bloom.MAX_BLOOM_BITS and
+        elif k is not None and k != b.k:
+            debug1("bloom: new k %d != existing k %d, regenerating\n"
+                   % (k, b.k))
+            b = None
+        elif (b.bits < bloom.MAX_BLOOM_BITS[b.k] and
               b.pfalse_positive(add_count) > bloom.MAX_PFALSE_POSITIVE):
             debug1("bloom: regenerating: adding %d entries gives "
                    "%.2f%% false positives.\n"
@@ -109,7 +114,7 @@ def do_bloom(path, outfilename):
     msg = b is None and 'creating from' or 'adding'
     if not _first: _first = path
     dirprefix = (_first != path) and git.repo_rel(path)+': ' or ''
-    progress('bloom: %s%s %d file%s (%d object%s).\n'
+    progress('bloom: %s%s %d file%s (%d object%s).\r'
         % (dirprefix, msg,
            len(add), len(add)!=1 and 's' or '',
            add_count, add_count!=1 and 's' or ''))
@@ -117,7 +122,7 @@ def do_bloom(path, outfilename):
     tfname = None
     if b is None:
         tfname = os.path.join(path, 'bup.tmp.bloom')
-        b = bloom.create(tfname, expected=add_count, k=opt.k)
+        b = bloom.create(tfname, expected=add_count, k=k)
     count = 0
     icount = 0
     for name in add:
@@ -158,7 +163,7 @@ for path in paths:
     elif opt.ruin:
         ruin_bloom(outfilename)
     else:
-        do_bloom(path, outfilename)
+        do_bloom(path, outfilename, opt.k)
 
 if saved_errors:
     log('WARNING: %d errors encountered during bloom.\n' % len(saved_errors))