Implement PackData.check().
authorJelmer Vernooij <jelmer@samba.org>
Thu, 11 Dec 2008 10:38:53 +0000 (10:38 +0000)
committerJelmer Vernooij <jelmer@samba.org>
Thu, 11 Dec 2008 10:38:53 +0000 (10:38 +0000)
dulwich/pack.py
dulwich/tests/test_pack.py

index 74ef8749469cb48e83b8f467e7a32bb3233233b8..1e77925de595e44bb4d423af18d0355b215ab222 100644 (file)
@@ -280,6 +280,8 @@ class PackData(object):
     f = open(self._filename, 'rb')
     try:
         header = f.read(12)
+        f.seek(self._size-20)
+        self._stored_checksum = f.read(20)
     finally:
         f.close()
     assert header[:4] == "PACK"
@@ -291,6 +293,17 @@ class PackData(object):
       """Returns the number of objects in this pack."""
       return self._num_objects
 
+  def calculate_checksum(self):
+    f = open(self._filename, 'rb')
+    try:
+        map = simple_mmap(f, 0, self._size)
+        return hashlib.sha1(map[:-20]).digest()
+    finally:
+        f.close()
+
+  def check(self):
+    return (self.calculate_checksum() == self._stored_checksum)
+
   def get_object_at(self, offset):
     """Given an offset in to the packfile return the object that is there.
 
@@ -334,7 +347,7 @@ class PackData(object):
     return obj
 
 
-class SHA1Writer(f):
+class SHA1Writer(object):
     
     def __init__(self, f):
         self.f = f
index ce57d42d008171ee3f973269b99ebfc4c6312e08..af1ea3ac4f686ced309cd4a8c7211eebd33511b9 100644 (file)
@@ -95,10 +95,14 @@ class TestPackData(PackTests):
     self.assertEquals("\xf2\x84\x8e*\xd1o2\x9a\xe1\xc9.;\x95\xe9\x18\x88\xda\xa5\xbd\x01", str(p.get_stored_checksums()[1]))
     self.assertEquals( 'r\x19\x80\xe8f\xaf\x9a_\x93\xadgAD\xe1E\x9b\x8b\xa3\xe7\xb7' , str(p.get_stored_checksums()[0]))
 
-  def test_check(self):
+  def test_index_check(self):
     p = self.get_pack_index(pack1_sha)
     self.assertEquals(True, p.check())
 
+  def test_index_check(self):
+    p = self.get_pack_data(pack1_sha)
+    self.assertEquals(True, p.check())
+
   def test_iterentries(self):
     p = self.get_pack_index(pack1_sha)
     self.assertEquals([('og\x0c\x0f\xb5?\x94cv\x0br\x95\xfb\xb8\x14\xe9e\xfb \xc8', 178, None), ('\xb2\xa2vj(y\xc2\t\xab\x11v\xe7\xe7x\xb8\x1a\xe4"\xee\xaa', 138, None), ('\xf1\x8f\xaa\x16S\x1a\xc5p\xa3\xfd\xc8\xc7\xca\x16h%H\xda\xfd\x12', 12, None)], list(p.iterentries()))