1409
1409
def __init__(self, transform):
1410
1410
self._transform = transform
1411
1411
self._final_paths = FinalPaths(transform)
1412
self.__by_parent = None
1413
1414
def _changes(self, file_id):
1414
1415
for changes in self._transform.iter_changes():
1431
1432
name = self._transform._limbo_name(trans_id)
1432
1433
return os.lstat(name)
1436
def _by_parent(self):
1437
if self.__by_parent is None:
1438
self.__by_parent = self._transform.by_parent()
1439
return self.__by_parent
1434
1441
def lock_read(self):
1435
1442
# Perhaps in theory, this should lock the TreeTransform?
1472
1479
def _path2id_last_transform_segment(self, path):
1473
by_parent = self._transform.by_parent()
1474
1480
segments = list(reversed(splitpath(path)))
1475
1481
cur_parent = self._transform.root
1476
1482
while len(segments) > 0:
1477
1483
cur_segment = segments.pop()
1478
for child in by_parent.get(cur_parent, []):
1484
for child in self._by_parent.get(cur_parent, []):
1479
1485
if self._transform.final_name(child) == cur_segment:
1480
1486
cur_parent = child
1536
1542
except NoFinalPath:
1537
1543
raise errors.NoSuchId(self, file_id)
1545
def _all_children(self, trans_id):
1546
children = set(self._transform.iter_tree_children(trans_id))
1547
# children in the _new_parent set are provided by _by_parent.
1548
children.difference_update(self._transform._new_parent.keys())
1549
children.update(self._by_parent.get(trans_id, []))
1552
def _make_inv_entries(self, ordered_entries, specific_file_ids):
1553
for trans_id, parent_file_id in ordered_entries:
1554
file_id = self._transform.final_file_id(trans_id)
1557
if (specific_file_ids is not None
1558
and file_id not in specific_file_ids):
1561
kind = self._transform.final_kind(trans_id)
1563
kind = self._transform._tree.stored_kind(file_id)
1564
new_entry = inventory.make_entry(
1566
self._transform.final_name(trans_id),
1567
parent_file_id, file_id)
1568
yield new_entry, trans_id
1539
1570
def iter_entries_by_dir(self, specific_file_ids=None):
1540
return self._transform._tree.iter_entries_by_dir(specific_file_ids)
1571
# This may not be a maximally efficient implementation, but it is
1572
# reasonably straightforward. An implementation that grafts the
1573
# TreeTransform changes onto the tree's iter_entries_by_dir results
1574
# might be more efficient, but requires tricky inferences about stack
1576
todo = [ROOT_PARENT]
1578
while len(todo) > 0:
1580
parent_file_id = self._transform.final_file_id(parent)
1581
children = self._all_children(parent)
1582
todo.extend(children)
1583
for trans_id in children:
1584
ordered_ids.append((trans_id, parent_file_id))
1585
for entry, trans_id in self._make_inv_entries(ordered_ids,
1587
yield self._final_paths.get_path(trans_id), entry
1542
1589
def kind(self, file_id):
1543
1590
trans_id = self._transform.trans_id_file_id(file_id)