Rev 115: Fix rebasing of merge commits. in file:///data/jelmer/bzr-rebase/trunk/

Jelmer Vernooij jelmer at samba.org
Fri Jan 16 21:17:32 GMT 2009


At file:///data/jelmer/bzr-rebase/trunk/

------------------------------------------------------------
revno: 115
revision-id: jelmer at samba.org-20090116211731-rewnlk06mzzyq1b4
parent: jelmer at samba.org-20081208203251-vjastxd191b2hr13
author: Robert Collins <robertc at robertcollins.net>
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: trunk
timestamp: Fri 2009-01-16 22:17:31 +0100
message:
  Fix rebasing of merge commits.
modified:
  NEWS                           news-20070721005510-kbjm9yxqoeczq9fl-1
  rebase.py                      rebase.py-20070626221123-ellanmf93nw8z9r1-1
  test_blackbox.py               test_blackbox.py-20070709202607-dyvt95dfu09tuv6a-1
=== modified file 'NEWS'
--- a/NEWS	2008-11-18 00:23:44 +0000
+++ b/NEWS	2009-01-16 21:17:31 +0000
@@ -1,5 +1,10 @@
 0.4.3	UNRELEASED
 
+ BUG FIXES
+
+  * rebasing of merges was discarding the merged parents.
+    (Robert Collins, #266897)
+
 0.4.2	2008-11-18
 
  FEATURES

=== modified file 'rebase.py'
--- a/rebase.py	2008-08-31 20:30:21 +0000
+++ b/rebase.py	2009-01-16 21:17:31 +0000
@@ -178,7 +178,7 @@
         if len(oldparents) > 1:
             additional_parents = heads_cache.heads(oldparents[1:])
             parents = [new_parent]
-            for parent in parents:
+            for parent in oldparents:
                 if parent in additional_parents and parent not in parents:
                     # Use as a parent
                     parent = replace_map.get(parent, (parent,))[0]

=== modified file 'test_blackbox.py'
--- a/test_blackbox.py	2008-09-01 17:51:22 +0000
+++ b/test_blackbox.py	2009-01-16 21:17:31 +0000
@@ -237,27 +237,48 @@
         self.run_bzr('commit -m merge')
         self.run_bzr('rebase')
 
-class ReplayTests(ExternalBase):
-    def test_replay(self):
-        os.mkdir('main')
-        os.chdir('main')
-        self.run_bzr('init')
-        open('bar', 'w').write('42')
-        self.run_bzr('add')
-        self.run_bzr('commit -m that')
-        os.mkdir('../feature')
-        os.chdir('../feature')
-        self.run_bzr('init')
-        branch = Branch.open('.')
-        open('hello', 'w').write("my data")
-        self.run_bzr('add')
-        self.run_bzr('commit -m this')
-        self.assertEquals(1, len(branch.revision_history()))
-        self.run_bzr('replay -r1 ../main')
-        self.assertEquals(2, len(branch.revision_history()))
-        self.assertTrue(os.path.exists('bar'))
+    def test_always_rebase_merges(self):
+        trunk = self.make_branch_and_tree('trunk')
+        trunk.commit('base')
+        feature2 = trunk.bzrdir.sprout('feature2').open_workingtree()
+        revid2 = feature2.commit('change')
+        feature = trunk.bzrdir.sprout('feature').open_workingtree()
+        feature.commit('change')
+        feature.merge_from_branch(feature2.branch)
+        feature.commit('merge')
+        feature.commit('change2')
+        trunk.commit('additional upstream change')
+        self.run_bzr('rebase --always-rebase-merges ../trunk', working_dir='feature')
+        # second revision back should be a merge of feature2
+        repo = feature.branch.repository
+        repo.lock_read()
+        self.addCleanup(repo.unlock)
+        tip = feature.last_revision()
+        merge_id = repo.get_graph().get_parent_map([tip])[tip][0]
+        merge_parents = repo.get_graph().get_parent_map([merge_id])[merge_id]
+        self.assertEqual(revid2, merge_parents[1])
+    
+    def test_rebase_merge(self):
+        trunk = self.make_branch_and_tree('trunk')
+        trunk.commit('base')
+        feature2 = trunk.bzrdir.sprout('feature2').open_workingtree()
+        revid2 = feature2.commit('change')
+        feature = trunk.bzrdir.sprout('feature').open_workingtree()
+        feature.commit('change')
+        feature.merge_from_branch(feature2.branch)
+        feature.commit('merge')
+        feature.commit('change2')
+        trunk.commit('additional upstream change')
+        self.run_bzr('rebase ../trunk', working_dir='feature')
+        # second revision back should be a merge of feature2
+        repo = feature.branch.repository
+        repo.lock_read()
+        self.addCleanup(repo.unlock)
+        tip = feature.last_revision()
+        merge_id = repo.get_graph().get_parent_map([tip])[tip][0]
+        merge_parents = repo.get_graph().get_parent_map([merge_id])[merge_id]
+        self.assertEqual(revid2, merge_parents[1])
 
-class ReplayTests(ExternalBase):
     def test_replay(self):
         os.mkdir('main')
         os.chdir('main')




More information about the bazaar-commits mailing list