#!/usr/bin/env python
import sys, math, struct, glob, sha
-import options, git
-from helpers import *
+from bup import options, git
+from bup.helpers import *
PAGE_SIZE=4096
SHA_PER_PAGE=PAGE_SIZE/200.
total += len(ix)
log('Merging %d indexes (%d objects).\n' % (len(infilenames), total))
- if total < 1024 and len(infilenames) < 3:
- log('%s: not enough objects for a .midx to be useful.\n' % outdir)
+ if (not opt.force and (total < 1024 and len(infilenames) < 3)) \
+ or (opt.force and not total):
+ log('midx: nothing to do.\n')
return
pages = int(total/SHA_PER_PAGE) or 1
except OSError:
pass
f = open(outfilename + '.tmp', 'w+')
- f.write('MIDX\0\0\0\1')
+ f.write('MIDX\0\0\0\2')
f.write(struct.pack('!I', bits))
assert(f.tell() == 12)
- f.write('\0'*8*entries)
+ f.write('\0'*4*entries)
for e in merge(inp, bits, table):
f.write(e)
- f.write('\0'.join([os.path.basename(p) for p in infilenames]))
+ f.write('\0'.join(os.path.basename(p) for p in infilenames))
f.seek(12)
- f.write(struct.pack('!%dQ' % entries, *table))
+ f.write(struct.pack('!%dI' % entries, *table))
f.close()
os.rename(outfilename + '.tmp', outfilename)
(opt, flags, extra) = o.parse(sys.argv[1:])
if extra and (opt.auto or opt.force):
- log("bup midx: you can't use -f/-a and also provide filenames\n")
- o.usage()
+ o.fatal("you can't use -f/-a and also provide filenames")
git.check_repo_or_die()
elif opt.auto or opt.force:
paths = [git.repo('objects/pack')]
paths += glob.glob(git.repo('index-cache/*/.'))
- if opt.force:
- for path in paths:
+ for path in paths:
+ log('midx: scanning %s\n' % path)
+ if opt.force:
do_midx(path, opt.output, glob.glob('%s/*.idx' % path))
- elif opt.auto:
- for path in paths:
+ elif opt.auto:
m = git.MultiPackIndex(path)
needed = {}
for pack in m.packs: # only .idx files without a .midx are open
needed[pack.name] = 1
del m
do_midx(path, opt.output, needed.keys())
+ log('\n')
else:
- log("bup midx: you must use -f or -a or provide input filenames\n")
- o.usage()
+ o.fatal("you must use -f or -a or provide input filenames")