summaryrefslogtreecommitdiff
path: root/bzrlib/tests/test_commit_merge.py
diff options
context:
space:
mode:
Diffstat (limited to 'bzrlib/tests/test_commit_merge.py')
-rw-r--r--bzrlib/tests/test_commit_merge.py121
1 files changed, 121 insertions, 0 deletions
diff --git a/bzrlib/tests/test_commit_merge.py b/bzrlib/tests/test_commit_merge.py
new file mode 100644
index 0000000..4c85741
--- /dev/null
+++ b/bzrlib/tests/test_commit_merge.py
@@ -0,0 +1,121 @@
+# Copyright (C) 2005, 2006, 2007, 2009, 2011 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+import os
+
+from bzrlib import (
+ check,
+ osutils,
+ )
+from bzrlib.errors import PointlessCommit
+from bzrlib.tests import (
+ TestCaseWithTransport,
+ )
+from bzrlib.tests.features import (
+ SymlinkFeature,
+ )
+from bzrlib.tests.matchers import RevisionHistoryMatches
+
+
+class TestCommitMerge(TestCaseWithTransport):
+ """Tests for committing the results of a merge.
+
+ These don't currently test the merge code, which is intentional to
+ reduce the scope of testing. We just mark the revision as merged
+ without bothering about the contents much."""
+
+ def test_merge_commit_empty(self):
+ """Simple commit of two-way merge of empty trees."""
+ wtx = self.make_branch_and_tree('x')
+ base_rev = wtx.commit('common parent')
+ bx = wtx.branch
+ wty = wtx.bzrdir.sprout('y').open_workingtree()
+ by = wty.branch
+
+ wtx.commit('commit one', rev_id='x@u-0-1', allow_pointless=True)
+ wty.commit('commit two', rev_id='y@u-0-1', allow_pointless=True)
+
+ by.fetch(bx)
+ # just having the history there does nothing
+ self.assertRaises(PointlessCommit,
+ wty.commit,
+ 'no changes yet', rev_id='y@u-0-2',
+ allow_pointless=False)
+ wty.merge_from_branch(bx)
+ wty.commit('merge from x', rev_id='y@u-0-2', allow_pointless=False)
+
+ self.assertEquals(by.revno(), 3)
+ graph = wty.branch.repository.get_graph()
+ self.addCleanup(wty.lock_read().unlock)
+ self.assertThat(by,
+ RevisionHistoryMatches([base_rev, 'y@u-0-1', 'y@u-0-2'])
+ )
+ rev = by.repository.get_revision('y@u-0-2')
+ self.assertEquals(rev.parent_ids,
+ ['y@u-0-1', 'x@u-0-1'])
+
+ def test_merge_new_file(self):
+ """Commit merge of two trees with no overlapping files."""
+ wtx = self.make_branch_and_tree('x')
+ base_rev = wtx.commit('common parent')
+ bx = wtx.branch
+ wtx.commit('establish root id')
+ wty = wtx.bzrdir.sprout('y').open_workingtree()
+ self.assertEqual(wtx.get_root_id(), wty.get_root_id())
+ by = wty.branch
+
+ self.build_tree(['x/ecks', 'y/why'])
+
+ wtx.add(['ecks'], ['ecks-id'])
+ wty.add(['why'], ['why-id'])
+
+ wtx.commit('commit one', rev_id='x@u-0-1', allow_pointless=True)
+ wty.commit('commit two', rev_id='y@u-0-1', allow_pointless=True)
+
+ wty.merge_from_branch(bx)
+
+ # partial commit of merges is currently not allowed, because
+ # it would give different merge graphs for each file which
+ # might be complex. it can be allowed in the future.
+ self.assertRaises(Exception,
+ wty.commit,
+ 'partial commit', allow_pointless=False,
+ specific_files=['ecks'])
+
+ wty.commit('merge from x', rev_id='y@u-0-2', allow_pointless=False)
+ tree = by.repository.revision_tree('y@u-0-2')
+ self.assertEquals(tree.get_file_revision('ecks-id'), 'x@u-0-1')
+ self.assertEquals(tree.get_file_revision('why-id'), 'y@u-0-1')
+
+ check.check_dwim(bx.base, False, True, True)
+ check.check_dwim(by.base, False, True, True)
+
+ def test_merge_with_symlink(self):
+ self.requireFeature(SymlinkFeature)
+ tree_a = self.make_branch_and_tree('tree_a')
+ os.symlink('target', osutils.pathjoin('tree_a', 'link'))
+ tree_a.add('link')
+ tree_a.commit('added link')
+ tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
+ self.build_tree(['tree_a/file'])
+ tree_a.add('file')
+ tree_a.commit('added file')
+ self.build_tree(['tree_b/another_file'])
+ tree_b.add('another_file')
+ tree_b.commit('add another file')
+ tree_b.merge_from_branch(tree_a.branch)
+ tree_b.commit('merge')