← Back to team overview

dulwich-users team mailing list archive

[PATCH 13/33] server: Make PackStreamCopier optionally record delta chains.

 

From: Dave Borowitz <dborowitz@xxxxxxxxxx>

Change-Id: Iff85f1aaf145374cb58017281edc7b75f09faf70
---
 dulwich/server.py |   24 ++++++++++++++++++++----
 1 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/dulwich/server.py b/dulwich/server.py
index 99aea42..20832e8 100644
--- a/dulwich/server.py
+++ b/dulwich/server.py
@@ -125,11 +125,23 @@ class PackStreamCopier(PackStreamReader):
     appropriate and written out to the given file-like object.
     """
 
-    def __init__(self, read_all, read_some, outfile):
-        super(PackStreamCopier, self).__init__(read_all, read_some)
+    def __init__(self, read_all, read_some, outfile, delta_iter=None):
+        """Initialize the copier.
+
+        :param read_all: Read function that blocks until the number of requested
+            bytes are read.
+        :param read_some: Read function that returns at least one byte, but may
+            not return the number of bytes requested.
+        :param outfile: File-like object to write output through.
+        :param delta_iter: Optional DeltaChainIterator to record deltas as we
+            read them.
+        """
+        super(PackStreamCopier, self).__init__(read_all, read_some=read_some)
         self.outfile = outfile
+        self._delta_iter = delta_iter
 
     def _read(self, read, size):
+        """Read data from the read callback and write it to the file."""
         data = super(PackStreamCopier, self)._read(read, size)
         self.outfile.write(data)
         return data
@@ -140,8 +152,12 @@ class PackStreamCopier(PackStreamReader):
         See PackStreamReader.iterobjects for a list of exceptions this may
         throw.
         """
-        for _ in self.read_objects():
-            pass
+        if self._delta_iter:
+            for type_num, uncomp, _, _ in self.read_objects():
+                self._delta_iter.record(self.offset, type_num, uncomp)
+        else:
+            for _ in self.read_objects():
+                pass
 
 
 class DictBackend(Backend):
-- 
1.7.3.1



References