Bläddra i källkod

Reuse ChunkPackGenerator.

Jelmer Vernooij 2 år sedan
förälder
incheckning
1402b87b59
1 ändrade filer med 7 tillägg och 29 borttagningar
  1. 7 29
      dulwich/pack.py

+ 7 - 29
dulwich/pack.py

@@ -1762,9 +1762,9 @@ class PackChunkGenerator(object):
             crc32 = write_pack_object(f, type_num, raw, compression_level=compression_level)
             self.cs.update(f.getvalue())
             yield f.getvalue()
-            offset += f.tell()
             actual_num_records += 1
             self.entries[object_id] = (offset, crc32)
+            offset += f.tell()
         if actual_num_records != num_records:
             raise AssertionError(
                 'actual records written differs: %d != %d' % (
@@ -1784,34 +1784,12 @@ def write_pack_data(f, num_records=None, records=None, progress=None, compressio
       compression_level: the zlib compression level
     Returns: Dict mapping id -> (offset, crc32 checksum), pack checksum
     """
-    # Write the pack
-    entries = {}
-    f = SHA1Writer(f)
-    if num_records is None:
-        num_records = len(records)
-    write_pack_header(f, num_records)
-    actual_num_records = 0
-    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:
-                base_offset, base_crc32 = entries[delta_base]
-            except KeyError:
-                type_num = REF_DELTA
-                raw = (delta_base, raw)
-            else:
-                type_num = OFS_DELTA
-                raw = (offset - base_offset, raw)
-        crc32 = write_pack_object(f, type_num, raw, compression_level=compression_level)
-        actual_num_records += 1
-        entries[object_id] = (offset, crc32)
-    if actual_num_records != num_records:
-        raise AssertionError(
-            'actual records written differs: %d != %d' % (
-                actual_num_records, num_records))
-    return entries, f.write_sha()
+    chunk_generator = PackChunkGenerator(
+        num_records=num_records, records=records, progress=progress,
+        compression_level=compression_level)
+    for chunk in chunk_generator:
+        f.write(chunk)
+    return chunk_generator.entries, chunk_generator.sha1digest()
 
 
 def write_pack_index_v1(f, entries, pack_checksum):