/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

Merge from by-reference-trees

Show diffs side-by-side

added added

removed removed

Lines of Context:
333
333
 
334
334
    @staticmethod
335
335
    def versionable_kind(kind):
336
 
        return (kind in ('file', 'directory', 'symlink'))
 
336
        return (kind in ('file', 'directory', 'symlink', 'tree-reference'))
337
337
 
338
338
    def check(self, checker, rev_id, inv, tree):
339
339
        """Check this inventory entry is intact.
823
823
            self.file_id, file_parents, self.symlink_target)
824
824
 
825
825
 
 
826
class TreeReference(InventoryEntry):
 
827
    
 
828
    kind = 'tree-reference'
 
829
    
 
830
    def __init__(self, file_id, name, parent_id, revision, reference_revision):
 
831
        InventoryEntry.__init__(self, file_id, name, parent_id)
 
832
        self.revision = revision
 
833
        self.reference_revision = reference_revision
 
834
 
 
835
    def copy(self):
 
836
        return TreeReference(self.file_id, self.name, self.parent_id,
 
837
                             self.revision, self.reference_revision)
 
838
 
 
839
    def _snapshot_text(self, file_parents, work_tree, commit_builder):
 
840
        commit_builder.modified_reference(self.file_id, file_parents)
 
841
 
 
842
    def _read_tree_state(self, path, work_tree):
 
843
        """Populate fields in the inventory entry from the given tree.
 
844
        """
 
845
        self.reference_revision = work_tree.get_reference_revision(self, path)
 
846
 
 
847
    def _forget_tree_state(self):
 
848
        self.reference_revision = None 
 
849
 
 
850
 
826
851
class Inventory(object):
827
852
    """Inventory of versioned files in a tree.
828
853
 
1076
1101
    def get_child(self, parent_id, filename):
1077
1102
        return self[parent_id].children.get(filename)
1078
1103
 
 
1104
    def _add_child(self, entry):
 
1105
        """Add an entry to the inventory, without adding it to its parent"""
 
1106
        if entry.file_id in self._byid:
 
1107
            raise BzrError("inventory already contains entry with id {%s}" %
 
1108
                           entry.file_id)
 
1109
        self._byid[entry.file_id] = entry
 
1110
        for child in getattr(entry, 'children', {}).itervalues():
 
1111
            self._add_child(child)
 
1112
        return entry
 
1113
 
1079
1114
    def add(self, entry):
1080
1115
        """Add entry to inventory.
1081
1116
 
1085
1120
        Returns the new entry object.
1086
1121
        """
1087
1122
        if entry.file_id in self._byid:
1088
 
            raise BzrError("inventory already contains entry with id {%s}" % entry.file_id)
1089
 
 
 
1123
            raise BzrError("inventory already contains entry with id {%s}" %
 
1124
                           entry.file_id)
1090
1125
        if entry.parent_id is None:
1091
1126
            assert self.root is None and len(self._byid) == 0
1092
 
            self._set_root(entry)
1093
 
            return entry
1094
 
        try:
1095
 
            parent = self._byid[entry.parent_id]
1096
 
        except KeyError:
1097
 
            raise BzrError("parent_id {%s} not in inventory" % entry.parent_id)
1098
 
 
1099
 
        if entry.name in parent.children:
1100
 
            raise BzrError("%s is already versioned" %
1101
 
                    osutils.pathjoin(self.id2path(parent.file_id), entry.name))
1102
 
 
1103
 
        self._byid[entry.file_id] = entry
1104
 
        parent.children[entry.name] = entry
1105
 
        return entry
 
1127
            self.root = entry
 
1128
        else:
 
1129
            try:
 
1130
                parent = self._byid[entry.parent_id]
 
1131
            except KeyError:
 
1132
                raise BzrError("parent_id {%s} not in inventory" %
 
1133
                               entry.parent_id)
 
1134
 
 
1135
            if entry.name in parent.children:
 
1136
                raise BzrError("%s is already versioned" %
 
1137
                        osutils.pathjoin(self.id2path(parent.file_id),
 
1138
                        entry.name))
 
1139
            parent.children[entry.name] = entry
 
1140
        return self._add_child(entry)
1106
1141
 
1107
1142
    def add_path(self, relpath, kind, file_id=None, parent_id=None):
1108
1143
        """Add entry from a path.
1267
1302
        for file_id in reversed(to_delete):
1268
1303
            ie = self[file_id]
1269
1304
            del self._byid[file_id]
1270
 
            if ie.parent_id is not None:
1271
 
                del self[ie.parent_id].children[ie.name]
 
1305
        if ie.parent_id is not None:
 
1306
            del self[ie.parent_id].children[ie.name]
1272
1307
 
1273
1308
    def rename(self, file_id, new_parent_id, new_name):
1274
1309
        """Move a file within the inventory.