Browse Source

Pass along progress function for pack writing progress.

Jelmer Vernooij 7 years ago
parent
commit
3b2fd70b2b
3 changed files with 18 additions and 11 deletions
  1. 10 8
      dulwich/object_store.py
  2. 7 2
      dulwich/pack.py
  3. 1 1
      dulwich/repo.py

+ 10 - 8
dulwich/object_store.py

@@ -129,14 +129,14 @@ class BaseObjectStore(object):
         """
         raise NotImplementedError(self.add_object)
 
-    def add_objects(self, objects):
+    def add_objects(self, objects, progress=None):
         """Add a set of objects to this object store.
 
         :param objects: Iterable over a list of (object, path) tuples
         """
         raise NotImplementedError(self.add_objects)
 
-    def add_pack_data(self, count, pack_data):
+    def add_pack_data(self, count, pack_data, progress=None):
         """Add pack data to this object store.
 
         :param num_items: Number of items to add
@@ -147,7 +147,7 @@ class BaseObjectStore(object):
             return
         f, commit, abort = self.add_pack()
         try:
-            write_pack_data(f, count, pack_data)
+            write_pack_data(f, count, pack_data, progress)
         except BaseException:
             abort()
             raise
@@ -460,14 +460,16 @@ class PackBasedObjectStore(BaseObjectStore):
                 pass
         raise KeyError(hexsha)
 
-    def add_objects(self, objects):
+    def add_objects(self, objects, progress=None):
         """Add a set of objects to this object store.
 
         :param objects: Iterable over (object, path) tuples, should support
             __len__.
         :return: Pack object of the objects written.
         """
-        return self.add_pack_data(*pack_objects_to_data(objects))
+        return self.add_pack_data(
+                *pack_objects_to_data(objects),
+                progress=progress)
 
 
 class DiskObjectStore(PackBasedObjectStore):
@@ -838,7 +840,7 @@ class MemoryObjectStore(BaseObjectStore):
         """
         self._data[obj.id] = obj.copy()
 
-    def add_objects(self, objects):
+    def add_objects(self, objects, progress=None):
         """Add a set of objects to this object store.
 
         :param objects: Iterable over a list of (object, path) tuples
@@ -1272,10 +1274,10 @@ class OverlayObjectStore(BaseObjectStore):
             raise NotImplementedError(self.add_object)
         return self.add_store.add_object(object)
 
-    def add_objects(self, objects):
+    def add_objects(self, objects, progress=None):
         if self.add_store is None:
             raise NotImplementedError(self.add_object)
-        return self.add_store.add_objects(objects)
+        return self.add_store.add_objects(objects, progress)
 
     @property
     def packs(self):

+ 7 - 2
dulwich/pack.py

@@ -1617,19 +1617,24 @@ def write_pack_objects(f, objects, delta_window_size=None, deltify=None):
     return write_pack_data(f, pack_contents_count, pack_contents)
 
 
-def write_pack_data(f, num_records, records):
+def write_pack_data(f, num_records, records, progress=None):
     """Write a new pack data file.
 
     :param f: File to write to
     :param num_records: Number of records
     :param records: Iterator over type_num, object_id, delta_base, raw
+    :param progress: Function to report progress to
     :return: Dict mapping id -> (offset, crc32 checksum), pack checksum
     """
     # Write the pack
     entries = {}
     f = SHA1Writer(f)
     write_pack_header(f, num_records)
-    for type_num, object_id, delta_base, raw in records:
+    for i, (type_num, object_id, delta_base, raw) in enumerate(records):
+        if progress is not None:
+            progress((
+                'writing pack data: %d/%d\r' %
+                (i, num_records)).encode('ascii'))
         offset = f.offset()
         if delta_base is not None:
             try:

+ 1 - 1
dulwich/repo.py

@@ -269,7 +269,7 @@ class BaseRepo(object):
             determine_wants = target.object_store.determine_wants_all
         target.object_store.add_objects(
             self.fetch_objects(determine_wants, target.get_graph_walker(),
-                               progress))
+                               progress), progress=progress)
         return self.get_refs()
 
     def fetch_objects(self, determine_wants, graph_walker, progress,