~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Jelmer Vernooij
  • Date: 2011-04-09 19:25:42 UTC
  • mto: (5777.5.1 inventoryworkingtree)
  • mto: This revision was merged to the branch mainline in revision 5781.
  • Revision ID: jelmer@samba.org-20110409192542-8bbedp36s7nj928e
Split InventoryTree out of Tree.

Show diffs side-by-side

added added

removed removed

Lines of Context:
48
48
    )
49
49
 
50
50
from bzrlib.static_tuple import StaticTuple
51
 
from bzrlib.symbol_versioning import (
52
 
    deprecated_in,
53
 
    deprecated_method,
54
 
    )
55
51
 
56
52
 
57
53
class InventoryEntry(object):
104
100
    InventoryDirectory('2325', 'wibble', parent_id='123', revision=None)
105
101
    >>> i.path2id('src/wibble')
106
102
    '2325'
 
103
    >>> '2325' in i
 
104
    True
107
105
    >>> i.add(InventoryFile('2326', 'wibble.c', '2325'))
108
106
    InventoryFile('2326', 'wibble.c', parent_id='2325', sha1=None, len=None, revision=None)
109
107
    >>> i['2326']
172
170
        candidates = {}
173
171
        # identify candidate head revision ids.
174
172
        for inv in previous_inventories:
175
 
            if inv.has_id(self.file_id):
 
173
            if self.file_id in inv:
176
174
                ie = inv[self.file_id]
177
175
                if ie.revision in candidates:
178
176
                    # same revision value in two different inventories:
631
629
    inserted, other than through the Inventory API.
632
630
    """
633
631
 
634
 
    @deprecated_method(deprecated_in((2, 4, 0)))
635
632
    def __contains__(self, file_id):
636
633
        """True if this entry contains a file with given id.
637
634
 
638
635
        >>> inv = Inventory()
639
636
        >>> inv.add(InventoryFile('123', 'foo.c', ROOT_ID))
640
637
        InventoryFile('123', 'foo.c', parent_id='TREE_ROOT', sha1=None, len=None, revision=None)
641
 
        >>> inv.has_id('123')
 
638
        >>> '123' in inv
642
639
        True
643
 
        >>> inv.has_id('456')
 
640
        >>> '456' in inv
644
641
        False
645
642
 
646
643
        Note that this method along with __iter__ are not encouraged for use as
759
756
            if (not yield_parents and specific_file_ids is not None and
760
757
                len(specific_file_ids) == 1):
761
758
                file_id = list(specific_file_ids)[0]
762
 
                if self.has_id(file_id):
 
759
                if file_id in self:
763
760
                    yield self.id2path(file_id), self[file_id]
764
761
                return
765
762
            from_dir = self.root
775
772
            parents = set()
776
773
            byid = self
777
774
            def add_ancestors(file_id):
778
 
                if not byid.has_id(file_id):
 
775
                if file_id not in byid:
779
776
                    return
780
777
                parent_id = byid[file_id].parent_id
781
778
                if parent_id is None:
825
822
                    file_id, self[file_id]))
826
823
        return delta
827
824
 
 
825
    def _get_mutable_inventory(self):
 
826
        """Returns a mutable copy of the object.
 
827
 
 
828
        Some inventories are immutable, yet working trees, for example, needs
 
829
        to mutate exisiting inventories instead of creating a new one.
 
830
        """
 
831
        raise NotImplementedError(self._get_mutable_inventory)
 
832
 
828
833
    def make_entry(self, kind, name, parent_id, file_id=None):
829
834
        """Simple thunk to bzrlib.inventory.make_entry."""
830
835
        return make_entry(kind, name, parent_id, file_id)
965
970
 
966
971
    >>> inv.path2id('hello.c')
967
972
    '123-123'
968
 
    >>> inv.has_id('123-123')
 
973
    >>> '123-123' in inv
969
974
    True
970
975
 
971
976
    There are iterators over the contents:
1128
1133
            other.add(entry.copy())
1129
1134
        return other
