Explorar o código

pack: Expose which refs were external in DeltaChainIterator.

Change-Id: Iaa6e8e5ca30cfca2c6901060a5ebcd0d1f5badff
Dave Borowitz %!s(int64=13) %!d(string=hai) anos
pai
achega
288a078251
Modificáronse 2 ficheiros con 18 adicións e 4 borrados
  1. 5 0
      dulwich/pack.py
  2. 13 4
      dulwich/tests/test_pack.py

+ 5 - 0
dulwich/pack.py

@@ -1081,6 +1081,7 @@ class DeltaChainIterator(object):
         self._pending_ref = defaultdict(list)
         self._full_ofs = []
         self._shas = {}
+        self._ext_refs = []
 
     @classmethod
     def for_pack_data(cls, pack_data):
@@ -1131,6 +1132,7 @@ class DeltaChainIterator(object):
                 # popped via a _follow_chain call, or we will raise an error
                 # below.
                 continue
+            self._ext_refs.append(base_sha)
             self._pending_ref.pop(base_sha)
             for new_offset in pending:
                 for result in self._follow_chain(new_offset, type_num, chunks):
@@ -1171,6 +1173,9 @@ class DeltaChainIterator(object):
     def __iter__(self):
         return self._walk_all_chains()
 
+    def ext_refs(self):
+        return self._ext_refs
+
 
 class PackIndexer(DeltaChainIterator):
     """Delta chain iterator that yields index entries."""

+ 13 - 4
dulwich/tests/test_pack.py

@@ -788,7 +788,9 @@ class DeltaChainIteratorTests(TestCase):
     def test_ext_ref(self):
         blob, = self.store_blobs(['blob'])
         f, entries = self.write_pack_data([(REF_DELTA, (blob.id, 'blob1'))])
-        self.assertEntriesMatch([0], entries, self.make_pack_iter(f))
+        pack_iter = self.make_pack_iter(f)
+        self.assertEntriesMatch([0], entries, pack_iter)
+        self.assertEqual([hex_to_sha(blob.id)], pack_iter.ext_refs())
 
     def test_ext_ref_chain(self):
         blob, = self.store_blobs(['blob'])
@@ -796,7 +798,9 @@ class DeltaChainIteratorTests(TestCase):
           (REF_DELTA, (1, 'blob2')),
           (REF_DELTA, (blob.id, 'blob1')),
           ])
-        self.assertEntriesMatch([1, 0], entries, self.make_pack_iter(f))
+        pack_iter = self.make_pack_iter(f)
+        self.assertEntriesMatch([1, 0], entries, pack_iter)
+        self.assertEqual([hex_to_sha(blob.id)], pack_iter.ext_refs())
 
     def test_ext_ref_multiple_times(self):
         blob, = self.store_blobs(['blob'])
@@ -804,7 +808,9 @@ class DeltaChainIteratorTests(TestCase):
           (REF_DELTA, (blob.id, 'blob1')),
           (REF_DELTA, (blob.id, 'blob2')),
           ])
-        self.assertEntriesMatch([0, 1], entries, self.make_pack_iter(f))
+        pack_iter = self.make_pack_iter(f)
+        self.assertEntriesMatch([0, 1], entries, pack_iter)
+        self.assertEqual([hex_to_sha(blob.id)], pack_iter.ext_refs())
 
     def test_multiple_ext_refs(self):
         b1, b2 = self.store_blobs(['foo', 'bar'])
@@ -812,7 +818,10 @@ class DeltaChainIteratorTests(TestCase):
           (REF_DELTA, (b1.id, 'foo1')),
           (REF_DELTA, (b2.id, 'bar2')),
           ])
-        self.assertEntriesMatch([0, 1], entries, self.make_pack_iter(f))
+        pack_iter = self.make_pack_iter(f)
+        self.assertEntriesMatch([0, 1], entries, pack_iter)
+        self.assertEqual([hex_to_sha(b1.id), hex_to_sha(b2.id)],
+                         pack_iter.ext_refs())
 
     def test_bad_ext_ref_non_thin_pack(self):
         blob, = self.store_blobs(['blob'])