]> arthur.barton.de Git - bup.git/blobdiff - cmd/margin-cmd.py
cmd/margin: add a new --predict option.
[bup.git] / cmd / margin-cmd.py
index cb059a3809687593222a3e91def7f1d7b987ba6b..e61d0573aba00fde59c4583f8236b0b38f78abe5 100755 (executable)
@@ -1,11 +1,14 @@
 #!/usr/bin/env python
-import sys
+import sys, struct
 from bup import options, git, _helpers
 from bup.helpers import *
 
 
 optspec = """
 bup margin
+--
+predict    Guess object offsets and report the maximum deviation
+ignore-midx  Don't use midx files; use only plain pack idx files.
 """
 o = options.Options('bup margin', optspec)
 (opt, flags, extra) = o.parse(sys.argv[1:])
@@ -14,16 +17,37 @@ if extra:
     o.fatal("no arguments expected")
 
 git.check_repo_or_die()
-#git.ignore_midx = 1
+git.ignore_midx = opt.ignore_midx
 
 mi = git.PackIdxList(git.repo('objects/pack'))
-last = '\0'*20
-longmatch = 0
-for i in mi:
-    if i == last:
-        continue
-    #assert(str(i) >= last)
-    pm = _helpers.bitmatch(last, i)
-    longmatch = max(longmatch, pm)
-    last = i
-print longmatch
+
+def do_predict(ix):
+    total = len(ix)
+    maxdiff = 0
+    for count,i in enumerate(ix):
+        prefix = struct.unpack('!Q', i[:8])[0]
+        expected = prefix * total / (1<<64)
+        diff = count - expected
+        maxdiff = max(maxdiff, abs(diff))
+    print '%d of %d (%.3f%%) ' % (maxdiff, len(ix), maxdiff*100.0/len(ix))
+    sys.stdout.flush()
+    assert(count+1 == len(ix))
+
+if opt.predict:
+    if opt.ignore_midx:
+        for pack in mi.packs:
+            do_predict(pack)
+    else:
+        do_predict(mi)
+else:
+    # default mode: find longest matching prefix
+    last = '\0'*20
+    longmatch = 0
+    for i in mi:
+        if i == last:
+            continue
+        #assert(str(i) >= last)
+        pm = _helpers.bitmatch(last, i)
+        longmatch = max(longmatch, pm)
+        last = i
+    print longmatch