/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: Martin Pool
  • Date: 2011-05-20 14:46:02 UTC
  • mto: This revision was merged to the branch mainline in revision 5923.
  • Revision ID: mbp@canonical.com-20110520144602-bqli0t6dj01gl0pv
Various pyflakes import fixes.

Some modules were used for subclassing or at module load time, so there is no
point loading them lazily.

Some were not imported when they should be.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011 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,
58
59
    )
59
60
from bzrlib.branch import Branch
60
61
from bzrlib.cleanup import OperationWithCleanups
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
 
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
 
177
214
    def commit(self,
178
215
               message=None,
179
216
               timestamp=None,
192
229
               message_callback=None,
193
230
               recursive='down',
194
231
               exclude=None,
195
 
               possible_master_transports=None):
 
232
               possible_master_transports=None,
 
233
               lossy=False):
196
234
        """Commit working copy as a new revision.
197
235
 
198
236
        :param message: the commit message (it or message_callback is required)
225
263
        :param exclude: None or a list of relative paths to exclude from the
226
264
            commit. Pending changes to excluded files will be ignored by the
227
265
            commit.
 
266
        :param lossy: When committing to a foreign VCS, ignore any
 
267
            data that can not be natively represented.
228
268
        """
229
269
        operation = OperationWithCleanups(self._commit)
230
270
        self.revprops = revprops or {}
246
286
               message_callback=message_callback,
247
287
               recursive=recursive,
248
288
               exclude=exclude,
249
 
               possible_master_transports=possible_master_transports)
 
289
               possible_master_transports=possible_master_transports,
 
290
               lossy=lossy)
250
291
 
251
292
    def _commit(self, operation, message, timestamp, timezone, committer,
252
293
            specific_files, rev_id, allow_pointless, strict, verbose,
253
294
            working_tree, local, reporter, message_callback, recursive,
254
 
            exclude, possible_master_transports):
 
295
            exclude, possible_master_transports, lossy):
255
296
        mutter('preparing to commit')
256
297
 
257
298
        if working_tree is None:
289
330
                minimum_path_selection(specific_files))
290
331
        else:
291
332
            self.specific_files = None
292
 
            
 
333
 
293
334
        self.allow_pointless = allow_pointless
294
335
        self.message_callback = message_callback
295
336
        self.timestamp = timestamp
309
350
            not self.branch.repository._format.supports_tree_reference and
310
351
            (self.branch.repository._format.fast_deltas or
311
352
             len(self.parents) < 2))
312
 
        self.pb = bzrlib.ui.ui_factory.nested_progress_bar()
 
353
        self.pb = ui.ui_factory.nested_progress_bar()
313
354
        operation.add_cleanup(self.pb.finished)
314
355
        self.basis_revid = self.work_tree.last_revision()
315
356
        self.basis_tree = self.work_tree.basis_tree()
343
384
        self.pb_stage_count = 0
344
385
        self.pb_stage_total = 5
345
386
        if self.bound_branch:
346
 
            self.pb_stage_total += 1
 
387
            # 2 extra stages: "Uploading data to master branch" and "Merging
 
388
            # tags to master branch"
 
389
            self.pb_stage_total += 2
347
390
        self.pb.show_pct = False
348
391
        self.pb.show_spinner = False
349
392
        self.pb.show_eta = False
361
404
 
362
405
        # Collect the changes
363
406
        self._set_progress_stage("Collecting changes", counter=True)
 
407
        self._lossy = lossy
364
408
        self.builder = self.branch.get_commit_builder(self.parents,
365
 
            self.config, timestamp, timezone, committer, self.revprops, rev_id)
 
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)
366
414
 
367
415
        try:
368
416
            self.builder.will_record_deletes()
395
443
        except Exception, e:
396
444
            mutter("aborting commit write group because of exception:")
397
445
            trace.log_exception_quietly()
398
 
            note("aborting commit write group: %r" % (e,))
399
446
            self.builder.abort()
400
447
            raise
401
448
 
407
454
            self._set_progress_stage("Uploading data to master branch")
408
455
            # 'commit' to the master first so a timeout here causes the
409
456
            # local branch to be out of date
410
 
            self.master_branch.import_last_revision_info(
411
 
                self.branch.repository, new_revno, self.rev_id)
 
457
            (new_revno, self.rev_id) = self.master_branch.import_last_revision_info_and_tags(
 
458
                self.branch, new_revno, self.rev_id, lossy=lossy)
 
459
            if lossy:
 
460
                self.branch.fetch(self.master_branch, self.rev_id)
412
461
 
413
462
        # and now do the commit locally.
414
463
        self.branch.set_last_revision_info(new_revno, self.rev_id)
415
464
 
 
465
        # Merge local tags to remote
 
466
        if self.bound_branch:
 
467
            self._set_progress_stage("Merging tags to master branch")
 
468
            tag_conflicts = self.branch.tags.merge_to(self.master_branch.tags)
 
469
            if tag_conflicts:
 
470
                warning_lines = ['    ' + name for name, _, _ in tag_conflicts]
 
471
                note("Conflicting tags in bound branch:\n" +
 
472
                    "\n".join(warning_lines))
 
473
 
416
474
        # Make the working tree be up to date with the branch. This
417
475
        # includes automatic changes scheduled to be made to the tree, such
418
476
        # as updating its basis and unversioning paths that were missing.
436
494
        # A merge with no effect on files
437
495
        if len(self.parents) > 1:
438
496
            return
439
 
        # TODO: we could simplify this by using self.builder.basis_delta.
440
 
 
441
 
        # The initial commit adds a root directory, but this in itself is not
442
 
        # a worthwhile commit.
443
 
        if (self.basis_revid == revision.NULL_REVISION and
444
 
            ((self.builder.new_inventory is not None and
445
 
             len(self.builder.new_inventory) == 1) or
446
 
            len(self.builder._basis_delta) == 1)):
447
 
            raise PointlessCommit()
448
497
        if self.builder.any_changes():
449
498
            return
450
499
        raise PointlessCommit()