364
353
ensure_null(self.other_basis)]
365
354
if NULL_REVISION in revisions:
366
355
self.base_rev_id = NULL_REVISION
367
self.base_tree = self.revision_tree(self.base_rev_id)
368
self._is_criss_cross = False
370
lcas = self.revision_graph.find_lca(revisions[0], revisions[1])
371
self._is_criss_cross = False
373
self.base_rev_id = NULL_REVISION
375
self.base_rev_id = list(lcas)[0]
376
else: # len(lcas) > 1
378
# find_unique_lca can only handle 2 nodes, so we have to
379
# start back at the beginning. It is a shame to traverse
380
# the graph again, but better than re-implementing
382
self.base_rev_id = self.revision_graph.find_unique_lca(
383
revisions[0], revisions[1])
385
self.base_rev_id = self.revision_graph.find_unique_lca(
387
self._is_criss_cross = True
357
self.base_rev_id, steps = self.revision_graph.find_unique_lca(
358
revisions[0], revisions[1], count_steps=True)
388
359
if self.base_rev_id == NULL_REVISION:
389
360
raise UnrelatedBranches()
390
if self._is_criss_cross:
391
362
warning('Warning: criss-cross merge encountered. See bzr'
392
363
' help criss-cross.')
393
mutter('Criss-cross lcas: %r' % lcas)
394
interesting_revision_ids = [self.base_rev_id]
395
interesting_revision_ids.extend(lcas)
396
interesting_trees = dict((t.get_revision_id(), t)
397
for t in self.this_branch.repository.revision_trees(
398
interesting_revision_ids))
399
self._cached_trees.update(interesting_trees)
400
self.base_tree = interesting_trees.pop(self.base_rev_id)
401
sorted_lca_keys = self.revision_graph.find_merge_order(
403
self._lca_trees = [interesting_trees[key]
404
for key in sorted_lca_keys]
406
self.base_tree = self.revision_tree(self.base_rev_id)
364
self.base_tree = self.revision_tree(self.base_rev_id)
407
365
self.base_is_ancestor = True
408
366
self.base_is_other_ancestor = True
409
mutter('Base revid: %r' % self.base_rev_id)
411
368
def set_base(self, base_revision):
412
369
"""Set the base revision to use for the merge.
452
409
if self.merge_type.supports_cherrypick:
453
410
kwargs['cherrypick'] = (not self.base_is_ancestor or
454
411
not self.base_is_other_ancestor)
455
if self._is_criss_cross and getattr(self.merge_type,
456
'supports_lca_trees', False):
457
kwargs['lca_trees'] = self._lca_trees
458
412
return self.merge_type(pb=self._pb,
459
413
change_reporter=self.change_reporter,
462
def _do_merge_to(self, merge):
463
if self.other_branch is not None:
464
self.other_branch.update_references(self.this_branch)
466
if self.recurse == 'down':
467
for relpath, file_id in self.this_tree.iter_references():
468
sub_tree = self.this_tree.get_nested_tree(file_id, relpath)
469
other_revision = self.other_tree.get_reference_revision(
471
if other_revision == sub_tree.last_revision():
473
sub_merge = Merger(sub_tree.branch, this_tree=sub_tree)
474
sub_merge.merge_type = self.merge_type
475
other_branch = self.other_branch.reference_parent(file_id, relpath)
476
sub_merge.set_other_revision(other_revision, other_branch)
477
base_revision = self.base_tree.get_reference_revision(file_id)
478
sub_merge.base_tree = \
479
sub_tree.branch.repository.revision_tree(base_revision)
480
sub_merge.base_rev_id = base_revision
483
416
def do_merge(self):
484
417
self.this_tree.lock_tree_write()
418
if self.base_tree is not None:
419
self.base_tree.lock_read()
420
if self.other_tree is not None:
421
self.other_tree.lock_read()
423
merge = self.make_merger()
425
if self.recurse == 'down':
426
for relpath, file_id in self.this_tree.iter_references():
427
sub_tree = self.this_tree.get_nested_tree(file_id, relpath)
428
other_revision = self.other_tree.get_reference_revision(
430
if other_revision == sub_tree.last_revision():
432
sub_merge = Merger(sub_tree.branch, this_tree=sub_tree)
433
sub_merge.merge_type = self.merge_type
434
other_branch = self.other_branch.reference_parent(file_id, relpath)
435
sub_merge.set_other_revision(other_revision, other_branch)
436
base_revision = self.base_tree.get_reference_revision(file_id)
437
sub_merge.base_tree = \
438
sub_tree.branch.repository.revision_tree(base_revision)
439
sub_merge.base_rev_id = base_revision
443
if self.other_tree is not None:
444
self.other_tree.unlock()
486
445
if self.base_tree is not None:
487
self.base_tree.lock_read()
489
if self.other_tree is not None:
490
self.other_tree.lock_read()
492
merge = self.make_merger()
493
self._do_merge_to(merge)
495
if self.other_tree is not None:
496
self.other_tree.unlock()
498
if self.base_tree is not None:
499
self.base_tree.unlock()
446
self.base_tree.unlock()
501
447
self.this_tree.unlock()
502
448
if len(merge.cooked_conflicts) == 0:
503
449
if not self.ignore_zero and not is_quiet():
703
614
result.append((file_id, changed, parents3, names3, executable3))
706
def _entries_lca(self):
707
"""Gather data about files modified between multiple trees.
709
This compares OTHER versus all LCA trees, and for interesting entries,
710
it then compares with THIS and BASE.
712
For the multi-valued entries, the format will be (BASE, [lca1, lca2])
713
:return: [(file_id, changed, parents, names, executable)]
714
file_id Simple file_id of the entry
715
changed Boolean, True if the kind or contents changed
717
parents ((base, [parent_id, in, lcas]), parent_id_other,
719
names ((base, [name, in, lcas]), name_in_other, name_in_this)
720
executable ((base, [exec, in, lcas]), exec_in_other, exec_in_this)
722
if self.interesting_files is not None:
723
lookup_trees = [self.this_tree, self.base_tree]
724
lookup_trees.extend(self._lca_trees)
725
# I think we should include the lca trees as well
726
interesting_ids = self.other_tree.paths2ids(self.interesting_files,
729
interesting_ids = self.interesting_ids
731
walker = _mod_tree.MultiWalker(self.other_tree, self._lca_trees)
733
base_inventory = self.base_tree.inventory
734
this_inventory = self.this_tree.inventory
735
for path, file_id, other_ie, lca_values in walker.iter_all():
736
# Is this modified at all from any of the other trees?
738
other_ie = _none_entry
739
if interesting_ids is not None and file_id not in interesting_ids:
742
# If other_revision is found in any of the lcas, that means this
743
# node is uninteresting. This is because when merging, if there are
744
# multiple heads(), we have to create a new node. So if we didn't,
745
# we know that the ancestry is linear, and that OTHER did not
747
# See doc/developers/lca_merge_resolution.txt for details
748
other_revision = other_ie.revision
749
if other_revision is not None:
750
# We can't use this shortcut when other_revision is None,
751
# because it may be None because things are WorkingTrees, and
752
# not because it is *actually* None.
753
is_unmodified = False
754
for lca_path, ie in lca_values:
755
if ie is not None and ie.revision == other_revision:
762
for lca_path, lca_ie in lca_values:
764
lca_entries.append(_none_entry)
766
lca_entries.append(lca_ie)
768
if file_id in base_inventory:
769
base_ie = base_inventory[file_id]
771
base_ie = _none_entry
773
if file_id in this_inventory:
774
this_ie = this_inventory[file_id]
776
this_ie = _none_entry
782
for lca_ie in lca_entries:
783
lca_kinds.append(lca_ie.kind)
784
lca_parent_ids.append(lca_ie.parent_id)
785
lca_names.append(lca_ie.name)
786
lca_executable.append(lca_ie.executable)
788
kind_winner = self._lca_multi_way(
789
(base_ie.kind, lca_kinds),
790
other_ie.kind, this_ie.kind)
791
parent_id_winner = self._lca_multi_way(
792
(base_ie.parent_id, lca_parent_ids),
793
other_ie.parent_id, this_ie.parent_id)
794
name_winner = self._lca_multi_way(
795
(base_ie.name, lca_names),
796
other_ie.name, this_ie.name)
798
content_changed = True
799
if kind_winner == 'this':
800
# No kind change in OTHER, see if there are *any* changes
801
if other_ie.kind == 'directory':
802
if parent_id_winner == 'this' and name_winner == 'this':
803
# No change for this directory in OTHER, skip
805
content_changed = False
806
elif other_ie.kind is None or other_ie.kind == 'file':
807
def get_sha1(ie, tree):
808
if ie.kind != 'file':
810
return tree.get_file_sha1(file_id)
811
base_sha1 = get_sha1(base_ie, self.base_tree)
812
lca_sha1s = [get_sha1(ie, tree) for ie, tree
813
in zip(lca_entries, self._lca_trees)]
814
this_sha1 = get_sha1(this_ie, self.this_tree)
815
other_sha1 = get_sha1(other_ie, self.other_tree)
816
sha1_winner = self._lca_multi_way(
817
(base_sha1, lca_sha1s), other_sha1, this_sha1,
818
allow_overriding_lca=False)
819
exec_winner = self._lca_multi_way(
820
(base_ie.executable, lca_executable),
821
other_ie.executable, this_ie.executable)
822
if (parent_id_winner == 'this' and name_winner == 'this'
823
and sha1_winner == 'this' and exec_winner == 'this'):
824
# No kind, parent, name, exec, or content change for
825
# OTHER, so this node is not considered interesting
827
if sha1_winner == 'this':
828
content_changed = False
829
elif other_ie.kind == 'symlink':
830
def get_target(ie, tree):
831
if ie.kind != 'symlink':
833
return tree.get_symlink_target(file_id)
834
base_target = get_target(base_ie, self.base_tree)
835
lca_targets = [get_target(ie, tree) for ie, tree
836
in zip(lca_entries, self._lca_trees)]
837
this_target = get_target(this_ie, self.this_tree)
838
other_target = get_target(other_ie, self.other_tree)
839
target_winner = self._lca_multi_way(
840
(base_target, lca_targets),
841
other_target, this_target)
842
if (parent_id_winner == 'this' and name_winner == 'this'
843
and target_winner == 'this'):
844
# No kind, parent, name, or symlink target change
847
if target_winner == 'this':
848
content_changed = False
849
elif other_ie.kind == 'tree-reference':
850
# The 'changed' information seems to be handled at a higher
851
# level. At least, _entries3 returns False for content
852
# changed, even when at a new revision_id.
853
content_changed = False
854
if (parent_id_winner == 'this' and name_winner == 'this'):
855
# Nothing interesting
858
raise AssertionError('unhandled kind: %s' % other_ie.kind)
859
# XXX: We need to handle kind == 'symlink'
861
# If we have gotten this far, that means something has changed
862
result.append((file_id, content_changed,
863
((base_ie.parent_id, lca_parent_ids),
864
other_ie.parent_id, this_ie.parent_id),
865
((base_ie.name, lca_names),
866
other_ie.name, this_ie.name),
867
((base_ie.executable, lca_executable),
868
other_ie.executable, this_ie.executable)
873
617
def fix_root(self):
875
619
self.tt.final_kind(self.tt.root)
876
620
except NoSuchFile:
877
621
self.tt.cancel_deletion(self.tt.root)
878
622
if self.tt.final_file_id(self.tt.root) is None:
879
self.tt.version_file(self.tt.tree_file_id(self.tt.root),
623
self.tt.version_file(self.tt.tree_file_id(self.tt.root),
625
if self.other_tree.inventory.root is None:
881
627
other_root_file_id = self.other_tree.get_root_id()
882
if other_root_file_id is None:
884
628
other_root = self.tt.trans_id_file_id(other_root_file_id)
885
629
if other_root == self.tt.root:
967
def _lca_multi_way(bases, other, this, allow_overriding_lca=True):
968
"""Consider LCAs when determining whether a change has occurred.
970
If LCAS are all identical, this is the same as a _three_way comparison.
972
:param bases: value in (BASE, [LCAS])
973
:param other: value in OTHER
974
:param this: value in THIS
975
:param allow_overriding_lca: If there is more than one unique lca
976
value, allow OTHER to override THIS if it has a new value, and
977
THIS only has an lca value, or vice versa. This is appropriate for
978
truly scalar values, not as much for non-scalars.
979
:return: 'this', 'other', or 'conflict' depending on whether an entry
982
# See doc/developers/lca_tree_merging.txt for details about this
985
# Either Ambiguously clean, or nothing was actually changed. We
988
base_val, lca_vals = bases
989
# Remove 'base_val' from the lca_vals, because it is not interesting
990
filtered_lca_vals = [lca_val for lca_val in lca_vals
991
if lca_val != base_val]
992
if len(filtered_lca_vals) == 0:
993
return Merge3Merger._three_way(base_val, other, this)
995
unique_lca_vals = set(filtered_lca_vals)
996
if len(unique_lca_vals) == 1:
997
return Merge3Merger._three_way(unique_lca_vals.pop(), other, this)
999
if allow_overriding_lca:
1000
if other in unique_lca_vals:
1001
if this in unique_lca_vals:
1002
# Each side picked a different lca, conflict
1005
# This has a value which supersedes both lca values, and
1006
# other only has an lca value
1008
elif this in unique_lca_vals:
1009
# OTHER has a value which supersedes both lca values, and this
1010
# only has an lca value
1013
# At this point, the lcas disagree, and the tips disagree
1017
711
def scalar_three_way(this_tree, base_tree, other_tree, file_id, key):
1018
712
"""Do a three-way test on a scalar.
1019
713
Return "this", "other" or "conflict", depending whether a value wins.
1121
814
base_pair = contents_pair(self.base_tree)
1122
815
other_pair = contents_pair(self.other_tree)
1124
this_pair = contents_pair(self.this_tree)
1125
lca_pairs = [contents_pair(tree) for tree in self._lca_trees]
1126
winner = self._lca_multi_way((base_pair, lca_pairs), other_pair,
1127
this_pair, allow_overriding_lca=False)
1129
if base_pair == other_pair:
1132
# We delayed evaluating this_pair as long as we can to avoid
1133
# unnecessary sha1 calculation
1134
this_pair = contents_pair(self.this_tree)
1135
winner = self._three_way(base_pair, other_pair, this_pair)
1136
if winner == 'this':
1137
# No interesting changes introduced by OTHER
1139
trans_id = self.tt.trans_id_file_id(file_id)
1140
if winner == 'other':
1141
# OTHER is a straight winner, so replace this contents with other
1142
file_in_this = file_id in self.this_tree
1144
# Remove any existing contents
1145
self.tt.delete_contents(trans_id)
1146
if file_id in self.other_tree:
1147
# OTHER changed the file
1148
create_from_tree(self.tt, trans_id,
1149
self.other_tree, file_id)
1150
if not file_in_this:
1151
self.tt.version_file(file_id, trans_id)
1154
# OTHER deleted the file
1155
self.tt.unversion_file(trans_id)
1158
# We have a hypothetical conflict, but if we have files, then we
1159
# can try to merge the content
1160
if this_pair[0] == 'file' and other_pair[0] == 'file':
816
if base_pair == other_pair:
817
# OTHER introduced no changes
819
this_pair = contents_pair(self.this_tree)
820
if this_pair == other_pair:
821
# THIS and OTHER introduced the same changes
824
trans_id = self.tt.trans_id_file_id(file_id)
825
if this_pair == base_pair:
826
# only OTHER introduced changes
827
if file_id in self.this_tree:
828
# Remove any existing contents
829
self.tt.delete_contents(trans_id)
830
if file_id in self.other_tree:
831
# OTHER changed the file
832
create_by_entry(self.tt,
833
self.other_tree.inventory[file_id],
834
self.other_tree, trans_id)
835
if file_id not in self.this_tree.inventory:
836
self.tt.version_file(file_id, trans_id)
838
elif file_id in self.this_tree.inventory:
839
# OTHER deleted the file
840
self.tt.unversion_file(trans_id)
842
#BOTH THIS and OTHER introduced changes; scalar conflict
843
elif this_pair[0] == "file" and other_pair[0] == "file":
1161
844
# THIS and OTHER are both files, so text merge. Either
1162
845
# BASE is a file, or both converted to files, so at least we
1163
846
# have agreement that output should be a file.
1250
934
self.tt.version_file(file_id, trans_id)
1251
935
versioned = True
1252
936
return file_group
1254
def _conflict_file(self, name, parent_id, tree, file_id, suffix,
938
def _conflict_file(self, name, parent_id, tree, file_id, suffix,
1256
940
"""Emit a single conflict file."""
1257
941
name = name + '.' + suffix
1258
942
trans_id = self.tt.create_path(name, parent_id)
1259
create_from_tree(self.tt, trans_id, tree, file_id, lines)
943
entry = tree.inventory[file_id]
944
create_by_entry(self.tt, entry, tree, trans_id, lines)
1262
947
def merge_executable(self, file_id, file_status):
1263
948
"""Perform a merge on the execute bit."""
1264
949
executable = [self.executable(t, file_id) for t in (self.base_tree,
1265
950
self.other_tree, self.this_tree)]
1266
self._merge_executable(file_id, executable, file_status,
1267
resolver=self._three_way)
951
self._merge_executable(file_id, executable, file_status)
1269
def _merge_executable(self, file_id, executable, file_status,
953
def _merge_executable(self, file_id, executable, file_status):
1271
954
"""Perform a merge on the execute bit."""
1272
955
base_executable, other_executable, this_executable = executable
1273
956
if file_status == "deleted":
1275
winner = resolver(*executable)
958
winner = self._three_way(*executable)
1276
959
if winner == "conflict":
1277
960
# There must be a None in here, if we have a conflict, but we
1278
961
# need executability since file status was not deleted.