]> arthur.barton.de Git - bup.git/blobdiff - cmd/margin-cmd.py
tvfs: accommodate python 3 and test there
[bup.git] / cmd / margin-cmd.py
index e61d0573aba00fde59c4583f8236b0b38f78abe5..7eba44844c6769a5b9279c2cddbbc06501dd7aa6 100755 (executable)
@@ -1,8 +1,17 @@
-#!/usr/bin/env python
-import sys, struct
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+import sys, struct, math
+
 from bup import options, git, _helpers
-from bup.helpers import *
+from bup.helpers import log
 
+POPULATION_OF_EARTH=6.7e9  # as of September, 2010
 
 optspec = """
 bup margin
@@ -10,16 +19,15 @@ 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)
+o = options.Options(optspec)
 (opt, flags, extra) = o.parse(sys.argv[1:])
 
 if extra:
     o.fatal("no arguments expected")
 
 git.check_repo_or_die()
-git.ignore_midx = opt.ignore_midx
 
-mi = git.PackIdxList(git.repo('objects/pack'))
+mi = git.PackIdxList(git.repo('objects/pack'), ignore_midx=opt.ignore_midx)
 
 def do_predict(ix):
     total = len(ix)
@@ -29,7 +37,7 @@ def do_predict(ix):
         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))
+    print('%d of %d (%.3f%%) ' % (maxdiff, len(ix), maxdiff*100.0/len(ix)))
     sys.stdout.flush()
     assert(count+1 == len(ix))
 
@@ -50,4 +58,17 @@ else:
         pm = _helpers.bitmatch(last, i)
         longmatch = max(longmatch, pm)
         last = i
-    print longmatch
+    print(longmatch)
+    log('%d matching prefix bits\n' % longmatch)
+    doublings = math.log(len(mi), 2)
+    bpd = longmatch / doublings
+    log('%.2f bits per doubling\n' % bpd)
+    remain = 160 - longmatch
+    rdoublings = remain / bpd
+    log('%d bits (%.2f doublings) remaining\n' % (remain, rdoublings))
+    larger = 2**rdoublings
+    log('%g times larger is possible\n' % larger)
+    perperson = larger/POPULATION_OF_EARTH
+    log('\nEveryone on earth could have %d data sets like yours, all in one\n'
+        'repository, and we would expect 1 object collision.\n'
+        % int(perperson))