/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: John Arbash Meinel
  • Date: 2011-04-20 09:46:28 UTC
  • mfrom: (5609.33.4 2.3)
  • mto: (5609.33.5 2.3)
  • mto: This revision was merged to the branch mainline in revision 5811.
  • Revision ID: john@arbash-meinel.com-20110420094628-l0bafq1lwb6ib1v2
Merge lp:bzr/2.3 @ 5640 so we can update the release notes (aka NEWS)

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
49
49
# TODO: Change the parameter 'rev_id' to 'revision_id' to be consistent with
50
50
# the rest of the code; add a deprecation of the old name.
51
51
 
52
 
import os
53
 
import re
54
 
import sys
55
 
import time
56
 
 
57
 
from cStringIO import StringIO
58
 
 
59
52
from bzrlib import (
60
53
    debug,
61
54
    errors,
62
55
    revision,
63
56
    trace,
64
57
    tree,
65
 
    xml_serializer,
 
58
    ui,
66
59
    )
67
60
from bzrlib.branch import Branch
68
61
from bzrlib.cleanup import OperationWithCleanups
72
65
                           StrictCommitFailed
73
66
                           )
74
67
from bzrlib.osutils import (get_user_encoding,
75
 
                            kind_marker, isdir,isfile, is_inside_any,
76
 
                            is_inside_or_parent_of_any,
 
68
                            is_inside_any,
77
69
                            minimum_path_selection,
78
 
                            quotefn, sha_file, split_lines,
79
70
                            splitpath,
80
71
                            )
81
 
from bzrlib.testament import Testament
82
 
from bzrlib.trace import mutter, note, warning, is_quiet
 
72
from bzrlib.trace import mutter, note, is_quiet
83
73
from bzrlib.inventory import Inventory, InventoryEntry, make_entry
84
74
from bzrlib import symbol_versioning
85
 
from bzrlib.symbol_versioning import (deprecated_passed,
86
 
        deprecated_function,
87
 
        DEPRECATED_PARAMETER)
88
 
from bzrlib.workingtree import WorkingTree
89
75
from bzrlib.urlutils import unescape_for_display
90
 
import bzrlib.ui
91
76
 
92
77
 
93
78
class NullCommitReporter(object):
147
132
 
148
133
    def completed(self, revno, rev_id):
149
134
        self._note('Committed revision %d.', revno)
 
135
        # self._note goes to the console too; so while we want to log the
 
136
        # rev_id, we can't trivially only log it. (See bug 526425). Long
 
137
        # term we should rearrange the reporting structure, but for now
 
138
        # we just mutter seperately. We mutter the revid and revno together
 
139
        # so that concurrent bzr invocations won't lead to confusion.
 
140
        mutter('Committed revid %s as revno %d.', rev_id, revno)
150
141
 
151
142
    def deleted(self, path):
152
143
        self._note('deleted %s', path)
183
174
        self.reporter = reporter
184
175
        self.config = config
185
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
 
186
214
    def commit(self,
187
215
               message=None,
188
216
               timestamp=None,
236
264
            commit.
237
265
        """
238
266
        operation = OperationWithCleanups(self._commit)
 
267
        self.revprops = revprops or {}
 
268
        # XXX: Can be set on __init__ or passed in - this is a bit ugly.
 
269
        self.config = config or self.config
239
270
        return operation.run(
240
271
               message=message,
241
272
               timestamp=timestamp,
246
277
               allow_pointless=allow_pointless,
247
278
               strict=strict,
248
279
               verbose=verbose,
249
 
               revprops=revprops,
250
280
               working_tree=working_tree,
251
281
               local=local,
252
282
               reporter=reporter,
253
 
               config=config,
254
283
               message_callback=message_callback,
255
284
               recursive=recursive,
256
285
               exclude=exclude,
257
286
               possible_master_transports=possible_master_transports)
258
287
 
259
288
    def _commit(self, operation, message, timestamp, timezone, committer,
260
 
            specific_files, rev_id, allow_pointless, strict, verbose, revprops,
261
 
            working_tree, local, reporter, config, message_callback, recursive,
 
289
            specific_files, rev_id, allow_pointless, strict, verbose,
 
290
            working_tree, local, reporter, message_callback, recursive,
262
291
            exclude, possible_master_transports):
263
292
        mutter('preparing to commit')
264
293
 
299
328
            self.specific_files = None
300
329
            
301
330
        self.allow_pointless = allow_pointless
302
 
        self.revprops = revprops
303
331
        self.message_callback = message_callback
304
332
        self.timestamp = timestamp
305
333
        self.timezone = timezone
318
346
            not self.branch.repository._format.supports_tree_reference and
319
347
            (self.branch.repository._format.fast_deltas or
320
348
             len(self.parents) < 2))
321
 
        self.pb = bzrlib.ui.ui_factory.nested_progress_bar()
 
349
        self.pb = ui.ui_factory.nested_progress_bar()
322
350
        operation.add_cleanup(self.pb.finished)
323
351
        self.basis_revid = self.work_tree.last_revision()
324
352
        self.basis_tree = self.work_tree.basis_tree()
352
380
        self.pb_stage_count = 0
353
381
        self.pb_stage_total = 5
354
382
        if self.bound_branch:
355
 
            self.pb_stage_total += 1
 
383
            # 2 extra stages: "Uploading data to master branch" and "Merging
 
384
            # tags to master branch"
 
385
            self.pb_stage_total += 2
356
386
        self.pb.show_pct = False
357
387
        self.pb.show_spinner = False
358
388
        self.pb.show_eta = False
371
401
        # Collect the changes
372
402
        self._set_progress_stage("Collecting changes", counter=True)
373
403
        self.builder = self.branch.get_commit_builder(self.parents,
374
 
            self.config, timestamp, timezone, committer, revprops, rev_id)
 
404
            self.config, timestamp, timezone, committer, self.revprops, rev_id)
375
405
 
376
406
        try:
377
407
            self.builder.will_record_deletes()
422
452
        # and now do the commit locally.
423
453
        self.branch.set_last_revision_info(new_revno, self.rev_id)
424
454
 
 
455
        # Merge local tags to remote
 
456
        if self.bound_branch:
 
457
            self._set_progress_stage("Merging tags to master branch")
 
458
            tag_conflicts = self.branch.tags.merge_to(self.master_branch.tags)
 
459
            if tag_conflicts:
 
460
                warning_lines = ['    ' + name for name, _, _ in tag_conflicts]
 
461
                note("Conflicting tags in bound branch:\n" +
 
462
                    "\n".join(warning_lines))
 
463
 
425
464
        # Make the working tree be up to date with the branch. This
426
465
        # includes automatic changes scheduled to be made to the tree, such
427
466
        # as updating its basis and unversioning paths that were missing.