/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/transform.py

  • Committer: Aaron Bentley
  • Date: 2008-06-24 17:51:24 UTC
  • mto: (3363.16.1 __contains__)
  • mto: This revision was merged to the branch mainline in revision 3517.
  • Revision ID: aaron@aaronbentley.com-20080624175124-bl1778a0ieuyhsrr
Implement iter_entries_by_dir

Show diffs side-by-side

added added

removed removed

Lines of Context:
1409
1409
    def __init__(self, transform):
1410
1410
        self._transform = transform
1411
1411
        self._final_paths = FinalPaths(transform)
 
1412
        self.__by_parent = None
1412
1413
 
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)
1433
1434
 
 
1435
    @property
 
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
 
1440
 
1434
1441
    def lock_read(self):
1435
1442
        # Perhaps in theory, this should lock the TreeTransform?
1436
1443
        pass
1470
1477
        return result
1471
1478
 
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
1481
1487
                    break
1536
1542
        except NoFinalPath:
1537
1543
            raise errors.NoSuchId(self, file_id)
1538
1544
 
 
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, []))
 
1550
        return children
 
1551
 
 
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)
 
1555
            if file_id is None:
 
1556
                continue
 
1557
            if (specific_file_ids is not None
 
1558
                and file_id not in specific_file_ids):
 
1559
                continue
 
1560
            try:
 
1561
                kind = self._transform.final_kind(trans_id)
 
1562
            except NoSuchFile:
 
1563
                kind = self._transform._tree.stored_kind(file_id)
 
1564
            new_entry = inventory.make_entry(
 
1565
                kind,
 
1566
                self._transform.final_name(trans_id),
 
1567
                parent_file_id, file_id)
 
1568
            yield new_entry, trans_id
 
1569
 
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
 
1575
        # position.
 
1576
        todo = [ROOT_PARENT]
 
1577
        ordered_ids = []
 
1578
        while len(todo) > 0:
 
1579
            parent = todo.pop()
 
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,
 
1586
                                                      specific_file_ids):
 
1587
            yield self._final_paths.get_path(trans_id), entry
1541
1588
 
1542
1589
    def kind(self, file_id):
1543
1590
        trans_id = self._transform.trans_id_file_id(file_id)