Rev 4682: Handle pending merges as uncommitted changes in http://bazaar.launchpad.net/~vila/bzr/integration

Vincent Ladeuil v.ladeuil+lp at free.fr
Wed Sep 9 16:44:05 BST 2009


At http://bazaar.launchpad.net/~vila/bzr/integration

------------------------------------------------------------
revno: 4682 [merge]
revision-id: v.ladeuil+lp at free.fr-20090909154352-zmyiya46nukx3vu7
parent: pqm at pqm.ubuntu.com-20090909151627-572a71uyxs8evrex
parent: v.ladeuil+lp at free.fr-20090908164640-v4lp3ssa2u2niudt
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: integration
timestamp: Wed 2009-09-09 17:43:52 +0200
message:
  Handle pending merges as uncommitted changes
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
  bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
  bzrlib/tests/blackbox/test_remove_tree.py test_remove_tree.py-20061110192919-5j3xjciiaqbs2dvo-1
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS	2009-09-09 13:05:33 +0000
+++ b/NEWS	2009-09-09 15:43:52 +0000
@@ -37,6 +37,10 @@
 * ``bzr info -v`` on a 2a format still claimed that it was a "Development
   format" (John Arbash Meinel, #424392)
 
+* ``bzr merge`` and ``bzr remove-tree`` now requires --force if pending
+  merges are present in the working tree.
+  (Vincent Ladeuil, #426344)
+
 * Clearer message when Bazaar runs out of memory, instead of a ``MemoryError``
   traceback.  (Martin Pool, #109115)
 

=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2009-08-28 05:00:33 +0000
+++ b/bzrlib/builtins.py	2009-09-08 16:45:11 +0000
@@ -461,8 +461,8 @@
             raise errors.BzrCommandError("You cannot remove the working tree"
                                          " of a remote path")
         if not force:
-            # XXX: What about pending merges ? -- vila 20090629
-            if working.has_changes(working.basis_tree()):
+            if (working.has_changes(working.basis_tree())
+                or len(working.get_parent_ids()) > 1):
                 raise errors.UncommittedChanges(working)
 
         working_path = working.bzrdir.root_transport.base
@@ -3653,13 +3653,14 @@
         verified = 'inapplicable'
         tree = WorkingTree.open_containing(directory)[0]
 
-        # die as quickly as possible if there are uncommitted changes
         try:
             basis_tree = tree.revision_tree(tree.last_revision())
         except errors.NoSuchRevision:
             basis_tree = tree.basis_tree()
+
+        # die as quickly as possible if there are uncommitted changes
         if not force:
-            if tree.has_changes(basis_tree):
+            if tree.has_changes(basis_tree) or len(tree.get_parent_ids()) > 1:
                 raise errors.UncommittedChanges(tree)
 
         view_info = _get_view_info_for_change_reporter(tree)

=== modified file 'bzrlib/tests/blackbox/test_merge.py'
--- a/bzrlib/tests/blackbox/test_merge.py	2009-09-09 14:39:29 +0000
+++ b/bzrlib/tests/blackbox/test_merge.py	2009-09-09 15:43:52 +0000
@@ -25,6 +25,7 @@
     branch,
     bzrdir,
     conflicts,
+    errors,
     merge_directive,
     osutils,
     tests,
@@ -591,16 +592,29 @@
 
 class TestMergeForce(tests.TestCaseWithTransport):
 
-    def test_merge_force(self):
-        tree_a = self.make_branch_and_tree('a')
+    def setUp(self):
+        super(TestMergeForce, self).setUp()
+        self.tree_a = self.make_branch_and_tree('a')
         self.build_tree(['a/foo'])
-        tree_a.add(['foo'])
-        tree_a.commit('add file')
-        tree_b = tree_a.bzrdir.sprout('b').open_workingtree()
+        self.tree_a.add(['foo'])
+        self.tree_a.commit('add file')
+        self.tree_b = self.tree_a.bzrdir.sprout('b').open_workingtree()
         self.build_tree_contents([('a/foo', 'change 1')])
-        tree_a.commit('change file')
-        tree_b.merge_from_branch(tree_a.branch)
-        tree_a.commit('empty change to allow merge to run')
+        self.tree_a.commit('change file')
+        self.tree_b.merge_from_branch(self.tree_a.branch)
+
+    def test_merge_force(self):
+        self.tree_a.commit('empty change to allow merge to run')
+        # Second merge on top if the uncommitted one
         self.run_bzr(['merge', '../a', '--force'], working_dir='b')
 
 
+    def test_merge_with_uncommitted_changes(self):
+        self.run_bzr_error(['Working tree .* has uncommitted changes'],
+                           ['merge', '../a'], working_dir='b')
+
+    def test_merge_with_pending_merges(self):
+        # Revert the changes keeping the pending merge
+        self.run_bzr(['revert', 'b'])
+        self.run_bzr_error(['Working tree .* has uncommitted changes'],
+                           ['merge', '../a'], working_dir='b')

=== modified file 'bzrlib/tests/blackbox/test_remove_tree.py'
--- a/bzrlib/tests/blackbox/test_remove_tree.py	2009-03-23 14:59:43 +0000
+++ b/bzrlib/tests/blackbox/test_remove_tree.py	2009-09-08 16:45:11 +0000
@@ -122,3 +122,30 @@
         self.run_bzr('remove-tree branch1 --force')
         self.failIfExists('branch1/foo')
         self.failUnlessExists('branch1/bar')
+
+    def test_remove_tree_pending_merges(self):
+        self.run_bzr(['branch', 'branch1', 'branch2'])
+        self.build_tree(['branch1/bar'])
+        self.tree.add('bar')
+        self.tree.commit('2')
+        self.failUnlessExists('branch1/bar')
+        self.run_bzr(['merge', '../branch1'], working_dir='branch2')
+        self.failUnlessExists('branch2/bar')
+        self.run_bzr(['revert', '.'], working_dir='branch2')
+        self.failIfExists('branch2/bar')
+        output = self.run_bzr_error(["Working tree .* has uncommitted changes"],
+                                    'remove-tree branch2', retcode=3)
+
+    def test_remove_tree_pending_merges_force(self):
+        self.run_bzr(['branch', 'branch1', 'branch2'])
+        self.build_tree(['branch1/bar'])
+        self.tree.add('bar')
+        self.tree.commit('2')
+        self.failUnlessExists('branch1/bar')
+        self.run_bzr(['merge', '../branch1'], working_dir='branch2')
+        self.failUnlessExists('branch2/bar')
+        self.run_bzr(['revert', '.'], working_dir='branch2')
+        self.failIfExists('branch2/bar')
+        self.run_bzr('remove-tree branch2 --force')
+        self.failIfExists('branch2/foo')
+        self.failIfExists('branch2/bar')



More information about the bazaar-commits mailing list