← Back to team overview

dulwich-users team mailing list archive

[PATCH 11/33] pack: Expose which refs were external in DeltaChainIterator.

 

From: Dave Borowitz <dborowitz@xxxxxxxxxx>

Change-Id: Iaa6e8e5ca30cfca2c6901060a5ebcd0d1f5badff
---
 dulwich/pack.py            |    5 +++++
 dulwich/tests/test_pack.py |   17 +++++++++++++----
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/dulwich/pack.py b/dulwich/pack.py
index a773751..99fff66 100644
--- a/dulwich/pack.py
+++ b/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."""
diff --git a/dulwich/tests/test_pack.py b/dulwich/tests/test_pack.py
index 573b39f..5b2c879 100644
--- a/dulwich/tests/test_pack.py
+++ b/dulwich/tests/test_pack.py
@@ -791,7 +791,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'])
@@ -799,7 +801,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'])
@@ -807,7 +811,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'])
@@ -815,7 +821,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'])
-- 
1.7.3.1



References