3 bup_python="$(dirname "$0")/bup-python" || exit $?
4 exec "$bup_python" "$0" ${1+"$@"}
7 import sys, struct, math
8 from bup import options, git, _helpers
9 from bup.helpers import *
11 POPULATION_OF_EARTH=6.7e9 # as of September, 2010
16 predict Guess object offsets and report the maximum deviation
17 ignore-midx Don't use midx files; use only plain pack idx files.
19 o = options.Options(optspec)
20 (opt, flags, extra) = o.parse(sys.argv[1:])
23 o.fatal("no arguments expected")
25 git.check_repo_or_die()
26 git.ignore_midx = opt.ignore_midx
28 mi = git.PackIdxList(git.repo('objects/pack'))
33 for count,i in enumerate(ix):
34 prefix = struct.unpack('!Q', i[:8])[0]
35 expected = prefix * total / (1<<64)
36 diff = count - expected
37 maxdiff = max(maxdiff, abs(diff))
38 print '%d of %d (%.3f%%) ' % (maxdiff, len(ix), maxdiff*100.0/len(ix))
40 assert(count+1 == len(ix))
49 # default mode: find longest matching prefix
55 #assert(str(i) >= last)
56 pm = _helpers.bitmatch(last, i)
57 longmatch = max(longmatch, pm)
60 log('%d matching prefix bits\n' % longmatch)
61 doublings = math.log(len(mi), 2)
62 bpd = longmatch / doublings
63 log('%.2f bits per doubling\n' % bpd)
64 remain = 160 - longmatch
65 rdoublings = remain / bpd
66 log('%d bits (%.2f doublings) remaining\n' % (remain, rdoublings))
67 larger = 2**rdoublings
68 log('%g times larger is possible\n' % larger)
69 perperson = larger/POPULATION_OF_EARTH
70 log('\nEveryone on earth could have %d data sets like yours, all in one\n'
71 'repository, and we would expect 1 object collision.\n'