~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Aaron Bentley
  • Date: 2007-01-26 04:00:12 UTC
  • mfrom: (2245 +trunk)
  • mto: (2255.6.1 dirstate)
  • mto: This revision was merged to the branch mainline in revision 2322.
  • Revision ID: aaron.bentley@utoronto.ca-20070126040012-j80k7qhvj80dyp9j
merge from bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
969
969
                # if we finished all children, pop it off the stack
970
970
                stack.pop()
971
971
 
972
 
    def iter_entries_by_dir(self, from_dir=None):
 
972
    def iter_entries_by_dir(self, from_dir=None, specific_file_ids=None):
973
973
        """Iterate over the entries in a directory first order.
974
974
 
975
975
        This returns all entries for a directory before returning
984
984
        if from_dir is None:
985
985
            if self.root is None:
986
986
                return
 
987
            # Optimize a common case
 
988
            if specific_file_ids is not None and len(specific_file_ids) == 1:
 
989
                file_id = list(specific_file_ids)[0]
 
990
                if file_id in self:
 
991
                    yield self.id2path(file_id), self[file_id]
 
992
                return 
987
993
            from_dir = self.root
988
 
            yield '', self.root
 
994
            if (specific_file_ids is None or 
 
995
                self.root.file_id in specific_file_ids):
 
996
                yield '', self.root
989
997
        elif isinstance(from_dir, basestring):
990
998
            from_dir = self._byid[from_dir]
 
999
 
 
1000
        if specific_file_ids is not None:
 
1001
            parents = set()
 
1002
            def add_ancestors(file_id):
 
1003
                if file_id not in self:
 
1004
                    return
 
1005
                parent_id = self[file_id].parent_id
 
1006
                if parent_id is None:
 
1007
                    return
 
1008
                if parent_id not in parents:
 
1009
                    parents.add(parent_id)
 
1010
                    add_ancestors(parent_id)
 
1011
            for file_id in specific_file_ids:
 
1012
                add_ancestors(file_id)
 
1013
        else:
 
1014
            parents = None
991
1015
            
992
1016
        stack = [(u'', from_dir)]
993
1017
        while stack:
998
1022
 
999
1023
                child_relpath = cur_relpath + child_name
1000
1024
 
1001
 
                yield child_relpath, child_ie
 
1025
                if (specific_file_ids is None or 
 
1026
                    child_ie.file_id in specific_file_ids):
 
1027
                    yield child_relpath, child_ie
1002
1028
 
1003
1029
                if child_ie.kind == 'directory':
1004
 
                    child_dirs.append((child_relpath+'/', child_ie))
 
1030
                    if parents is None or child_ie.file_id in parents:
 
1031
                        child_dirs.append((child_relpath+'/', child_ie))
1005
1032
            stack.extend(reversed(child_dirs))
1006
1033
 
1007
1034
    def entries(self):