~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transform.py

  • Committer: John Arbash Meinel
  • Date: 2009-07-08 14:37:25 UTC
  • mfrom: (4516 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4517.
  • Revision ID: john@arbash-meinel.com-20090708143725-sc9sjy3mz4cxwxzz
Merge bzr.dev 4516

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
lazy_import(globals(), """
23
23
from bzrlib import (
24
24
    annotate,
 
25
    bencode,
25
26
    bzrdir,
26
27
    delta,
27
28
    errors,
30
31
    osutils,
31
32
    revision as _mod_revision,
32
33
    )
33
 
from bzrlib.util import bencode
34
34
""")
35
35
from bzrlib.errors import (DuplicateKey, MalformedTransform, NoSuchFile,
36
36
                           ReusingTransform, NotVersionedError, CantMoveRoot,
995
995
                       self._new_contents.iteritems()]
996
996
            entries.sort(reverse=True)
997
997
            for path, trans_id, kind in entries:
998
 
                if kind == "directory":
999
 
                    os.rmdir(path)
1000
 
                else:
1001
 
                    os.unlink(path)
 
998
                delete_any(path)
1002
999
            try:
1003
 
                os.rmdir(self._limbodir)
 
1000
                delete_any(self._limbodir)
1004
1001
            except OSError:
1005
1002
                # We don't especially care *why* the dir is immortal.
1006
1003
                raise ImmortalLimbo(self._limbodir)
1007
1004
            try:
1008
1005
                if self._deletiondir is not None:
1009
 
                    os.rmdir(self._deletiondir)
 
1006
                    delete_any(self._deletiondir)
1010
1007
            except OSError:
1011
1008
                raise errors.ImmortalPendingDeletion(self._deletiondir)
1012
1009
        finally:
1748
1745
            if self._transform.final_file_id(trans_id) is None:
1749
1746
                yield self._final_paths._determine_path(trans_id)
1750
1747
 
1751
 
    def _make_inv_entries(self, ordered_entries, specific_file_ids):
 
1748
    def _make_inv_entries(self, ordered_entries, specific_file_ids=None):
1752
1749
        for trans_id, parent_file_id in ordered_entries:
1753
1750
            file_id = self._transform.final_file_id(trans_id)
1754
1751
            if file_id is None:
1791
1788
                                                      specific_file_ids):
1792
1789
            yield unicode(self._final_paths.get_path(trans_id)), entry
1793
1790
 
1794
 
    def list_files(self, include_root=False):
1795
 
        """See Tree.list_files."""
 
1791
    def _iter_entries_for_dir(self, dir_path):
 
1792
        """Return path, entry for items in a directory without recursing down."""
 
1793
        dir_file_id = self.path2id(dir_path)
 
1794
        ordered_ids = []
 
1795
        for file_id in self.iter_children(dir_file_id):
 
1796
            trans_id = self._transform.trans_id_file_id(file_id)
 
1797
            ordered_ids.append((trans_id, file_id))
 
1798
        for entry, trans_id in self._make_inv_entries(ordered_ids):
 
1799
            yield unicode(self._final_paths.get_path(trans_id)), entry
 
1800
 
 
1801
    def list_files(self, include_root=False, from_dir=None, recursive=True):
 
1802
        """See WorkingTree.list_files."""
1796
1803
        # XXX This should behave like WorkingTree.list_files, but is really
1797
1804
        # more like RevisionTree.list_files.
1798
 
        for path, entry in self.iter_entries_by_dir():
1799
 
            if entry.name == '' and not include_root:
1800
 
                continue
1801
 
            yield path, 'V', entry.kind, entry.file_id, entry
 
1805
        if recursive:
 
1806
            prefix = None
 
1807
            if from_dir:
 
1808
                prefix = from_dir + '/'
 
1809
            entries = self.iter_entries_by_dir()
 
1810
            for path, entry in entries:
 
1811
                if entry.name == '' and not include_root:
 
1812
                    continue
 
1813
                if prefix:
 
1814
                    if not path.startswith(prefix):
 
1815
                        continue
 
1816
                    path = path[len(prefix):]
 
1817
                yield path, 'V', entry.kind, entry.file_id, entry
 
1818
        else:
 
1819
            if from_dir is None and include_root is True:
 
1820
                root_entry = inventory.make_entry('directory', '',
 
1821
                    ROOT_PARENT, self.get_root_id())
 
1822
                yield '', 'V', 'directory', root_entry.file_id, root_entry
 
1823
            entries = self._iter_entries_for_dir(from_dir or '')
 
1824
            for path, entry in entries:
 
1825
                yield path, 'V', entry.kind, entry.file_id, entry
1802
1826
 
1803
1827
    def kind(self, file_id):
1804
1828
        trans_id = self._transform.trans_id_file_id(file_id)
1915
1939
        name = self._transform._limbo_name(trans_id)
1916
1940
        return open(name, 'rb')
1917
1941
 
1918
 
    def get_file_with_stat(self, file_id, path):
 
1942
    def get_file_with_stat(self, file_id, path=None):
1919
1943
        return self.get_file(file_id, path), None
1920
1944
 
1921
1945
    def annotate_iter(self, file_id,