~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Vincent Ladeuil
  • Date: 2012-02-14 17:22:37 UTC
  • mfrom: (6466 +trunk)
  • mto: This revision was merged to the branch mainline in revision 6468.
  • Revision ID: v.ladeuil+lp@free.fr-20120214172237-7dv7er3n4uy8d5m4
Merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
768
768
            yield cur_path
769
769
        # all done.
770
770
 
 
771
    @deprecated_method(deprecated_in((2, 5, 0)))
771
772
    def _get_inventory(self):
772
773
        return self._inventory
773
774
 
774
775
    inventory = property(_get_inventory,
775
776
                         doc="Inventory of this Tree")
776
777
 
 
778
    def _get_root_inventory(self):
 
779
        return self._inventory
 
780
 
 
781
    root_inventory = property(_get_root_inventory,
 
782
        doc="Root inventory of this tree")
 
783
 
 
784
    def _unpack_file_id(self, file_id):
 
785
        """Find the inventory and inventory file id for a tree file id.
 
786
 
 
787
        :param file_id: The tree file id, as bytestring or tuple
 
788
        :return: Inventory and inventory file id
 
789
        """
 
790
        if isinstance(file_id, tuple):
 
791
            if len(file_id) != 1:
 
792
                raise ValueError("nested trees not yet supported: %r" % file_id)
 
793
            file_id = file_id[0]
 
794
        return self.root_inventory, file_id
 
795
 
777
796
    @needs_read_lock
778
797
    def path2id(self, path):
779
798
        """Return the id for path in this tree."""
780
 
        return self._inventory.path2id(path)
 
799
        return self._path2inv_file_id(path)[1]
 
800
 
 
801
    def _path2inv_file_id(self, path):
 
802
        """Lookup a inventory and inventory file id by path.
 
803
 
 
804
        :param path: Path to look up
 
805
        :return: tuple with inventory and inventory file id
 
806
        """
 
807
        # FIXME: Support nested trees
 
808
        return self.root_inventory, self.root_inventory.path2id(path)
781
809
 
782
810
    def id2path(self, file_id):
783
811
        """Return the path for a file id.
784
812
 
785
813
        :raises NoSuchId:
786
814
        """
787
 
        return self.inventory.id2path(file_id)
 
815
        inventory, file_id = self._unpack_file_id(file_id)
 
816
        return inventory.id2path(file_id)
788
817
 
789
818
    def has_id(self, file_id):
790
 
        return self.inventory.has_id(file_id)
 
819
        inventory, file_id = self._unpack_file_id(file_id)
 
820
        return inventory.has_id(file_id)
791
821
 
792
822
    def has_or_had_id(self, file_id):
793
 
        return self.inventory.has_id(file_id)
 
823
        inventory, file_id = self._unpack_file_id(file_id)
 
824
        return inventory.has_id(file_id)
794
825
 
795
826
    def all_file_ids(self):
796
 
        return set(self.inventory)
 
827
        return set(
 
828
            [entry.file_id for path, entry in self.iter_entries_by_dir()])
797
829
 
798
830
    @deprecated_method(deprecated_in((2, 4, 0)))
799
831
    def __iter__(self):
800
 
        return iter(self.inventory)
 
832
        return iter(self.all_file_ids())
801
833
 
802
834
    def filter_unversioned_files(self, paths):
803
835
        """Filter out paths that are versioned.
807
839
        # NB: we specifically *don't* call self.has_filename, because for
808
840
        # WorkingTrees that can indicate files that exist on disk but that
809
841
        # are not versioned.
810
 
        pred = self.inventory.has_filename
811
 
        return set((p for p in paths if not pred(p)))
 
842
        return set((p for p in paths if self.path2id(p) is None))
812
843
 
813
844
    @needs_read_lock
814
845
    def iter_entries_by_dir(self, specific_file_ids=None, yield_parents=False):
823
854
            down to specific_file_ids that have been requested. This has no
824
855
            impact if specific_file_ids is None.
825
856
        """
826
 
        return self.inventory.iter_entries_by_dir(
827
 
            specific_file_ids=specific_file_ids, yield_parents=yield_parents)
 
857
        if specific_file_ids is None:
 
858
            inventory_file_ids = None
 
859
        else:
 
860
            inventory_file_ids = []
 
861
            for tree_file_id in specific_file_ids:
 
862
                inventory, inv_file_id = self._unpack_file_id(tree_file_id)
 
863
                if not inventory is self.root_inventory: # for now
 
864
                    raise AssertionError("%r != %r" % (
 
865
                        inventory, self.root_inventory))
 
866
                inventory_file_ids.append(inv_file_id)
 
867
        # FIXME: Handle nested trees
 
868
        return self.root_inventory.iter_entries_by_dir(
 
869
            specific_file_ids=inventory_file_ids, yield_parents=yield_parents)
828
870
 
829
871
    @deprecated_method(deprecated_in((2, 5, 0)))
830
872
    def get_file_by_path(self, path):
989
1031
            if (self.source.get_symlink_target(file_id) !=
990
1032
                self.target.get_symlink_target(file_id)):
991
1033
                changed_content = True
992
 
            # XXX: Yes, the indentation below is wrong. But fixing it broke
993
 
            # test_merge.TestMergerEntriesLCAOnDisk.
994
 
            # test_nested_tree_subtree_renamed_and_modified. We'll wait for
995
 
            # the fix from bzr.dev -- vila 2009026
996
 
            elif source_kind == 'tree-reference':
997
 
                if (self.source.get_reference_revision(file_id, source_path)
998
 
                    != self.target.get_reference_revision(file_id, target_path)):
 
1034
        elif source_kind == 'tree-reference':
 
1035
            if (self.source.get_reference_revision(file_id, source_path)
 
1036
                != self.target.get_reference_revision(file_id, target_path)):
999
1037
                    changed_content = True
1000
1038
        parent = (source_parent, target_parent)
1001
1039
        name = (source_name, target_name)
1216
1254
        :param file_id: The file_id to lookup.
1217
1255
        """
1218
1256
        try:
1219
 
            inventory = tree.inventory
 
1257
            inventory = tree.root_inventory
1220
1258
        except NotImplementedError:
1221
1259
            # No inventory available.
1222
1260
            try:
1447
1485
            return (None, None)
1448
1486
        else:
1449
1487
            self._out_of_order_processed.add(file_id)
1450
 
            cur_ie = other_tree.inventory[file_id]
 
1488
            cur_ie = other_tree.root_inventory[file_id]
1451
1489
            return (cur_path, cur_ie)
1452
1490
 
1453
1491
    def iter_all(self):