소스 검색

Don't require mentioned objects to be commits.

Jelmer Vernooij 16 년 전
부모
커밋
c9780079f4
1개의 변경된 파일19개의 추가작업 그리고 17개의 파일을 삭제
  1. 19 17
      dulwich/repo.py

+ 19 - 17
dulwich/repo.py

@@ -100,6 +100,21 @@ class Repo(object):
     wants = determine_wants(self.get_refs())
     commits_to_send = set(wants)
     sha_done = set()
+
+    def parse_tree(tree, sha_done):
+        for mode, name, sha in tree.entries():
+            if (sha, name) in sha_done:
+                continue
+            if mode & stat.S_IFDIR:
+                parse_tree(self.tree(sha), sha_done)
+            sha_done.add((sha, name))
+
+    def parse_commit(commit, sha_done):
+        treesha = c.tree
+        if c.tree not in sha_done:
+            parse_tree(self.tree(c.tree), sha_done)
+            sha_done.add((c.tree, None))
+
     ref = graph_walker.next()
     while ref:
         if ref in self.object_store:
@@ -110,25 +125,12 @@ class Repo(object):
         if (sha, None) in sha_done:
             continue
 
-        c = self.commit(sha)
-        assert isinstance(c, Commit)
+        c = self.object_store[sha]
+        if isinstance(c, Commit):
+            parse_commit(c, sha_done)
+            commits_to_send.update([p for p in c.parents if not p in sha_done])
         sha_done.add((sha, None))
 
-        commits_to_send.update([p for p in c.parents if not p in sha_done])
-
-        def parse_tree(tree, sha_done):
-            for mode, name, sha in tree.entries():
-                if (sha, name) in sha_done:
-                    continue
-                if mode & stat.S_IFDIR:
-                    parse_tree(self.tree(sha), sha_done)
-                sha_done.add((sha, name))
-
-        treesha = c.tree
-        if c.tree not in sha_done:
-            parse_tree(self.tree(c.tree), sha_done)
-            sha_done.add((c.tree, None))
-
         progress("counting objects: %d\r" % len(sha_done))
     return sha_done