Browse Source

Fix bug handling sha1s starting with 00.

Jelmer Vernooij 16 years ago
parent
commit
5eb28be8fa
2 changed files with 19 additions and 23 deletions
  1. 4 15
      bin/dumppack
  2. 15 8
      dulwich/pack.py

+ 4 - 15
bin/dumppack

@@ -18,24 +18,13 @@
 # MA  02110-1301, USA.
 
 
-from dulwich.pack import PackData, PackIndex, sha_to_hex
+from dulwich.pack import Pack, sha_to_hex
 import sys
 
 basename = sys.argv[1]
-print "Index file:"
-print "-----------"
-x = PackIndex(basename + ".idx")
+x = Pack(basename)
 if not x.check():
 	print "CHECKSUM DOES NOT MATCH"
 print "Length: %d" % len(x)
-print "Entries in index:"
-for name, offset, crc in x.iterentries():
-	print "\t%s: %d" % (sha_to_hex(name), offset)
-print ""
-
-x = PackData(basename + ".pack")
-print "Pack file:"
-print "----------"
-if not x.check():
-	print "CHECKSUM DOES NOT MATCH"
-print "Number of objects: %d" % len(x)
+for name in x:
+	print "\t%s: %s" % (name, x._idx.object_index(name))

+ 15 - 8
dulwich/pack.py

@@ -230,17 +230,21 @@ class PackIndex(object):
 
   def _object_index(self, sha):
       """See object_index"""
-      start = self._fan_out_table[ord(sha[0])-1]
-      end = self._fan_out_table[ord(sha[0])]
+      idx = ord(sha[0])
+      if idx == 0:
+          start = 0
+      else:
+          start = self._fan_out_table[idx-1]
+      end = self._fan_out_table[idx]
       while start < end:
         i = (start + end)/2
         file_sha = self._unpack_name(i)
-        if file_sha == sha:
-          return self._unpack_offset(i)
-        elif file_sha < sha:
+        if file_sha < sha:
           start = i + 1
-        else:
+        elif file_sha > sha:
           end = i - 1
+        else:
+          return self._unpack_offset(i)
       return None
 
 
@@ -322,7 +326,7 @@ class PackData(object):
 
     Currently only non-delta objects are supported.
     """
-    assert isinstance(offset, long) or isinstance(offset, int)
+    assert isinstance(offset, long) or isinstance(offset, int), "offset was %r" % offset
     size = os.path.getsize(self._filename)
     assert size == self._size, "Pack data %s has changed size, I don't " \
          "like that" % self._filename
@@ -477,4 +481,7 @@ class Pack(object):
         return (self._idx.object_index(sha1) is not None)
 
     def __getitem__(self, sha1):
-        return self._pack.get_object_at(self._idx.object_index(sha1))
+        offset = self._idx.object_index(sha1)
+        if offset is None:
+            raise KeyError(sha1)
+        return self._pack.get_object_at(offset)