~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/mutabletree.py

  • Committer: Jelmer Vernooij
  • Date: 2011-05-20 11:17:37 UTC
  • mto: This revision was merged to the branch mainline in revision 5952.
  • Revision ID: jelmer@samba.org-20110520111737-427x9ur7b5tr9u9b
Factor out gathering of dirs to add.

Show diffs side-by-side

added added

removed removed

Lines of Context:
462
462
            of added files, and ignored_files is a dict mapping files that were
463
463
            ignored to the rule that caused them to be ignored.
464
464
        """
465
 
        adder = _SmartAddHelper(self, file_list, recurse, action)
 
465
        # Not all mutable trees can have conflicts
 
466
        if getattr(self, 'conflicts', None) is not None:
 
467
            # Collect all related files without checking whether they exist or
 
468
            # are versioned. It's cheaper to do that once for all conflicts
 
469
            # than trying to find the relevant conflict for each added file.
 
470
            conflicts_related = set()
 
471
            for c in self.conflicts():
 
472
                conflicts_related.update(c.associated_filenames())
 
473
        else:
 
474
            conflicts_related = None
 
475
        adder = _SmartAddHelper(self, file_list, recurse, action,
 
476
            conflicts_related)
466
477
        if save:
467
478
            invdelta = adder.get_inventory_delta()
468
479
            self.apply_inventory_delta(invdelta)
572
583
 
573
584
 
574
585
class _SmartAddHelper(object):
 
586
    """Helper for MutableTree.smart_add."""
575
587
 
576
588
    def get_inventory_delta(self):
577
589
        return self._invdelta.values()
649
661
        self._invdelta[inv_path] = (None, inv_path, entry.file_id, entry)
650
662
        return (entry, added + [path.raw_path])
651
663
 
652
 
    def __init__(self, tree, file_list, recurse, action):
 
664
    def _gather_dirs_to_add(self, user_dirs):
 
665
        # only walk the minimal parents needed: we have user_dirs to override
 
666
        # ignores.
 
667
        prev_dir = None
 
668
 
 
669
        is_inside = osutils.is_inside_or_parent_of_any
 
670
        for path, (inv_path, this_ie) in sorted(user_dirs.iteritems(), key=operator.itemgetter(0)):
 
671
            if (prev_dir is None or not is_inside([prev_dir], path.raw_path)):
 
672
                yield (path, inv_path, this_ie, None)
 
673
            prev_dir = path.raw_path
 
674
 
 
675
    def __init__(self, tree, file_list, recurse, action,
 
676
            conflicts_related=None):
653
677
        self.tree = tree
654
678
        if action is None:
655
679
            self.action = add.AddAction()
658
682
        self._invdelta = {}
659
683
        self.added = []
660
684
        self.ignored = {}
 
685
        if conflicts_related is None:
 
686
            conflicts_related = frozenset()
661
687
 
662
688
        # not in an inner loop; and we want to remove direct use of this,
663
689
        # so here as a reminder for now. RBC 20070703
669
695
            # -- vila 20100208
670
696
            file_list = [u'.']
671
697
        # mutter("smart add of %r")
672
 
        dirs_to_add = []
673
698
        user_dirs = {}
674
 
        conflicts_related = set()
675
 
        # Not all mutable trees can have conflicts
676
 
        if getattr(self.tree, 'conflicts', None) is not None:
677
 
            # Collect all related files without checking whether they exist or
678
 
            # are versioned. It's cheaper to do that once for all conflicts
679
 
            # than trying to find the relevant conflict for each added file.
680
 
            for c in self.tree.conflicts():
681
 
                conflicts_related.update(c.associated_filenames())
682
699
 
683
700
        # expand any symlinks in the directory part, while leaving the
684
701
        # filename alone
718
735
            # no need to walk any directories at all.
719
736
            return
720
737
 
721
 
        # only walk the minimal parents needed: we have user_dirs to override
722
 
        # ignores.
723
 
        prev_dir = None
724
 
 
725
 
        is_inside = osutils.is_inside_or_parent_of_any
726
 
        for path, (inv_path, this_ie) in sorted(user_dirs.iteritems(), key=operator.itemgetter(0)):
727
 
            if (prev_dir is None or not is_inside([prev_dir], path.raw_path)):
728
 
                dirs_to_add.append((path, inv_path, this_ie, None))
729
 
            prev_dir = path.raw_path
730
 
 
731
 
        del user_dirs
 
738
        dirs_to_add = list(self._gather_dirs_to_add(user_dirs))
732
739
 
733
740
        illegalpath_re = re.compile(r'[\r\n]')
734
741
        # dirs_to_add is initialised to a list of directories, but as we scan