~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commit.py

(gz) Fix test failure on alpha by correcting format string for
 gc_chk_sha1_record (Martin [gz])

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
from bzrlib import (
53
53
    debug,
54
54
    errors,
 
55
    revision,
55
56
    trace,
56
57
    tree,
57
58
    ui,
72
73
from bzrlib.inventory import Inventory, InventoryEntry, make_entry
73
74
from bzrlib import symbol_versioning
74
75
from bzrlib.urlutils import unescape_for_display
75
 
from bzrlib.i18n import gettext
 
76
 
76
77
 
77
78
class NullCommitReporter(object):
78
79
    """I report on progress of a commit."""
113
114
        note(format, *args)
114
115
 
115
116
    def snapshot_change(self, change, path):
116
 
        if path == '' and change in (gettext('added'), gettext('modified')):
 
117
        if path == '' and change in ('added', 'modified'):
117
118
            return
118
119
        self._note("%s %s", change, path)
119
120
 
127
128
                                   "to started.", DeprecationWarning,
128
129
                                   stacklevel=2)
129
130
            location = ''
130
 
        self._note(gettext('Committing%s'), location)
 
131
        self._note('Committing%s', location)
131
132
 
132
133
    def completed(self, revno, rev_id):
133
 
        self._note(gettext('Committed revision %d.'), revno)
 
134
        self._note('Committed revision %d.', revno)
134
135
        # self._note goes to the console too; so while we want to log the
135
136
        # rev_id, we can't trivially only log it. (See bug 526425). Long
136
137
        # term we should rearrange the reporting structure, but for now
139
140
        mutter('Committed revid %s as revno %d.', rev_id, revno)
140
141
 
141
142
    def deleted(self, path):
142
 
        self._note(gettext('deleted %s'), path)
 
143
        self._note('deleted %s', path)
143
144
 
144
145
    def missing(self, path):
145
 
        self._note(gettext('missing %s'), path)
 
146
        self._note('missing %s', path)
146
147
 
147
148
    def renamed(self, change, old_path, new_path):
148
149
        self._note('%s %s => %s', change, old_path, new_path)
228
229
               message_callback=None,
229
230
               recursive='down',
230
231
               exclude=None,
231
 
               possible_master_transports=None,
232
 
               lossy=False):
 
232
               possible_master_transports=None):
233
233
        """Commit working copy as a new revision.
234
234
 
235
235
        :param message: the commit message (it or message_callback is required)
262
262
        :param exclude: None or a list of relative paths to exclude from the
263
263
            commit. Pending changes to excluded files will be ignored by the
264
264
            commit.
265
 
        :param lossy: When committing to a foreign VCS, ignore any
266
 
            data that can not be natively represented.
267
265
        """
268
266
        operation = OperationWithCleanups(self._commit)
269
267
        self.revprops = revprops or {}
285
283
               message_callback=message_callback,
286
284
               recursive=recursive,
287
285
               exclude=exclude,
288
 
               possible_master_transports=possible_master_transports,
289
 
               lossy=lossy)
 
286
               possible_master_transports=possible_master_transports)
290
287
 
291
288
    def _commit(self, operation, message, timestamp, timezone, committer,
292
289
            specific_files, rev_id, allow_pointless, strict, verbose,
293
290
            working_tree, local, reporter, message_callback, recursive,
294
 
            exclude, possible_master_transports, lossy):
 
291
            exclude, possible_master_transports):
295
292
        mutter('preparing to commit')
296
293
 
297
294
        if working_tree is None:
329
326
                minimum_path_selection(specific_files))
330
327
        else:
331
328
            self.specific_files = None
332
 
 
 
329
            
333
330
        self.allow_pointless = allow_pointless
334
331
        self.message_callback = message_callback
335
332
        self.timestamp = timestamp
403
400
 
404
401
        # Collect the changes
405
402
        self._set_progress_stage("Collecting changes", counter=True)
406
 
        self._lossy = lossy
407
403
        self.builder = self.branch.get_commit_builder(self.parents,
408
 
            self.config, timestamp, timezone, committer, self.revprops,
409
 
            rev_id, lossy=lossy)
410
 
        if not self.builder.supports_record_entry_contents and self.exclude:
411
 
            self.builder.abort()
412
 
            raise errors.ExcludesUnsupported(self.branch.repository)
 
404
            self.config, timestamp, timezone, committer, self.revprops, rev_id)
413
405
 
414
406
        try:
415
407
            self.builder.will_record_deletes()
442
434
        except Exception, e:
443
435
            mutter("aborting commit write group because of exception:")
444
436
            trace.log_exception_quietly()
 
437
            note("aborting commit write group: %r" % (e,))
445
438
            self.builder.abort()
446
439
            raise
447
440
 
453
446
            self._set_progress_stage("Uploading data to master branch")
454
447
            # 'commit' to the master first so a timeout here causes the
