/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 bzrlib/commit.py

  • Committer: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
55
55
    revision,
56
56
    trace,
57
57
    tree,
58
 
    ui,
59
58
    )
60
59
from bzrlib.branch import Branch
61
60
from bzrlib.cleanup import OperationWithCleanups
73
72
from bzrlib.inventory import Inventory, InventoryEntry, make_entry
74
73
from bzrlib import symbol_versioning
75
74
from bzrlib.urlutils import unescape_for_display
 
75
import bzrlib.ui
76
76
 
77
77
 
78
78
class NullCommitReporter(object):
174
174
        self.reporter = reporter
175
175
        self.config = config
176
176
 
177
 
    @staticmethod
178
 
    def update_revprops(revprops, branch, authors=None, author=None,
179
 
                        local=False, possible_master_transports=None):
180
 
        if revprops is None:
181
 
            revprops = {}
182
 
        if possible_master_transports is None:
183
 
            possible_master_transports = []
184
 
        if not 'branch-nick' in revprops:
185
 
            revprops['branch-nick'] = branch._get_nick(
186
 
                local,
187
 
                possible_master_transports)
188
 
        if authors is not None:
189
 
            if author is not None:
190
 
                raise AssertionError('Specifying both author and authors '
191
 
                        'is not allowed. Specify just authors instead')
192
 
            if 'author' in revprops or 'authors' in revprops:
193
 
                # XXX: maybe we should just accept one of them?
194
 
                raise AssertionError('author property given twice')
195
 
            if authors:
196
 
                for individual in authors:
197
 
                    if '\n' in individual:
198
 
                        raise AssertionError('\\n is not a valid character '
199
 
                                'in an author identity')
200
 
                revprops['authors'] = '\n'.join(authors)
201
 
        if author is not None:
202
 
            symbol_versioning.warn('The parameter author was deprecated'
203
 
                   ' in version 1.13. Use authors instead',
204
 
                   DeprecationWarning)
205
 
            if 'author' in revprops or 'authors' in revprops:
206
 
                # XXX: maybe we should just accept one of them?
207
 
                raise AssertionError('author property given twice')
208
 
            if '\n' in author:
209
 
                raise AssertionError('\\n is not a valid character '
210
 
                        'in an author identity')
211
 
            revprops['authors'] = author
212
 
        return revprops
213
 
 
214
177
    def commit(self,
215
178
               message=None,
216
179
               timestamp=None,
229
192
               message_callback=None,
230
193
               recursive='down',
231
194
               exclude=None,
232
 
               possible_master_transports=None,
233
 
               lossy=False):
 
195
               possible_master_transports=None):
234
196
        """Commit working copy as a new revision.
235
197
 
236
198
        :param message: the commit message (it or message_callback is required)
263
225
        :param exclude: None or a list of relative paths to exclude from the
264
226
            commit. Pending changes to excluded files will be ignored by the
265
227
            commit.
266
 
        :param lossy: When committing to a foreign VCS, ignore any
267
 
            data that can not be natively represented.
268
228
        """
269
229
        operation = OperationWithCleanups(self._commit)
270
230
        self.revprops = revprops or {}
286
246
               message_callback=message_callback,
287
247
               recursive=recursive,
288
248
               exclude=exclude,
289
 
               possible_master_transports=possible_master_transports,
290
 
               lossy=lossy)
 
249
               possible_master_transports=possible_master_transports)
291
250
 
292
251
    def _commit(self, operation, message, timestamp, timezone, committer,
293
252
            specific_files, rev_id, allow_pointless, strict, verbose,
294
253
            working_tree, local, reporter, message_callback, recursive,
295
 
            exclude, possible_master_transports, lossy):
 
254
            exclude, possible_master_transports):
296
255
        mutter('preparing to commit')
297
256
 
298
257
        if working_tree is None:
330
289
                minimum_path_selection(specific_files))
331
290
        else:
332
291
            self.specific_files = None
333
 
 
 
292
            
334
293
        self.allow_pointless = allow_pointless
335
294
        self.message_callback = message_callback
336
295
        self.timestamp = timestamp
350
309
            not self.branch.repository._format.supports_tree_reference and
351
310
            (self.branch.repository._format.fast_deltas or
352
311
             len(self.parents) < 2))
353
 
        self.pb = ui.ui_factory.nested_progress_bar()
 
312
        self.pb = bzrlib.ui.ui_factory.nested_progress_bar()
354
313
        operation.add_cleanup(self.pb.finished)
355
314
        self.basis_revid = self.work_tree.last_revision()
356
315
        self.basis_tree = self.work_tree.basis_tree()
384
343
        self.pb_stage_count = 0
385
344
        self.pb_stage_total = 5
386
345
        if self.bound_branch:
387
 
            # 2 extra stages: "Uploading data to master branch" and "Merging
388
 
            # tags to master branch"
389
 
            self.pb_stage_total += 2
 
346
            self.pb_stage_total += 1
390
347
        self.pb.show_pct = False
391
348
        self.pb.show_spinner = False
392
349
        self.pb.show_eta = False
404
361
 
405
362
        # Collect the changes
406
363
        self._set_progress_stage("Collecting changes", counter=True)
407
 
        self._lossy = lossy
408
364
        self.builder = self.branch.get_commit_builder(self.parents,
409
 
            self.config, timestamp, timezone, committer, self.revprops,
410
 
            rev_id, lossy=lossy)
411
 
        if not self.builder.supports_record_entry_contents and self.exclude:
412
 
            self.builder.abort()
413
 
            raise errors.ExcludesUnsupported(self.branch.repository)
 
365
            self.config, timestamp, timezone, committer, self.revprops, rev_id)
414
366
 
415
367
        try:
416
368
            self.builder.will_record_deletes()
455
407
            self._set_progress_stage("Uploading data to master branch")
456
408
            # 'commit' to the master first so a timeout here causes the
457
409
            # local branch to be out of date
458
 
            (new_revno, self.rev_id) = self.master_branch.import_last_revision_info_and_tags(
459
 
                self.branch, new_revno, self.rev_id, lossy=lossy)
460
 
            if lossy:
461
 
                self.branch.fetch(self.master_branch, self.rev_id)
 
410
            self.master_branch.import_last_revision_info(
 
411
                self.branch.repository, new_revno, self.rev_id)
462
412
 
463
413
        # and now do the commit locally.
464
414
        self.branch.set_last_revision_info(new_revno, self.rev_id)
465
415
 
466
 
        # Merge local tags to remote
467
 
        if self.bound_branch:
468
 
            self._set_progress_stage("Merging tags to master branch")
469
 
            tag_conflicts = self.branch.tags.merge_to(self.master_branch.tags)
470
 
            if tag_conflicts:
471
 
                warning_lines = ['    ' + name for name, _, _ in tag_conflicts]
472
 
                note("Conflicting tags in bound branch:\n" +
473
 
                    "\n".join(warning_lines))
474
 
 
475
416
        # Make the working tree be up to date with the branch. This
476
417
        # includes automatic changes scheduled to be made to the tree, such
477
418
        # as updating its basis and unversioning paths that were missing.