From: Avery Pennarun Date: Thu, 2 Sep 2010 21:33:04 +0000 (-0700) Subject: Merge branch 'maint' X-Git-Tag: bup-0.18~10 X-Git-Url: https://arthur.barton.de/gitweb/?p=bup.git;a=commitdiff_plain;h=91efac924a2cd3b2393198c519115951476df042 Merge branch 'maint' * maint: git.py: recover more elegantly if a MIDX file has the wrong version. cmd/midx: add a new --max-files parameter. Conflicts: lib/bup/git.py --- 91efac924a2cd3b2393198c519115951476df042 diff --cc lib/bup/git.py index 8ff5ac0,391ba94..3bbd25a --- a/lib/bup/git.py +++ b/lib/bup/git.py @@@ -5,8 -5,9 +5,10 @@@ interact with the Git data structures import os, zlib, time, subprocess, struct, stat, re, tempfile import heapq from bup.helpers import * +from bup import _helpers + MIDX_VERSION = 2 + verbose = 0 ignore_midx = 0 home_repodir = os.path.expanduser('~/.bup') @@@ -203,24 -209,39 +205,39 @@@ class PackMidx """ def __init__(self, filename): self.name = filename + self.force_keep = False assert(filename.endswith('.midx')) self.map = mmap_read(open(filename)) - if str(self.map[0:8]) == 'MIDX\0\0\0\1': - log('Warning: ignoring old-style midx %r\n' % filename) - self.bits = 0 - self.entries = 1 - self.fanout = buffer('\0\0\0\0') - self.shalist = buffer('\0'*20) - self.idxnames = [] - else: - assert(str(self.map[0:8]) == 'MIDX\0\0\0\2') - self.bits = _helpers.firstword(self.map[8:12]) - self.entries = 2**self.bits - self.fanout = buffer(self.map, 12, self.entries*4) - shaofs = 12 + self.entries*4 - nsha = self._fanget(self.entries-1) - self.shalist = buffer(self.map, shaofs, nsha*20) - self.idxnames = str(self.map[shaofs + 20*nsha:]).split('\0') + if str(self.map[0:4]) != 'MIDX': + log('Warning: skipping: invalid MIDX header in %r\n' % filename) + self.force_keep = True + return self._init_failed() + ver = struct.unpack('!I', self.map[4:8])[0] + if ver < MIDX_VERSION: + log('Warning: ignoring old-style (v%d) midx %r\n' + % (ver, filename)) + self.force_keep = False # old stuff is boring + return self._init_failed() + if ver > MIDX_VERSION: + log('Warning: ignoring too-new (v%d) midx %r\n' + % (ver, filename)) + self.force_keep = True # new stuff is exciting + return self._init_failed() + - self.bits = struct.unpack('!I', self.map[8:12])[0] ++ self.bits = _helpers.firstword(self.map[8:12]) + self.entries = 2**self.bits + self.fanout = buffer(self.map, 12, self.entries*4) + shaofs = 12 + self.entries*4 + nsha = self._fanget(self.entries-1) + self.shalist = buffer(self.map, shaofs, nsha*20) + self.idxnames = str(self.map[shaofs + 20*nsha:]).split('\0') + + def _init_failed(self): + self.bits = 0 + self.entries = 1 + self.fanout = buffer('\0\0\0\0') + self.shalist = buffer('\0'*20) + self.idxnames = [] def _fanget(self, i): start = i*4