~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commit.py

  • Committer: Martin Pool
  • Date: 2008-05-08 04:12:06 UTC
  • mto: This revision was merged to the branch mainline in revision 3415.
  • Revision ID: mbp@sourcefrog.net-20080508041206-tkrr8ucmcyrlzkum
Some review cleanups for assertion removal

Show diffs side-by-side

added added

removed removed

Lines of Context:
204
204
               reporter=None,
205
205
               config=None,
206
206
               message_callback=None,
207
 
               recursive='down',
208
 
               exclude=None):
 
207
               recursive='down'):
209
208
        """Commit working copy as a new revision.
210
209
 
211
210
        :param message: the commit message (it or message_callback is required)
233
232
        :param verbose: if True and the reporter is not None, report everything
234
233
        :param recursive: If set to 'down', commit in any subtrees that have
235
234
            pending changes of any sort during this commit.
236
 
        :param exclude: None or a list of relative paths to exclude from the
237
 
            commit. Pending changes to excluded files will be ignored by the
238
 
            commit. 
239
235
        """
240
236
        mutter('preparing to commit')
241
237
 
259
255
        self.bound_branch = None
260
256
        self.any_entries_changed = False
261
257
        self.any_entries_deleted = False
262
 
        if exclude is not None:
263
 
            self.exclude = sorted(
264
 
                minimum_path_selection(exclude))
265
 
        else:
266
 
            self.exclude = []
267
258
        self.local = local
268
259
        self.master_branch = None
269
260
        self.master_locked = False
338
329
            self.pb.show_count = True
339
330
            self.pb.show_bar = True
340
331
 
 
332
            # After a merge, a selected file commit is not supported.
 
333
            # See 'bzr help merge' for an explanation as to why.
341
334
            self.basis_inv = self.basis_tree.inventory
342
335
            self._gather_parents()
343
 
            # After a merge, a selected file commit is not supported.
344
 
            # See 'bzr help merge' for an explanation as to why.
345
336
            if len(self.parents) > 1 and self.specific_files:
346
337
                raise errors.CannotCommitSelectedFileMerge(self.specific_files)
347
 
            # Excludes are a form of selected file commit.
348
 
            if len(self.parents) > 1 and self.exclude:
349
 
                raise errors.CannotCommitSelectedFileMerge(self.exclude)
350
338
 
351
339
            # Collect the changes
352
340
            self._set_progress_stage("Collecting changes",
660
648
        # in bugs like #46635.  Any reason not to use/enhance Tree.changes_from?
661
649
        # ADHB 11-07-2006
662
650
 
663
 
        exclude = self.exclude
664
 
        specific_files = self.specific_files or []
 
651
        specific_files = self.specific_files
665
652
        mutter("Selecting files for commit with filter %s", specific_files)
666
653
 
667
654
        # Build the new inventory
668
 
        self._populate_from_inventory()
 
655
        self._populate_from_inventory(specific_files)
669
656
 
670
657
        # If specific files are selected, then all un-selected files must be
671
658
        # recorded in their previous state. For more details, see
672
659
        # https://lists.ubuntu.com/archives/bazaar/2007q3/028476.html.
673
 
        if specific_files or exclude:
 
660
        if specific_files:
674
661
            for path, old_ie in self.basis_inv.iter_entries():
675
662
                if old_ie.file_id in self.builder.new_inventory:
676
663
                    # already added - skip.
677
664
                    continue
678
 
                if (is_inside_any(specific_files, path)
679
 
                    and not is_inside_any(exclude, path)):
680
 
                    # was inside the selected path, and not excluded - if not
681
 
                    # present it has been deleted so skip.
 
665
                if is_inside_any(specific_files, path):
 
666
                    # was inside the selected path, if not present it has been
 
667
                    # deleted so skip.
682
668
                    continue
683
 
                # From here down it was either not selected, or was excluded:
684
669
                if old_ie.kind == 'directory':
685
670
                    self._next_progress_entry()
686
 
                # We preserve the entry unaltered.
 
671
                # not in final inv yet, was not in the selected files, so is an
 
672
                # entry to be preserved unaltered.
687
673
                ie = old_ie.copy()
688
674
                # Note: specific file commits after a merge are currently
689
675
                # prohibited. This test is for sanity/safety in case it's
711
697
                self._basis_delta.append((path, None, file_id, None))
712
698
                self.reporter.deleted(path)
713
699
 
714
 
    def _populate_from_inventory(self):
 
700
    def _populate_from_inventory(self, specific_files):
715
701
        """Populate the CommitBuilder by walking the working tree inventory."""
716
702
        if self.strict:
717
703
            # raise an exception as soon as we find a single unknown.
718
704
            for unknown in self.work_tree.unknowns():
719
705
                raise StrictCommitFailed()
720
 
        
721
 
        specific_files = self.specific_files
722
 
        exclude = self.exclude
 
706
               
723
707
        report_changes = self.reporter.is_verbose()
724
708
        deleted_ids = []
725
709
        # A tree of paths that have been deleted. E.g. if foo/bar has been
728
712
        # XXX: Note that entries may have the wrong kind because the entry does
729
713
        # not reflect the status on disk.
730
714
        work_inv = self.work_tree.inventory
731
 
        # NB: entries will include entries within the excluded ids/paths
732
 
        # because iter_entries_by_dir has no 'exclude' facility today.
733
715
        entries = work_inv.iter_entries_by_dir(
734
716
            specific_file_ids=self.specific_file_ids, yield_parents=True)
735
717
        for path, existing_ie in entries:
757
739
                if deleted_dict is not None:
758
740
                    # the path has a deleted parent, do not add it.
759
741
                    continue
760
 
            if exclude and is_inside_any(exclude, path):
761
 
                # Skip excluded paths. Excluded paths are processed by
762
 
                # _update_builder_with_changes.
763
 
                continue
764
742
            content_summary = self.work_tree.path_content_summary(path)
765
743
            # Note that when a filter of specific files is given, we must only
766
744
            # skip/record deleted files matching that filter.