~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: John Arbash Meinel
  • Date: 2011-04-20 15:06:17 UTC
  • mto: This revision was merged to the branch mainline in revision 5836.
  • Revision ID: john@arbash-meinel.com-20110420150617-i41caxgemg32tq1r
Start adding tests that _worth_saving_limit works as expected.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
# But those depend on its position within a particular inventory, and
24
24
# it would be nice not to need to hold the backpointer here.
25
25
 
26
 
from __future__ import absolute_import
27
 
 
28
26
# This should really be an id randomly assigned when the tree is
29
27
# created, but it's not for now.
30
28
ROOT_ID = "TREE_ROOT"
50
48
    )
51
49
 
52
50
from bzrlib.static_tuple import StaticTuple
53
 
from bzrlib.symbol_versioning import (
54
 
    deprecated_in,
55
 
    deprecated_method,
56
 
    )
57
51
 
58
52
 
59
53
class InventoryEntry(object):
106
100
    InventoryDirectory('2325', 'wibble', parent_id='123', revision=None)
107
101
    >>> i.path2id('src/wibble')
108
102
    '2325'
 
103
    >>> '2325' in i
 
104
    True
109
105
    >>> i.add(InventoryFile('2326', 'wibble.c', '2325'))
110
106
    InventoryFile('2326', 'wibble.c', parent_id='2325', sha1=None, len=None, revision=None)
111
107
    >>> i['2326']
174
170
        candidates = {}
175
171
        # identify candidate head revision ids.
176
172
        for inv in previous_inventories:
177
 
            if inv.has_id(self.file_id):
 
173
            if self.file_id in inv:
178
174
                ie = inv[self.file_id]
179
175
                if ie.revision in candidates:
180
176
                    # same revision value in two different inventories:
633
629
    inserted, other than through the Inventory API.
634
630
    """
635
631
 
 
632
    def __contains__(self, file_id):
 
633
        """True if this entry contains a file with given id.
 
634
 
 
635
        >>> inv = Inventory()
 
636
        >>> inv.add(InventoryFile('123', 'foo.c', ROOT_ID))
 
637
        InventoryFile('123', 'foo.c', parent_id='TREE_ROOT', sha1=None, len=None, revision=None)
 
638
        >>> '123' in inv
 
639
        True
 
640
        >>> '456' in inv
 
641
        False
 
642
 
 
643
        Note that this method along with __iter__ are not encouraged for use as
 
644
        they are less clear than specific query methods - they may be rmeoved
 
645
        in the future.
 
646
        """
 
647
        return self.has_id(file_id)
 
648
 
636
649
    def has_filename(self, filename):
637
650
        return bool(self.path2id(filename))
638
651
 
743
756
            if (not yield_parents and specific_file_ids is not None and
744
757
                len(specific_file_ids) == 1):
745
758
                file_id = list(specific_file_ids)[0]
746
 
                if self.has_id(file_id):
 
759
                if file_id in self:
747
760
                    yield self.id2path(file_id), self[file_id]
748
761
                return
749
762
            from_dir = self.root
759
772
            parents = set()
760
773
            byid = self
761
774
            def add_ancestors(file_id):
762
 
                if not byid.has_id(file_id):
 
775
                if file_id not in byid:
763
776
                    return
764
777
                parent_id = byid[file_id].parent_id
765
778
                if parent_id is None:
832
845
            descend(self.root, u'')
833
846
        return accum
834
847
 
 
848
    def directories(self):
 
849
        """Return (path, entry) pairs for all directories, including the root.
 
850
        """
 
851
        accum = []
 
852
        def descend(parent_ie, parent_path):
 
853
            accum.append((parent_path, parent_ie))
 
854
 
 
855
            kids = [(ie.name, ie) for ie in parent_ie.children.itervalues() if ie.kind == 'directory']
 
856
            kids.sort()
 
857
 
 
858
            for name, child_ie in kids:
 
859
                child_path = osutils.pathjoin(parent_path, name)
 
860
                descend(child_ie, child_path)
 
861
        descend(self.root, u'')
 
862
        return accum
 
863
 
835
864
    def path2id(self, relpath):
836
865
        """Walk down through directories to return entry of last component.
837
866
 
933
962
 
934
963
    >>> inv.path2id('hello.c')
935
964
    '123-123'
936
 
    >>> inv.has_id('123-123')
 
965
    >>> '123-123' in inv
937
966
    True
938
967
 
939
968
    There are iterators over the contents:
1202
1231
        >>> inv = Inventory()
1203
1232
        >>> inv.add(InventoryFile('123', 'foo.c', ROOT_ID))
1204
1233
        InventoryFile('123', 'foo.c', parent_id='TREE_ROOT', sha1=None, len=None, revision=None)
1205
 
        >>> inv.has_id('123')
 
1234
        >>> '123' in inv
1206
1235
        True
1207
1236
        >>> del inv['123']
1208
 
        >>> inv.has_id('123')
 
1237
        >>> '123' in inv
1209
1238
        False
1210
1239
        """
1211
1240
        ie = self[file_id]
1458
1487
            if entry.kind == 'directory':
1459
1488
                directories_to_expand.add(entry.file_id)
1460
1489
            interesting.add(entry.parent_id)
1461
 
            children_of_parent_id.setdefault(entry.parent_id, set()
1462
 
                                             ).add(entry.file_id)
 
1490
            children_of_parent_id.setdefault(entry.parent_id, []
 
1491
                                             ).append(entry.file_id)
1463
1492
 
1464
1493
        # Now, interesting has all of the direct parents, but not the
1465
1494
        # parents of those parents. It also may have some duplicates with
1473
1502
            next_parents = set()
1474
1503
            for entry in self._getitems(remaining_parents):
1475
1504
                next_parents.add(entry.parent_id)
1476
 
                children_of_parent_id.setdefault(entry.parent_id, set()
1477
 
                                                 ).add(entry.file_id)
 
1505
                children_of_parent_id.setdefault(entry.parent_id, []
 
1506
                                                 ).append(entry.file_id)
1478
1507
            # Remove any search tips we've already processed
1479
1508
            remaining_parents = next_parents.difference(interesting)
1480
1509
            interesting.update(remaining_parents)
1493
1522
            for entry in self._getitems(next_file_ids):
1494
1523
                if entry.kind == 'directory':
1495
1524
                    directories_to_expand.add(entry.file_id)
1496
 
                children_of_parent_id.setdefault(entry.parent_id, set()
1497
 
                                                 ).add(entry.file_id)
 
1525
                children_of_parent_id.setdefault(entry.parent_id, []
 
1526
                                                 ).append(entry.file_id)
1498
1527
        return interesting, children_of_parent_id
1499
1528
 
1500
1529
    def filter(self, specific_fileids):
2093
2122
    def path2id(self, relpath):
2094
2123
        """See CommonInventory.path2id()."""
2095
2124
        # TODO: perhaps support negative hits?
2096
 
        if isinstance(relpath, basestring):
2097
 
            names = osutils.splitpath(relpath)
2098
 
        else:
2099
 
            names = relpath
2100
 
            if relpath == []:
2101
 
                relpath = [""]
2102
 
            relpath = osutils.pathjoin(*relpath)
2103
2125
        result = self._path_to_fileid_cache.get(relpath, None)
2104
2126
        if result is not None:
2105
2127
            return result
 
2128
        if isinstance(relpath, basestring):
 
2129
            names = osutils.splitpath(relpath)
 
2130
        else:
 
2131
            names = relpath
2106
2132
        current_id = self.root_id
2107
2133
        if current_id is None:
2108
2134
            return None