Quellcode durchsuchen

Add some tests for merge base and merge.

Jelmer Vernooij vor 4 Jahren
Ursprung
Commit
1d7b2dbde9
2 geänderte Dateien mit 30 neuen und 4 gelöschten Zeilen
  1. 5 3
      dulwich/merge.py
  2. 25 1
      dulwich/tests/test_merge.py

+ 5 - 3
dulwich/merge.py

@@ -190,13 +190,13 @@ def merge(repo, commit_ids, rename_detector=None, file_merger=None):
     """Perform a merge.
     """
     conflicts = []
-    merge_base = find_merge_base(repo, commit_ids)
+    merge_base = find_merge_base(repo, [repo.head()] + commit_ids)
     [other_id] = commit_ids
     index = repo.open_index()
-    this_id = index.commit(repo.object_store)
+    this_tree = index.commit(repo.object_store)
     for entry in merge_tree(
             repo.object_store,
-            repo.object_store[this_id].tree,
+            this_tree,
             repo.object_store[other_id].tree,
             repo.object_store[merge_base].tree,
             rename_detector=rename_detector,
@@ -205,4 +205,6 @@ def merge(repo, commit_ids, rename_detector=None, file_merger=None):
         if isinstance(entry, MergeConflict):
             conflicts.append(entry)
 
+        # TODO(jelmer): apply the change to the tree
+
     return conflicts

+ 25 - 1
dulwich/tests/test_merge.py

@@ -27,6 +27,7 @@ import shutil
 import tempfile
 
 from dulwich.tests import TestCase
+from dulwich.tests.utils import build_commit_graph
 
 from dulwich.merge import merge, find_merge_base
 from dulwich.repo import Repo
@@ -57,5 +58,28 @@ class MergeTests(TestCase):
         cid1 = self._add_file(self.repo1, 'b')
         cid2 = self._add_file(self.repo2, 'c')
         self.repo2.fetch(self.repo1)
+        self.assertEqual(cid1, self.repo1.head())
+        conflicts = merge(self.repo1, [cid2])
+        self.assertEqual([], conflicts)
+
+
+class FindMergeBaseTests(TestCase):
+
+    def setUp(self):
+        super(FindMergeBaseTests, self).setUp()
+        self.test_dir = tempfile.mkdtemp()
+        self.addCleanup(shutil.rmtree, self.test_dir)
+        self.repo = Repo.init(self.test_dir)
+        self.addCleanup(self.repo.close)
+
+    def test_both_adds(self):
+        c1, c2, c3 = build_commit_graph(
+                self.repo.object_store, [[1], [2, 1], [3, 1]])
+        self.assertEqual(
+            c1.id, find_merge_base(self.repo.object_store, [c2.id, c3.id]))
+
+    def test_fast_forward(self):
+        c1, c2, c3 = build_commit_graph(
+                self.repo.object_store, [[1], [2, 1], [3, 2]])
         self.assertEqual(
-            self.common_cid, find_merge_base(self.repo1, [cid1, cid2]))
+            c2.id, find_merge_base(self.repo.object_store, [c2.id, c3.id]))