/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 breezy/git/workingtree.py

Add a recurse_nested argument to Tree.list_files.

Merged from https://code.launchpad.net/~jelmer/brz/follow-tree-references-list-files/+merge/374066

Show diffs side-by-side

added added

removed removed

Lines of Context:
70
70
    BadReferenceTarget,
71
71
    MutableTree,
72
72
    )
 
73
from ..sixish import text_type
73
74
 
74
75
 
75
76
from .dir import (
114
115
        self.index = Index(self.control_transport.local_abspath('index'))
115
116
        self._index_dirty = False
116
117
 
 
118
    def _get_submodule_index(self, relpath):
 
119
        if not isinstance(relpath, bytes):
 
120
            raise TypeError(relpath)
 
121
        try:
 
122
            info = self._submodule_info()[relpath]
 
123
        except KeyError:
 
124
            index_path = os.path.join(self.basedir, relpath.decode('utf-8'), '.git', 'index')
 
125
        else:
 
126
            index_path = self.control_transport.local_abspath(
 
127
                posixpath.join('modules', info[1], 'index'))
 
128
        return Index(index_path)
 
129
 
117
130
    def lock_read(self):
118
131
        """Lock the repository for read operations.
119
132
 
514
527
    def has_filename(self, filename):
515
528
        return osutils.lexists(self.abspath(filename))
516
529
 
517
 
    def _iter_files_recursive(self, from_dir=None, include_dirs=False):
 
530
    def _iter_files_recursive(self, from_dir=None, include_dirs=False,
 
531
                              recurse_nested=False):
518
532
        if from_dir is None:
519
533
            from_dir = u""
 
534
        if not isinstance(from_dir, text_type):
 
535
            raise TypeError(from_dir)
520
536
        encoded_from_dir = self.abspath(from_dir).encode(osutils._fs_enc)
521
537
        for (dirpath, dirnames, filenames) in os.walk(encoded_from_dir):
522
538
            dir_relpath = dirpath[len(self.basedir):].strip(b"/")
529
545
                    dirnames.remove(name)
530
546
                    continue
531
547
                relpath = os.path.join(dir_relpath, name)
 
548
                if not recurse_nested and self._directory_is_tree_reference(relpath.decode(osutils._fs_enc)):
 
549
                    dirnames.remove(name)
532
550
                if include_dirs:
533
551
                    try:
534
552
                        yield relpath.decode(osutils._fs_enc)
535
553
                    except UnicodeDecodeError:
536
554
                        raise errors.BadFilenameEncoding(
537
555
                            relpath, osutils._fs_enc)
538
 
                    if not self._has_dir(relpath):
 
556
                    if not self.is_versioned(relpath.decode(osutils._fs_enc)):
539
557
                        dirnames.remove(name)
540
558
            for name in filenames:
541
559
                if self.mapping.is_special_file(name):
728
746
            return self._is_executable_from_path_and_stat_from_basis(
729
747
                path, stat_result)
730
748
 
731
 
    def list_files(self, include_root=False, from_dir=None, recursive=True):
 
749
    def list_files(self, include_root=False, from_dir=None, recursive=True,
 
750
                   recurse_nested=False):
732
751
        if from_dir is None or from_dir == '.':
733
752
            from_dir = u""
734
753
        dir_ids = {}
743
762
            dir_ids[u""] = root_ie.file_id
744
763
            if recursive:
745
764
                path_iterator = sorted(
746
 
                    self._iter_files_recursive(from_dir, include_dirs=True))
 
765
                    self._iter_files_recursive(
 
766
                        from_dir, include_dirs=True,
 
767
                        recurse_nested=recurse_nested))
747
768
            else:
748
769
                encoded_from_dir = self.abspath(from_dir).encode(
749
770
                    osutils._fs_enc)
770
791
                for dir_path, dir_ie in self._add_missing_parent_ids(
771
792
                        parent, dir_ids):
772
793
                    pass
773
 
                if kind in ('directory', 'tree-reference'):
 
794
                if kind == 'tree-reference' and recurse_nested:
 
795
                    ie = self._get_dir_ie(path, self.path2id(path))
 
796
                    yield (posixpath.relpath(path, from_dir), 'V', 'directory',
 
797
                           ie)
 
798
                    continue
 
799
                if kind == 'directory':
774
800
                    if path != from_dir:
775
801
                        if self._has_dir(encoded_path):
776
802
                            ie = self._get_dir_ie(path, self.path2id(path))