~bzr/bzr/375898-missing-merged-root

« back to all changes in this revision

Viewing changes to bzrlib/merge.py

  • Committer: Vincent Ladeuil
  • Date: 2010-03-29 16:54:16 UTC
  • Revision ID: v.ladeuil+lp@free.fr-20100329165416-vbfnx484ff736gze
Commit for jam.

Show diffs side-by-side

added added

removed removed

Lines of Context:
796
796
            resolver = self._lca_multi_way
797
797
        child_pb = ui.ui_factory.nested_progress_bar()
798
798
        try:
 
799
            import pprint
 
800
            print '\nentries: %s' % pprint.pformat(entries)
799
801
            factories = Merger.hooks['merge_file_content']
800
802
            hooks = [factory(self) for factory in factories] + [self]
801
803
            self.active_hooks = [hook for hook in hooks if hook is not None]
1015
1017
                        continue
1016
1018
                else:
1017
1019
                    raise AssertionError('unhandled kind: %s' % other_ie.kind)
1018
 
                # XXX: We need to handle kind == 'symlink'
1019
1020
 
1020
1021
            # If we have gotten this far, that means something has changed
1021
1022
            result.append((file_id, content_changed,
1030
1031
 
1031
1032
 
1032
1033
    def fix_root(self):
 
1034
#        import pdb; pdb.set_trace()
 
1035
        self._pprint_tt('fix_root')
 
1036
 
1033
1037
        try:
1034
1038
            self.tt.final_kind(self.tt.root)
1035
1039
        except errors.NoSuchFile:
1046
1050
        try:
1047
1051
            self.tt.final_kind(other_root)
1048
1052
        except errors.NoSuchFile:
 
1053
            if other_root_file_id in self.tt._non_present_ids:
 
1054
#                import pdb; pdb.set_trace()
 
1055
                pass
1049
1056
            return
1050
1057
        if self.this_tree.has_id(self.other_tree.inventory.root.file_id):
1051
1058
            # the other tree's root is a non-root in the current tree
1114
1121
        if base == other:
1115
1122
            return 'this'
1116
1123
        elif this not in (base, other):
 
1124
            # this is neither base nor other, so both sides changed
1117
1125
            return 'conflict'
1118
1126
        # "Ambiguous clean merge" -- both sides have made the same change.
1119
1127
        elif this == other:
1169
1177
                # only has an lca value
1170
1178
                return 'other'
1171
1179
 
1172
 
        # At this point, the lcas disagree, and the tips disagree
 
1180
        # At this point, the lcas disagree, and the tip disagree
1173
1181
        return 'conflict'
1174
1182
 
1175
1183
    @staticmethod
1192
1200
        else:
1193
1201
            return "conflict"
1194
1202
 
1195
 
    def merge_names(self, file_id):
1196
 
        def get_entry(tree):
1197
 
            if tree.has_id(file_id):
1198
 
                return tree.inventory[file_id]
1199
 
            else:
1200
 
                return None
1201
 
        this_entry = get_entry(self.this_tree)
1202
 
        other_entry = get_entry(self.other_tree)
1203
 
        base_entry = get_entry(self.base_tree)
1204
 
        entries = (base_entry, other_entry, this_entry)
1205
 
        names = []
1206
 
        parents = []
1207
 
        for entry in entries:
1208
 
            if entry is None:
1209
 
                names.append(None)
1210
 
                parents.append(None)
1211
 
            else:
1212
 
                names.append(entry.name)
1213
 
                parents.append(entry.parent_id)
1214
 
        return self._merge_names(file_id, parents, names,
1215
 
                                 resolver=self._three_way)
1216
 
 
1217
1203
    def _merge_names(self, file_id, parents, names, resolver):
1218
1204
        """Perform a merge on file_id names and parents"""
 
1205
        name_winner = resolver(*names)
 
1206
        parent_id_winner = resolver(*parents)
 
1207
#        if file_id == '2@cee13dc7-1704-0410-992b-c9b4543f1246:trunk%2Fexport.sh':
 
1208
#            import pdb; pdb.set_trace()
 
1209
        print '>>>> file_id: %s' % (file_id,)
 
1210
        print 'parents: %r' % (parents,)
 
1211
        print 'names: %r' % (names,)
 
1212
        print 'parent_id_winner: %s, name_winner: %s' % (
 
1213
            parent_id_winner, name_winner)
1219
1214
        base_name, other_name, this_name = names
1220
1215
        base_parent, other_parent, this_parent = parents
1221
1216
 
1222
 
        name_winner = resolver(*names)
 
1217
#        if file_id in ('file1-id', 'file3-id') and this_name is None and base_name is not None:
 
1218
#            import pdb; pdb.set_trace()
1223
1219
 
1224
 
        parent_id_winner = resolver(*parents)
1225
 
        if this_name is None:
1226
 
            if name_winner == "this":
1227
 
                name_winner = "other"
1228
 
            if parent_id_winner == "this":
1229
 
                parent_id_winner = "other"
1230
 
        if name_winner == "this" and parent_id_winner == "this":
1231
 
            return
1232
1220
        if name_winner == 'conflict' or parent_id_winner == 'conflict':
1233
1221
            # Creating helpers (.OTHER or .THIS) here cause problems down the
1234
1222
            # road if a ContentConflict needs to be created so we should not do
1237
1225
            self._raw_conflicts.append(('path conflict', trans_id, file_id,
1238
1226
                                        this_parent, this_name,
1239
1227
                                        other_parent, other_name))
 
1228
        if this_name is None: # and base_name is None:
 
1229
            # file-id has been created in other
 
1230
            if name_winner == "this":
 
1231
                name_winner = "other"
 
1232
            if parent_id_winner == "this":
 
1233
                parent_id_winner = "other"
 
1234
        if name_winner == "this" and parent_id_winner == "this":
 
1235
            return
1240
1236
        if other_name is None:
1241
1237
            # it doesn't matter whether the result was 'other' or
1242
1238
            # 'conflict'-- if there's no 'other', we leave it alone.
1243
1239
            return
1244
 
        parent_id = parents[self.winner_idx[parent_id_winner]]
1245
 
        if parent_id is not None:
 
1240
        final_parent_id = parents[self.winner_idx[parent_id_winner]]
 
1241
#if final_path is not None and final_name is not None then create
 
1242
        if (final_parent_id is not None
 
1243
#            and (this_name is not None or base_name is None)
 
1244
            ):
1246
1245
            # if we get here, name_winner and parent_winner are set to safe
1247
1246
            # values.
1248
 
            self.tt.adjust_path(names[self.winner_idx[name_winner]],
1249
 
                                self.tt.trans_id_file_id(parent_id),
1250
 
                                self.tt.trans_id_file_id(file_id))
 
1247
            self._pprint_tt('_merge_names before adjust_path')
 
1248
            final_name = names[self.winner_idx[name_winner]]
 
1249
            final_parent = self.tt.trans_id_file_id(final_parent_id)
 
1250
            final_trans_id = self.tt.trans_id_file_id(file_id)
 
1251
            print '>> adjust_path for file_id: %s, final_name: %s, final_parent: %s, final_parent_id: %s, final_trans_id: %s' % (
 
1252
                file_id, final_name, final_parent, final_parent_id,
 
1253
                final_trans_id)
 
1254
            self.tt.adjust_path(final_name,
 
1255
                                final_parent,
 
1256
                                final_trans_id)
 
1257
            self._pprint_tt('_merge_names after adjust_path')
 
1258
 
 
1259
    def _pprint_tt(self, caller):
 
1260
        import pprint
 
1261
        print '>' * 72
 
1262
        print '%s tt:' % caller
 
1263
#        import pdb; pdb.set_trace()
 
1264
        for n in ('_new_root', '_new_name', '_new_parent', '_new_contents',
 
1265
                  '_non_present_ids',
 
1266
                  '_removed_contents', '_removed_id',
 
1267
                  '_tree_id_paths', '_tree_path_ids',
 
1268
                  ):
 
1269
            print '%s: %s' % (n, pprint.pformat(getattr(self.tt, n)))
 
1270
        print '<' * 72
1251
1271
 
1252
1272
    def _do_merge_contents(self, file_id):
1253
1273
        """Performs a merge on file_id contents."""
1301
1321
            # This is a contents conflict, because none of the available
1302
1322
            # functions could merge it.
1303
1323
            result = None
 
1324
#            import pdb; pdb.set_trace()
 
1325
            self._pprint_tt('_do_merge_contents when contents conflicts')
1304
1326
            name = self.tt.final_name(trans_id)
1305
1327
            parent_id = self.tt.final_parent(trans_id)
1306
1328
            if self.this_tree.has_id(file_id):