1130
1135
 
 
1136
    def _get_mutable_inventory(self):
 
1137
        """See CommonInventory._get_mutable_inventory."""
 
1138
        return copy.deepcopy(self)
 
1139
 
1131
1140
    def __iter__(self):
1132
1141
        """Iterate over all file-ids."""
1133
1142
        return iter(self._byid)
1234
1243
        >>> inv = Inventory()
1235
1244
        >>> inv.add(InventoryFile('123', 'foo.c', ROOT_ID))
1236
1245
        InventoryFile('123', 'foo.c', parent_id='TREE_ROOT', sha1=None, len=None, revision=None)
1237
 
        >>> inv.has_id('123')
 
1246
        >>> '123' in inv
1238
1247
        True
1239
1248
        >>> del inv['123']
1240
 
        >>> inv.has_id('123')
 
1249
        >>> '123' in inv
1241
1250
        False
1242
1251
        """
1243
1252
        ie = self[file_id]
1490
1499
            if entry.kind == 'directory':
1491
1500
                directories_to_expand.add(entry.file_id)
1492
1501
            interesting.add(entry.parent_id)
1493
 
            children_of_parent_id.setdefault(entry.parent_id, set()
1494
 
                                             ).add(entry.file_id)
 
1502
            children_of_parent_id.setdefault(entry.parent_id, []
 
1503
                                             ).append(entry.file_id)
1495
1504
 
1496
1505
        # Now, interesting has all of the direct parents, but not the
1497
1506
        # parents of those parents. It also may have some duplicates with
1505
1514
            next_parents = set()
1506
1515
            for entry in self._getitems(remaining_parents):
1507
1516
                next_parents.add(entry.parent_id)
1508
 
                children_of_parent_id.setdefault(entry.parent_id, set()
1509
 
                                                 ).add(entry.file_id)
 
1517
                children_of_parent_id.setdefault(entry.parent_id, []
 
1518
                                                 ).append(entry.file_id)
1510
1519
            # Remove any search tips we've already processed
1511
1520
            remaining_parents = next_parents.difference(interesting)
1512
1521
            interesting.update(remaining_parents)
1525
1534
            for entry in self._getitems(next_file_ids):
1526
1535
                if entry.kind == 'directory':
1527
1536
                    directories_to_expand.add(entry.file_id)
1528
 
                children_of_parent_id.setdefault(entry.parent_id, set()
1529
 
                                                 ).add(entry.file_id)
 
1537
                children_of_parent_id.setdefault(entry.parent_id, []
 
1538
                                                 ).append(entry.file_id)
1530
1539
        return interesting, children_of_parent_id
1531
1540
 
1532
1541
    def filter(self, specific_fileids):
1610
1619
        self._fileid_to_entry_cache[result.file_id] = result
1611
1620
        return result
1612
1621
 
 
1622
    def _get_mutable_inventory(self):
 
1623
        """See CommonInventory._get_mutable_inventory."""
 
1624
        entries = self.iter_entries()
 
1625
        inv = Inventory(None, self.revision_id)
 
1626
        for path, inv_entry in entries:
 
1627
            inv.add(inv_entry.copy())
 
1628
        return inv
 
1629
 
1613
1630
    def create_by_apply_delta(self, inventory_delta, new_revision_id,
1614
1631
        propagate_caches=False):
1615
1632
        """Create a new CHKInventory by applying inventory_delta to this one.
2383
2400
            raise errors.InconsistentDelta(new_path, item[1],
2384
2401
                "new_path with no entry")
2385
2402
        yield item
2386
 
 
2387
 
 
2388
 
def mutable_inventory_from_tree(tree):
2389
 
    """Create a new inventory that has the same contents as a specified tree.
2390
 
 
2391
 
    :param tree: Revision tree to create inventory from
2392
 
    """
2393
 
    entries = tree.iter_entries_by_dir()
2394
 
    inv = Inventory(None, tree.get_revision_id())
2395
 
    for path, inv_entry in entries:
2396
 
        inv.add(inv_entry.copy())
2397
 
    return inv