Abstract away magic in moving pack files into place.
authorJelmer Vernooij <jelmer@samba.org>
Wed, 24 Dec 2008 21:00:27 +0000 (21:00 +0000)
committerJelmer Vernooij <jelmer@samba.org>
Wed, 24 Dec 2008 21:00:27 +0000 (21:00 +0000)
bin/dul-fetch-pack
dulwich/pack.py
dulwich/repo.py

index e4eabf88d6a05f97bdf601d81f8d25b6e7d77c4b..ec882ba0fcec5a0b8962f1fb0d81009d912b4f61 100755 (executable)
@@ -36,8 +36,9 @@ r = Repo(".")
 # FIXME: Will just fetch everything..
 graphwalker = SimpleFetchGraphWalker([], None)
 
-f = r.add_pack()
+f, commit = r.add_pack()
 try:
        client.fetch_pack(path, determine_wants, graphwalker, f.write, sys.stdout.write)
 finally:
        f.close()
+       commit()
index 81c7aa0dd4df009e386ac99af51dba3e2215ceb0..6d4cbbd39026f3e197cf0981cbf808744551cbeb 100644 (file)
@@ -74,6 +74,13 @@ def read_zlib(data, offset, dec_size):
     return x, comp_len
 
 
+def iter_sha1(iter):
+    sha = hashlib.sha1()
+    for name in iter:
+        sha.update(name)
+    return sha.hexdigest()
+
+
 def hex_to_sha(hex):
   """Convert a hex string to a binary sha string."""
   ret = ""
@@ -249,10 +256,7 @@ class PackIndex(object):
         yield self._unpack_name(i)
 
   def objects_sha1(self):
-    sha = hashlib.sha1()
-    for name in self._itersha():
-        sha.update(name)
-    return sha.hexdigest()
+    return iter_sha1(self._itersha())
 
   def iterentries(self):
     """Iterate over the entries in this pack index.
@@ -415,16 +419,17 @@ class PackData(object):
         found[sha] = (type, obj)
         yield sha, offset, shafile.crc32()
 
+  def sorted_entries(self):
+    ret = list(self.iterentries())
+    ret.sort()
+    return ret
+
   def create_index_v1(self, filename):
-    entries = list(self.iterentries())
-    # Sort entries first
-    entries = sorted(entries)
+    entries = self.sorted_entries()
     write_pack_index_v1(filename, entries, self.calculate_checksum())
 
   def create_index_v2(self, filename):
-    entries = list(self.iterentries())
-    # Sort entries first
-    entries = sorted(entries)
+    entries = self.sorted_entries()
     write_pack_index_v2(filename, entries, self.calculate_checksum())
 
   def get_stored_checksum(self):
index 080de79d745f5016be201714b4052f80511b120b..125de877b55f58ddef09e2e5d4560d11d5db5724 100644 (file)
@@ -26,7 +26,7 @@ from objects import (ShaFile,
                      Tree,
                      Blob,
                      )
-from pack import load_packs
+from pack import load_packs, iter_sha1, PackData, write_pack_index_v2
 import tempfile
 
 OBJECTDIR = 'objects'
@@ -67,8 +67,18 @@ class Repo(object):
     return os.path.join(self.object_dir(), PACKDIR)
 
   def add_pack(self):
-    fd, name = tempfile.mkstemp(suffix='.pack', prefix='', dir=self.pack_dir()) 
-    return os.fdopen(fd, 'w')
+    fd, path = tempfile.mkstemp(dir=self.pack_dir(), suffix=".pack")
+    f = os.fdopen(fd, 'w')
+    def commit():
+       self._move_in_pack(path)
+    return f, commit
+
+  def _move_in_pack(self, path):
+    p = PackData(path)
+    entries = p.sorted_entries()
+    basename = os.path.join(self.pack_dir(), "pack-%s" % iter_sha1(entry[0] for entry in entries))
+    write_pack_index_v2(basename+".idx", entries, p.calculate_checksum())
+    os.rename(path, basename + ".pack")
 
   def _get_packs(self):
     if self._packs is None: