Rev 5543: Make merge correctly locate a lca where there is a criss-cross merge in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Thu Nov 18 19:09:24 GMT 2010
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 5543 [merge]
revision-id: pqm at pqm.ubuntu.com-20101118190918-33ysfcqtzq6g0mki
parent: pqm at pqm.ubuntu.com-20101118174245-gy7ufepxeycc6ypg
parent: garyvdm at gmail.com-20101118082254-fxw2ve68by9ydg86
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Thu 2010-11-18 19:09:18 +0000
message:
Make merge correctly locate a lca where there is a criss-cross merge
of a new root.
modified:
bzrlib/branchbuilder.py branchbuilder.py-20070427022007-zlxpqz2lannhk6y8-1
bzrlib/merge.py merge.py-20050513021216-953b65a438527106
bzrlib/tests/test_branchbuilder.py test_branchbuilder.p-20070427022007-zlxpqz2lannhk6y8-2
bzrlib/tests/test_merge.py testmerge.py-20050905070950-c1b5aa49ff911024
doc/en/release-notes/bzr-2.3.txt NEWS-20050323055033-4e00b5db738777ff
=== modified file 'bzrlib/branchbuilder.py'
--- a/bzrlib/branchbuilder.py 2010-02-27 12:27:33 +0000
+++ b/bzrlib/branchbuilder.py 2010-11-18 08:13:01 +0000
@@ -21,6 +21,7 @@
commit,
errors,
memorytree,
+ revision,
)
@@ -186,7 +187,10 @@
:return: The revision_id of the new commit
"""
if parent_ids is not None:
- base_id = parent_ids[0]
+ if len(parent_ids) == 0:
+ base_id = revision.NULL_REVISION
+ else:
+ base_id = parent_ids[0]
if base_id != self._branch.last_revision():
self._move_branch_pointer(base_id,
allow_leftmost_as_ghost=allow_leftmost_as_ghost)
=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py 2010-08-25 13:02:32 +0000
+++ b/bzrlib/merge.py 2010-11-18 08:22:54 +0000
@@ -582,6 +582,7 @@
elif len(lcas) == 1:
self.base_rev_id = list(lcas)[0]
else: # len(lcas) > 1
+ self._is_criss_cross = True
if len(lcas) > 2:
# find_unique_lca can only handle 2 nodes, so we have to
# start back at the beginning. It is a shame to traverse
@@ -592,22 +593,30 @@
else:
self.base_rev_id = self.revision_graph.find_unique_lca(
*lcas)
- self._is_criss_cross = True
+ sorted_lca_keys = self.revision_graph.find_merge_order(
+ revisions[0], lcas)
+ if self.base_rev_id == _mod_revision.NULL_REVISION:
+ self.base_rev_id = sorted_lca_keys[0]
+
if self.base_rev_id == _mod_revision.NULL_REVISION:
raise errors.UnrelatedBranches()
if self._is_criss_cross:
trace.warning('Warning: criss-cross merge encountered. See bzr'
' help criss-cross.')
trace.mutter('Criss-cross lcas: %r' % lcas)
- interesting_revision_ids = [self.base_rev_id]
- interesting_revision_ids.extend(lcas)
+ if self.base_rev_id in lcas:
+ trace.mutter('Unable to find unique lca. '
+ 'Fallback %r as best option.' % self.base_rev_id)
+ interesting_revision_ids = set(lcas)
+ interesting_revision_ids.add(self.base_rev_id)
interesting_trees = dict((t.get_revision_id(), t)
for t in self.this_branch.repository.revision_trees(
interesting_revision_ids))
self._cached_trees.update(interesting_trees)
- self.base_tree = interesting_trees.pop(self.base_rev_id)
- sorted_lca_keys = self.revision_graph.find_merge_order(
- revisions[0], lcas)
+ if self.base_rev_id in lcas:
+ self.base_tree = interesting_trees[self.base_rev_id]
+ else:
+ self.base_tree = interesting_trees.pop(self.base_rev_id)
self._lca_trees = [interesting_trees[key]
for key in sorted_lca_keys]
else:
=== modified file 'bzrlib/tests/test_branchbuilder.py'
--- a/bzrlib/tests/test_branchbuilder.py 2010-02-27 12:27:33 +0000
+++ b/bzrlib/tests/test_branchbuilder.py 2010-11-18 08:13:01 +0000
@@ -324,6 +324,21 @@
# should look like it was not modified in the merge
self.assertEqual('C-id', d_tree.inventory['c-id'].revision)
+ def test_set_parent_to_null(self):
+ builder = self.build_a_rev()
+ builder.start_series()
+ self.addCleanup(builder.finish_series)
+ builder.build_snapshot('B-id', [],
+ [('add', ('', None, 'directory', None))])
+ # We should now have a graph:
+ # A B
+ # And not A => B
+ repo = builder.get_branch().repository
+ self.assertEqual({'A-id': (_mod_revision.NULL_REVISION,),
+ 'B-id': (_mod_revision.NULL_REVISION,),},
+ repo.get_parent_map(['A-id', 'B-id']))
+
+
def test_start_finish_series(self):
builder = BranchBuilder(self.get_transport().clone('foo'))
builder.start_series()
=== modified file 'bzrlib/tests/test_merge.py'
--- a/bzrlib/tests/test_merge.py 2010-07-29 04:07:27 +0000
+++ b/bzrlib/tests/test_merge.py 2010-11-18 08:18:19 +0000
@@ -1270,6 +1270,26 @@
self.assertEqual(['B-id', 'C-id', 'F-id'],
[t.get_revision_id() for t in merger._lca_trees])
+ def test_find_base_new_root_criss_cross(self):
+ # A B
+ # |\ /|
+ # | X |
+ # |/ \|
+ # C D
+
+ builder = self.get_builder()
+ builder.build_snapshot('A-id', None,
+ [('add', ('', None, 'directory', None))])
+ builder.build_snapshot('B-id', [],
+ [('add', ('', None, 'directory', None))])
+ builder.build_snapshot('D-id', ['A-id', 'B-id'], [])
+ builder.build_snapshot('C-id', ['A-id', 'B-id'], [])
+ merger = self.make_Merger(builder, 'D-id')
+ self.assertEqual('A-id', merger.base_rev_id)
+ self.assertTrue(merger._is_criss_cross)
+ self.assertEqual(['A-id', 'B-id'], [t.get_revision_id()
+ for t in merger._lca_trees])
+
def test_no_criss_cross_passed_to_merge_type(self):
class LCATreesMerger(LoggingMerger):
supports_lca_trees = True
=== modified file 'doc/en/release-notes/bzr-2.3.txt'
--- a/doc/en/release-notes/bzr-2.3.txt 2010-11-18 16:55:20 +0000
+++ b/doc/en/release-notes/bzr-2.3.txt 2010-11-18 19:09:18 +0000
@@ -60,6 +60,9 @@
is involved in a text conflict (but the conflict is still not
resolved). (Vincent Ladeuil, #646961)
+* Merge will now correctly locate a lca where there is a criss-cross merge
+ of a new root. (Gary van der Merwe, #588698)
+
* Report error if non-ASCII command option given. (Rory Yorke, #140563)
Documentation
@@ -79,6 +82,9 @@
.. Major internal changes, unlikely to be visible to users or plugin
developers, but interesting for bzr developers.
+* ``BranchBuilder.build_snapshot`` now accepts parent_ids == [].
+ This can be used to create a new root in the graph. (Gary van der Merwe)
+
Testing
*******
More information about the bazaar-commits
mailing list