771
@deprecated_method(deprecated_in((2, 5, 0)))
771
772
def _get_inventory(self):
772
773
return self._inventory
774
775
inventory = property(_get_inventory,
775
776
doc="Inventory of this Tree")
778
def _get_root_inventory(self):
779
return self._inventory
781
root_inventory = property(_get_root_inventory,
782
doc="Root inventory of this tree")
784
def _unpack_file_id(self, file_id):
785
"""Find the inventory and inventory file id for a tree file id.
787
:param file_id: The tree file id, as bytestring or tuple
788
:return: Inventory and inventory file id
790
if isinstance(file_id, tuple):
791
if len(file_id) != 1:
792
raise ValueError("nested trees not yet supported: %r" % file_id)
794
return self.root_inventory, file_id
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]
801
def _path2inv_file_id(self, path):
802
"""Lookup a inventory and inventory file id by path.
804
:param path: Path to look up
805
:return: tuple with inventory and inventory file id
807
# FIXME: Support nested trees
808
return self.root_inventory, self.root_inventory.path2id(path)
782
810
def id2path(self, file_id):
783
811
"""Return the path for a file id.
785
813
:raises NoSuchId:
787
return self.inventory.id2path(file_id)
815
inventory, file_id = self._unpack_file_id(file_id)
816
return inventory.id2path(file_id)
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)
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)
795
826
def all_file_ids(self):
796
return set(self.inventory)
828
[entry.file_id for path, entry in self.iter_entries_by_dir()])
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())
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))
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.
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
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)
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)