~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/merge.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-08-15 13:49:38 UTC
  • mfrom: (6060.3.1 fix-last-revno-args)
  • Revision ID: pqm@pqm.ubuntu.com-20110815134938-4fuo63g4v2hj8jdt
(jelmer) Cope with the localhost having the name 'localhost' when running
 the test suite. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
990
990
                else:
991
991
                    lca_entries.append(lca_ie)
992
992
 
993
 
            if file_id in base_inventory:
 
993
            if base_inventory.has_id(file_id):
994
994
                base_ie = base_inventory[file_id]
995
995
            else:
996
996
                base_ie = _none_entry
997
997
 
998
 
            if file_id in this_inventory:
 
998
            if this_inventory.has_id(file_id):
999
999
                this_ie = this_inventory[file_id]
1000
1000
            else:
1001
1001
                this_ie = _none_entry
1106
1106
        other_root = self.tt.trans_id_file_id(other_root_file_id)
1107
1107
        if other_root == self.tt.root:
1108
1108
            return
1109
 
        if self.other_tree.inventory.root.file_id in self.this_tree.inventory:
1110
 
            # the other tree's root is a non-root in the current tree (as when
1111
 
            # a previously unrelated branch is merged into another)
 
1109
        if self.this_tree.inventory.has_id(
 
1110
            self.other_tree.inventory.root.file_id):
 
1111
            # the other tree's root is a non-root in the current tree (as
 
1112
            # when a previously unrelated branch is merged into another)
1112
1113
            return
1113
1114
        if self.tt.final_kind(other_root) is not None:
1114
1115
            other_root_is_present = True
1166
1167
    @staticmethod
1167
1168
    def contents_sha1(tree, file_id):
1168
1169
        """Determine the sha1 of the file contents (used as a key method)."""
1169
 
        if file_id not in tree:
 
1170
        if not tree.has_id(file_id):
1170
1171
            return None
1171
1172
        return tree.get_file_sha1(file_id)
1172
1173
 
1342
1343
    def _do_merge_contents(self, file_id):
1343
1344
        """Performs a merge on file_id contents."""
1344
1345
        def contents_pair(tree):
1345
 
            if file_id not in tree:
 
1346
            if not tree.has_id(file_id):
1346
1347
                return (None, None)
1347
1348
            kind = tree.kind(file_id)
1348
1349
            if kind == "file":
1616
1617
 
1617
1618
    def cook_conflicts(self, fs_conflicts):
1618
1619
        """Convert all conflicts into a form that doesn't depend on trans_id"""
1619
 
        self.cooked_conflicts.extend(transform.cook_conflicts(
1620
 
                fs_conflicts, self.tt))
 
1620
        content_conflict_file_ids = set()
 
1621
        cooked_conflicts = transform.cook_conflicts(fs_conflicts, self.tt)
1621
1622
        fp = transform.FinalPaths(self.tt)
1622
1623
        for conflict in self._raw_conflicts:
1623
1624
            conflict_type = conflict[0]
1634
1635
                if other_parent is None or other_name is None:
1635
1636
                    other_path = '<deleted>'
1636
1637
                else:
1637
 
                    parent_path =  fp.get_path(
1638
 
                        self.tt.trans_id_file_id(other_parent))
 
1638
                    if other_parent == self.other_tree.get_root_id():
 
1639
                        # The tree transform doesn't know about the other root,
 
1640
                        # so we special case here to avoid a NoFinalPath
 
1641
                        # exception
 
1642
                        parent_path = ''
 
1643
                    else:
 
1644
                        parent_path =  fp.get_path(
 
1645
                            self.tt.trans_id_file_id(other_parent))
1639
1646
                    other_path = osutils.pathjoin(parent_path, other_name)
1640
1647
                c = _mod_conflicts.Conflict.factory(
1641
1648
                    'path conflict', path=this_path,
1653
1660
                        break
1654
1661
                c = _mod_conflicts.Conflict.factory(conflict_type,
1655
1662
                                                    path=path, file_id=file_id)
 
1663
                content_conflict_file_ids.add(file_id)
1656
1664
            elif conflict_type == 'text conflict':
1657
1665
                trans_id = conflict[1]
1658
1666
                path = fp.get_path(trans_id)
1661
1669
                                                    path=path, file_id=file_id)
1662
1670
            else:
1663
1671
                raise AssertionError('bad conflict type: %r' % (conflict,))
 
1672
            cooked_conflicts.append(c)
 
1673
 
 
1674
        self.cooked_conflicts = []
 
1675
        # We want to get rid of path conflicts when a corresponding contents
 
1676
        # conflict exists. This can occur when one branch deletes a file while
 
1677
        # the other renames *and* modifies it. In this case, the content
 
1678
        # conflict is enough.
 
1679
        for c in cooked_conflicts:
 
1680
            if (c.typestring == 'path conflict'
 
1681
                and c.file_id in content_conflict_file_ids):
 
1682
                continue
1664
1683
            self.cooked_conflicts.append(c)
1665
1684
        self.cooked_conflicts.sort(key=_mod_conflicts.Conflict.sort_key)
1666
1685
 
1911
1930
        name_in_target = osutils.basename(self._target_subdir)
1912
1931
        merge_into_root = subdir.copy()
1913
1932
        merge_into_root.name = name_in_target
1914
 
        if merge_into_root.file_id in self.this_tree.inventory:
 
1933
        if self.this_tree.inventory.has_id(merge_into_root.file_id):
1915
1934
            # Give the root a new file-id.
1916
1935
            # This can happen fairly easily if the directory we are
1917
1936
            # incorporating is the root, and both trees have 'TREE_ROOT' as
1954
1973
    """
1955
1974
    if this_tree is None:
1956
1975
        raise errors.BzrError("bzrlib.merge.merge_inner requires a this_tree "
1957
 
                              "parameter as of bzrlib version 0.8.")
 
1976
                              "parameter")
1958
1977
    merger = Merger(this_branch, other_tree, base_tree, this_tree=this_tree,
1959
1978
                    pb=pb, change_reporter=change_reporter)
1960
1979
    merger.backup_files = backup_files