Add functions for checking checksums of index files.
authorJelmer Vernooij <jelmer@samba.org>
Thu, 11 Dec 2008 08:32:05 +0000 (08:32 +0000)
committerJelmer Vernooij <jelmer@samba.org>
Thu, 11 Dec 2008 08:32:05 +0000 (08:32 +0000)
dulwich/pack.py
dulwich/tests/test_pack.py

index 84ce8298ec6ed9454ea498e1bbda8a0fd8633619..6a8b36130b5ae8931c2c980333aac5b2ecb7caad 100644 (file)
@@ -33,6 +33,7 @@ match for the object name. You then use the pointer got from this as
 a pointer in to the corresponding packfile.
 """
 
+import hashlib
 import mmap
 import os
 import struct
@@ -71,6 +72,9 @@ def simple_mmap(f, offset, size, access=mmap.ACCESS_READ):
             def __len__(self):
                 return len(self.array) - self.offset
 
+            def __str__(self):
+                return str(self.array[self.offset:])
+
         mem = mmap.mmap(f.fileno(), size+offset, access=access)
         if offset == 0:
             return mem
@@ -133,11 +137,23 @@ class PackIndex(object):
         (ret[i],) = struct.unpack(">L", contents[i*4:(i+1)*4])
     return ret
 
-  def file_sha1(self):
-    """Return the SHA1 file stored for this header file itself."""
+  def check(self):
+    """Check that the stored checksum matches the actual checksum."""
+    return self.get_checksum() == self.get_stored_checksum()
+
+  def get_checksum(self):
+    f = open(self._filename, 'r')
+    try:
+        contents = simple_mmap(f, 0, self._size-20)
+        return hashlib.sha1(contents).digest()
+    finally:
+        f.close()
+
+  def get_stored_checksum(self):
+    """Return the SHA1 checksum stored for this header file itself."""
     f = open(self._filename, 'r')
     try:
-        return simple_mmap(f, self._size-20, 20)
+        return str(simple_mmap(f, self._size-20, 20))
     finally:
         f.close()
 
@@ -252,7 +268,7 @@ class PackData(object):
          "like that" % self._filename
     f = open(self._filename, 'rb')
     try:
-      map = simple_mmap(f, offset, size)
+      map = simple_mmap(f, offset, size-offset)
       return self._get_object_at(map)
     finally:
       f.close()
index 2f5ae0893dbc4f6ec933cd4bb88e40912e831693..cfe4eedc28aef1ccca9769cdfc058547b7c6cccb 100644 (file)
@@ -87,9 +87,13 @@ class TestPackData(PackTests):
     p = self.get_pack_index(pack1_sha)
     self.assertEquals(3, len(p))
 
-  def test_file_sha1(self):
+  def test_get_stored_checksum(self):
     p = self.get_pack_index(pack1_sha)
-    self.assertEquals("bla", p.file_sha1())
+    self.assertEquals("\xf2\x84\x8e*\xd1o2\x9a\xe1\xc9.;\x95\xe9\x18\x88\xda\xa5\xbd\x01", str(p.get_stored_checksum()))
+
+  def test_check(self):
+    p = self.get_pack_index(pack1_sha)
+    self.assertEquals(True, p.check())
 
 
 class TestHexToSha(unittest.TestCase):