~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/merge.py

  • Committer: Martin Pool
  • Date: 2009-01-13 03:11:04 UTC
  • mto: This revision was merged to the branch mainline in revision 3937.
  • Revision ID: mbp@sourcefrog.net-20090113031104-03my054s02i9l2pe
Bump version to 1.12 and add news template

Show diffs side-by-side

added added

removed removed

Lines of Context:
390
390
            if self._is_criss_cross:
391
391
                warning('Warning: criss-cross merge encountered.  See bzr'
392
392
                        ' help criss-cross.')
393
 
                mutter('Criss-cross lcas: %r' % lcas)
394
393
                interesting_revision_ids = [self.base_rev_id]
395
394
                interesting_revision_ids.extend(lcas)
396
395
                interesting_trees = dict((t.get_revision_id(), t)
406
405
                self.base_tree = self.revision_tree(self.base_rev_id)
407
406
        self.base_is_ancestor = True
408
407
        self.base_is_other_ancestor = True
409
 
        mutter('Base revid: %r' % self.base_rev_id)
410
408
 
411
409
    def set_base(self, base_revision):
412
410
        """Set the base revision to use for the merge.
796
794
            content_changed = True
797
795
            if kind_winner == 'this':
798
796
                # No kind change in OTHER, see if there are *any* changes
799
 
                if other_ie.kind == 'directory':
 
797
                if other_ie.kind == None:
 
798
                    # No content and 'this' wins the kind, so skip this?
 
799
                    # continue
 
800
                    pass
 
801
                elif other_ie.kind == 'directory':
800
802
                    if parent_id_winner == 'this' and name_winner == 'this':
801
803
                        # No change for this directory in OTHER, skip
802
804
                        continue
803
805
                    content_changed = False
804
 
                elif other_ie.kind is None or other_ie.kind == 'file':
 
806
                elif other_ie.kind == 'file':
805
807
                    def get_sha1(ie, tree):
806
808
                        if ie.kind != 'file':
807
809
                            return None
977
979
        :return: 'this', 'other', or 'conflict' depending on whether an entry
978
980
            changed or not.
979
981
        """
980
 
        # See doc/developers/lca_tree_merging.txt for details about this
 
982
        # See doc/developers/lca_merge_resolution.txt for details about this
981
983
        # algorithm.
982
984
        if other == this:
983
985
            # Either Ambiguously clean, or nothing was actually changed. We
1088
1090
                                parent_trans_id, trans_id)
1089
1091
 
1090
1092
    def merge_contents(self, file_id):
1091
 
        """Performs a merge on file_id contents."""
 
1093
        """Performa a merge on file_id contents."""
1092
1094
        def contents_pair(tree):
1093
1095
            if file_id not in tree:
1094
1096
                return (None, None)
1118
1120
        # file kind...
1119
1121
        base_pair = contents_pair(self.base_tree)
1120
1122
        other_pair = contents_pair(self.other_tree)
1121
 
        if self._lca_trees:
1122
 
            this_pair = contents_pair(self.this_tree)
1123
 
            lca_pairs = [contents_pair(tree) for tree in self._lca_trees]
1124
 
            winner = self._lca_multi_way((base_pair, lca_pairs), other_pair,
1125
 
                                         this_pair, allow_overriding_lca=False)
1126
 
        else:
1127
 
            if base_pair == other_pair:
1128
 
                winner = 'this'
1129
 
            else:
1130
 
                # We delayed evaluating this_pair as long as we can to avoid
1131
 
                # unnecessary sha1 calculation
1132
 
                this_pair = contents_pair(self.this_tree)
1133
 
                winner = self._three_way(base_pair, other_pair, this_pair)
1134
 
        if winner == 'this':
1135
 
            # No interesting changes introduced by OTHER
1136
 
            return "unmodified"
1137
 
        trans_id = self.tt.trans_id_file_id(file_id)
1138
 
        if winner == 'other':
1139
 
            # OTHER is a straight winner, so replace this contents with other
1140
 
            file_in_this = file_id in self.this_tree
1141
 
            if file_in_this:
1142
 
                # Remove any existing contents
1143
 
                self.tt.delete_contents(trans_id)
1144
 
            if file_id in self.other_tree:
1145
 
                # OTHER changed the file
1146
 
                create_from_tree(self.tt, trans_id,
1147
 
                                 self.other_tree, file_id)
1148
 
                if not file_in_this:
1149
 
                    self.tt.version_file(file_id, trans_id)
1150
 
                return "modified"
1151
 
            elif file_in_this:
1152
 
                # OTHER deleted the file
1153
 
                self.tt.unversion_file(trans_id)
1154
 
                return "deleted"
1155
 
        else:
1156
 
            # We have a hypothetical conflict, but if we have files, then we
1157
 
            # can try to merge the content
1158
 
            if this_pair[0] == 'file' and other_pair[0] == 'file':
 
1123
        if base_pair == other_pair:
 
1124
            # OTHER introduced no changes
 
1125
            return "unmodified"
 
1126
        this_pair = contents_pair(self.this_tree)
 
1127
        if this_pair == other_pair:
 
1128
            # THIS and OTHER introduced the same changes
 
1129
            return "unmodified"
 
1130
        else:
 
1131
            trans_id = self.tt.trans_id_file_id(file_id)
 
1132
            if this_pair == base_pair:
 
1133
                # only OTHER introduced changes
 
1134
                if file_id in self.this_tree:
 
1135
                    # Remove any existing contents
 
1136
                    self.tt.delete_contents(trans_id)
 
1137
                if file_id in self.other_tree:
 
1138
                    # OTHER changed the file
 
1139
                    create_from_tree(self.tt, trans_id,
 
1140
                                     self.other_tree, file_id)
 
1141
                    if file_id not in self.this_tree:
 
1142
                        self.tt.version_file(file_id, trans_id)
 
1143
                    return "modified"
 
1144
                elif file_id in self.this_tree.inventory:
 
1145
                    # OTHER deleted the file
 
1146
                    self.tt.unversion_file(trans_id)
 
1147
                    return "deleted"
 
1148
            #BOTH THIS and OTHER introduced changes; scalar conflict
 
1149
            elif this_pair[0] == "file" and other_pair[0] == "file":
1159
1150
                # THIS and OTHER are both files, so text merge.  Either
1160
1151
                # BASE is a file, or both converted to files, so at least we
1161
1152
                # have agreement that output should be a file.
1172
1163
                    pass
1173
1164
                return "modified"
1174
1165
            else:
 
1166
                # Scalar conflict, can't text merge.  Dump conflicts
1175
1167
                return contents_conflict()
1176
1168
 
1177
1169
    def get_lines(self, tree, file_id):