2
0
Эх сурвалжийг харах

More commit_tree tests and fixes.

Jelmer Vernooij 16 жил өмнө
parent
commit
5116767933

+ 10 - 9
dulwich/index.py

@@ -219,6 +219,7 @@ def commit_tree(object_store, blobs):
         assert isinstance(basename, str)
         newtree = {}
         t[basename] = newtree
+        trees[path] = newtree
         return newtree
 
     for path, sha, mode in blobs:
@@ -226,18 +227,18 @@ def commit_tree(object_store, blobs):
         tree = add_tree(tree_path)
         tree[basename] = (mode, sha)
 
-    for path in sorted(trees.keys(), reverse=True):
+    def build_tree(path):
         tree = Tree()
-        for basename, (mode, sha) in trees[path].iteritems():
+        for basename, entry in trees[path].iteritems():
+            if type(entry) == dict:
+                mode = stat.S_IFDIR
+                sha = build_tree(os.path.join(path, basename))
+            else:
+                (mode, sha) = entry
             tree.add(mode, basename, sha)
         object_store.add_object(tree)
-        if path != "":
-            # Add to object store
-            parent_path, basename = os.path.split(path)
-            # Update sha in parent
-            trees[parent_path][basename] = (stat.S_IFDIR, tree.id)
-        else:
-            return tree.id
+        return tree.id
+    return build_tree("")
 
 
 def commit_index(object_store, index):

+ 15 - 1
dulwich/tests/test_index.py

@@ -84,5 +84,19 @@ class CommitTreeTests(TestCase):
         blobs = [("bla", blob.id, stat.S_IFREG)]
         rootid = commit_tree(self.store, blobs)
         self.assertEquals(rootid, "1a1e80437220f9312e855c37ac4398b68e5c1d50")
-        self.assertEquals(blob.id, self.store[rootid]["bla"][1])
+        self.assertEquals((stat.S_IFREG, blob.id), self.store[rootid]["bla"])
         self.assertEquals(set([rootid, blob.id]), set(self.store._data.keys()))
+
+    def test_nested(self):
+        blob = Blob()
+        blob.data = "foo"
+        self.store.add_object(blob)
+        blobs = [("bla/bar", blob.id, stat.S_IFREG)]
+        rootid = commit_tree(self.store, blobs)
+        self.assertEquals(rootid, "d92b959b216ad0d044671981196781b3258fa537")
+        dirid = self.store[rootid]["bla"][1]
+        self.assertEquals(dirid, "c1a1deb9788150829579a8b4efa6311e7b638650")
+        self.assertEquals((stat.S_IFDIR, dirid), self.store[rootid]["bla"])
+        self.assertEquals((stat.S_IFREG, blob.id), self.store[dirid]["bar"])
+        self.assertEquals(set([rootid, dirid, blob.id]), 
+                          set(self.store._data.keys()))