]> arthur.barton.de Git - bup.git/commitdiff
Merge branch 'maint'
authorAvery Pennarun <apenwarr@gmail.com>
Thu, 2 Sep 2010 21:33:04 +0000 (14:33 -0700)
committerAvery Pennarun <apenwarr@gmail.com>
Thu, 2 Sep 2010 21:33:04 +0000 (14:33 -0700)
* 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

1  2 
lib/bup/git.py

diff --cc lib/bup/git.py
index 8ff5ac05fd3211599eb77e87134871d1d24533db,391ba9475973ec331bce42ff26e4216531b3b7e2..3bbd25a59c65ea523612ccc2fb3e5b9a27b44a1e
@@@ -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