2 import sys, math, struct
7 SHA_PER_PAGE=PAGE_SIZE/200.
18 bup midx -o outfile.midx <idxnames...>
20 o,output= output midx file name
22 o = options.Options('bup midx', optspec)
23 (opt, flags, extra) = o.parse(sys.argv[1:])
26 log("bup midx: no input filenames given\n")
29 log("bup midx: no output filename given\n")
35 ix = git.PackIndex(name)
39 log('total objects expected: %d\n' % total)
40 pages = total/SHA_PER_PAGE
41 log('pages: %d\n' % pages)
42 bits = int(math.ceil(math.log(pages, 2)))
43 log('table bits: %d\n' % bits)
45 log('table entries: %d\n' % entries)
46 log('table size: %d\n' % (entries*8))
51 iters = [iter(i) for i in inp]
52 iters = [[next(it), it] for it in iters]
55 if (count % (total/100)) == 0:
56 log('\rMerging: %d%%' % (count*100/total))
57 e = min(iters) # FIXME: very slow for long lists
61 prefix = git.extract_bits(e[0], bits)
64 iters = filter(lambda x: x[0], iters)
65 log('\rMerging: done.\n')
67 f = open(opt.output, 'w+')
68 f.write('MIDX\0\0\0\1')
69 f.write(struct.pack('!I', bits))
70 assert(f.tell() == 12)
71 f.write('\0'*8*entries)
76 f.write('\0'.join([os.path.basename(p) for p in extra]))
79 f.write(struct.pack('!%dQ' % entries, *table))
82 # this is just for testing
84 p = git.PackMidx(opt.output)
85 assert(len(p.idxnames) == len(extra))
87 assert(len(p) == total)
90 assert(i == pi.next())