~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commit.py

  • Committer: John Arbash Meinel
  • Date: 2011-05-11 11:35:28 UTC
  • mto: This revision was merged to the branch mainline in revision 5851.
  • Revision ID: john@arbash-meinel.com-20110511113528-qepibuwxicjrbb2h
Break compatibility with python <2.6.

This includes auditing the code for places where we were doing
explicit 'sys.version' checks and removing them as appropriate.

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()
407
455
            self._set_progress_stage("Uploading data to master branch")
408
456
            # 'commit' to the master first so a timeout here causes the
409
457
            # local branch to be out of date
410
 
            self.master_branch.import_last_revision_info(
411
 
                self.branch.repository, new_revno, self.rev_id)
 
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)
412
462
 
413
463
        # and now do the commit locally.
414
464
        self.branch.set_last_revision_info(new_revno, self.rev_id)
415
465
 
 
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
 
416
475
        # Make the working tree be up to date with the branch. This
417
476
        # includes automatic changes scheduled to be made to the tree, such
418
477
        # as updating its basis and unversioning paths that were missing.