455
448
            # local branch to be out of date
456
 
            (new_revno, self.rev_id) = self.master_branch.import_last_revision_info_and_tags(
457
 
                self.branch, new_revno, self.rev_id, lossy=lossy)
458
 
            if lossy:
459
 
                self.branch.fetch(self.master_branch, self.rev_id)
 
449
            self.master_branch.import_last_revision_info_and_tags(
 
450
                self.branch, new_revno, self.rev_id)
460
451
 
461
452
        # and now do the commit locally.
462
453
        self.branch.set_last_revision_info(new_revno, self.rev_id)
464
455
        # Merge local tags to remote
465
456
        if self.bound_branch:
466
457
            self._set_progress_stage("Merging tags to master branch")
467
 
            tag_updates, tag_conflicts = self.branch.tags.merge_to(
468
 
                self.master_branch.tags)
 
458
            tag_conflicts = self.branch.tags.merge_to(self.master_branch.tags)
469
459
            if tag_conflicts:
470
460
                warning_lines = ['    ' + name for name, _, _ in tag_conflicts]
471
 
                note( gettext("Conflicting tags in bound branch:\n{0}".format(
472
 
                    "\n".join(warning_lines))) )
 
461
                note("Conflicting tags in bound branch:\n" +
 
462
                    "\n".join(warning_lines))
473
463
 
474
464
        # Make the working tree be up to date with the branch. This
475
465
        # includes automatic changes scheduled to be made to the tree, such
494
484
        # A merge with no effect on files
495
485
        if len(self.parents) > 1:
496
486
            return
 
487
        # TODO: we could simplify this by using self.builder.basis_delta.
 
488
 
 
489
        # The initial commit adds a root directory, but this in itself is not
 
490
        # a worthwhile commit.
 
491
        if (self.basis_revid == revision.NULL_REVISION and
 
492
            ((self.builder.new_inventory is not None and
 
493
             len(self.builder.new_inventory) == 1) or
 
494
            len(self.builder._basis_delta) == 1)):
 
495
            raise PointlessCommit()
497
496
        if self.builder.any_changes():
498
497
            return
499
498
        raise PointlessCommit()
695
694
                # Reset the new path (None) and new versioned flag (False)
696
695
                change = (change[0], (change[1][0], None), change[2],
697
696
                    (change[3][0], False)) + change[4:]
698
 
                new_path = change[1][1]
699
 
                versioned = False
700
697
            elif kind == 'tree-reference':
701
698
                if self.recursive == 'down':
702
699
                    self._commit_nested_tree(change[0], change[1][1])
706
703
                    if new_path is None:
707
704
                        reporter.deleted(old_path)
708
705
                    elif old_path is None:
709
 
                        reporter.snapshot_change(gettext('added'), new_path)
 
706
                        reporter.snapshot_change('added', new_path)
710
707
                    elif old_path != new_path:
711
 
                        reporter.renamed(gettext('renamed'), old_path, new_path)
 
708
                        reporter.renamed('renamed', old_path, new_path)
712
709
                    else:
713
710
                        if (new_path or 
714
711
                            self.work_tree.branch.repository._format.rich_root_data):
715
712
                            # Don't report on changes to '' in non rich root
716
713
                            # repositories.
717
 
                            reporter.snapshot_change(gettext('modified'), new_path)
 
714
                            reporter.snapshot_change('modified', new_path)
718
715
            self._next_progress_entry()
719
716
        # Unversion IDs that were found to be deleted
720
717
        self.deleted_ids = deleted_ids
726
723
        if self.specific_files or self.exclude:
727
724
            specific_files = self.specific_files or []
728
725
            for path, old_ie in self.basis_inv.iter_entries():
729
 
                if self.builder.new_inventory.has_id(old_ie.file_id):
 
726
                if old_ie.file_id in self.builder.new_inventory:
730
727
                    # already added - skip.
731
728
                    continue
732
729
                if (is_inside_any(specific_files, path)
943
940
            self.reporter.renamed(change, old_path, path)
944
941
            self._next_progress_entry()
945
942
        else:
946
 
            if change == gettext('unchanged'):
 
943
            if change == 'unchanged':
947
944
                return
948
945
            self.reporter.snapshot_change(change, path)
949
946
            self._next_progress_entry()
965
962
 
966
963
    def _emit_progress(self):
967
964
        if self.pb_entries_count is not None:
968
 
            text = gettext("{0} [{1}] - Stage").format(self.pb_stage_name,
 
965
            text = "%s [%d] - Stage" % (self.pb_stage_name,
969
966
                self.pb_entries_count)
970
967
        else:
971
 
            text = gettext("%s - Stage") % (self.pb_stage_name, )
 
968
            text = "%s - Stage" % (self.pb_stage_name, )
972
969
        self.pb.update(text, self.pb_stage_count, self.pb_stage_total)
973
970
 
974
971
    def _set_specific_file_ids(self):