~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commit.py

  • Committer: Robert Collins
  • Date: 2006-08-08 23:19:29 UTC
  • mfrom: (1884 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1912.
  • Revision ID: robertc@robertcollins.net-20060808231929-4e3e298190214b3a
current status

Show diffs side-by-side

added added

removed removed

Lines of Context:
66
66
import re
67
67
import sys
68
68
import time
69
 
import pdb
 
69
import warnings
70
70
 
71
71
from cStringIO import StringIO
72
72
 
73
73
import bzrlib.config
74
74
import bzrlib.errors as errors
75
75
from bzrlib.errors import (BzrError, PointlessCommit,
76
 
                           HistoryMissing,
77
76
                           ConflictsInTree,
78
77
                           StrictCommitFailed
79
78
                           )
84
83
from bzrlib.trace import mutter, note, warning
85
84
from bzrlib.xml5 import serializer_v5
86
85
from bzrlib.inventory import Inventory, ROOT_ID, InventoryEntry
87
 
from bzrlib.symbol_versioning import *
 
86
from bzrlib.symbol_versioning import (deprecated_passed,
 
87
        deprecated_function,
 
88
        zero_seven,
 
89
        DEPRECATED_PARAMETER)
88
90
from bzrlib.workingtree import WorkingTree
89
91
 
90
92
 
96
98
 
97
99
    New code should use the Commit class instead.
98
100
    """
99
 
    ## XXX: Remove this in favor of Branch.commit?
 
101
    ## XXX: Remove this in favor of WorkingTree.commit?
100
102
    Commit().commit(*args, **kwargs)
101
103
 
102
104
 
219
221
        mutter('preparing to commit')
220
222
 
221
223
        if deprecated_passed(branch):
222
 
            warn("Commit.commit (branch, ...): The branch parameter is "
 
224
            warnings.warn("Commit.commit (branch, ...): The branch parameter is "
223
225
                 "deprecated as of bzr 0.8. Please use working_tree= instead.",
224
226
                 DeprecationWarning, stacklevel=2)
225
227
            self.branch = branch
232
234
        if message is None:
233
235
            raise BzrError("The message keyword parameter is required for commit().")
234
236
 
235
 
        self.weave_store = self.branch.repository.weave_store
236
237
        self.bound_branch = None
237
238
        self.local = local
238
239
        self.master_branch = None
268
269
                    raise StrictCommitFailed()
269
270
                   
270
271
            if self.config is None:
271
 
                self.config = bzrlib.config.BranchConfig(self.branch)
 
272
                self.config = self.branch.get_config()
272
273
      
273
274
            if isinstance(message, str):
274
275
                message = message.decode(bzrlib.user_encoding)
314
315
            # revision data is in the local branch now.
315
316
            
316
317
            # upload revision data to the master.
317
 
            # this will propogate merged revisions too if needed.
 
318
            # this will propagate merged revisions too if needed.
318
319
            if self.bound_branch:
319
320
                self.master_branch.repository.fetch(self.branch.repository,
320
321
                                                    revision_id=self.rev_id)
342
343
            self._emit_progress_update()
343
344
        finally:
344
345
            self._cleanup()
 
346
        return self.rev_id
345
347
 
346
348
    def _check_bound_branch(self):
347
349
        """Check to see if the local branch is bound.
384
386
        self.bound_branch = self.branch
385
387
        self.master_branch.lock_write()
386
388
        self.master_locked = True
387
 
####        
388
 
####        # Check to see if we have any pending merges. If we do
389
 
####        # those need to be pushed into the master branch
390
 
####        pending_merges = self.work_tree.pending_merges()
391
 
####        if pending_merges:
392
 
####            for revision_id in pending_merges:
393
 
####                self.master_branch.repository.fetch(self.bound_branch.repository,
394
 
####                                                    revision_id=revision_id)
395
389
 
396
390
    def _cleanup(self):
397
391
        """Cleanup any open locks, progress bars etc."""
409
403
            except Exception, e:
410
404
                found_exception = e
411
405
        if found_exception is not None: 
412
 
            # dont do a plan raise, because the last exception may have been
 
406
            # don't do a plan raise, because the last exception may have been
413
407
            # trashed, e is our sure-to-work exception even though it loses the
414
408
            # full traceback. XXX: RBC 20060421 perhaps we could check the
415
409
            # exc_info and if its the same one do a plain raise otherwise 
450
444
        """Record the parents of a merge for merge detection."""
451
445
        # TODO: Make sure that this list doesn't contain duplicate 
452
446
        # entries and the order is preserved when doing this.
453
 
        pending_merges = self.work_tree.pending_merges()
454
 
        self.parents = []
 
447
        self.parents = self.work_tree.get_parent_ids()
455
448
        self.parent_invs = []
456
 
        precursor_id = self.branch.last_revision()
457
 
        if precursor_id:
458
 
            self.parents.append(precursor_id)
459
 
        self.parents += pending_merges
460
449
        for revision in self.parents:
461
450
            if self.branch.repository.has_revision(revision):
462
451
                inventory = self.branch.repository.get_inventory(revision)
468
457
            if not self.branch.repository.has_revision(parent_id):
469
458
                if parent_id == self.branch.last_revision():
470
459
                    warning("parent is missing %r", parent_id)
471
 
                    raise HistoryMissing(self.branch, 'revision', parent_id)
472
 
                else:
473
 
                    mutter("commit will ghost revision %r", parent_id)
 
460
                    raise BzrCheckError("branch %s is missing revision {%s}"
 
461
                            % (self.branch, parent_id))
474
462
            
475
463
    def _remove_deleted(self):
476
464
        """Remove deleted files from the working inventories.
507
495
        None; inventory entries that are carried over untouched have their
508
496
        revision set to their prior value.
509
497
        """
 
498
        # ESEPARATIONOFCONCERNS: this function is diffing and using the diff
 
499
        # results to create a new inventory at the same time, which results
 
500
        # in bugs like #46635.  Any reason not to use/enhance compare_trees?
 
501
        # ADHB 11-07-2006
510
502
        mutter("Selecting files for commit with filter %s", self.specific_files)
511
503
        # iter_entries does not visit the ROOT_ID node so we need to call
512
504
        # self._emit_progress_update once by hand.
530
522
 
531
523
            self.builder.record_entry_contents(ie, self.parent_invs, 
532
524
                path, self.work_tree)
533
 
            # describe the nature of the change that has occured relative to
 
525
            # describe the nature of the change that has occurred relative to
534
526
            # the basis inventory.
535
527
            if (self.basis_inv.has_id(ie.file_id)):
536
528
                basis_ie = self.basis_inv[ie.file_id]
544
536
            else:
545
537
                self.reporter.snapshot_change(change, path)
546
538
 
 
539
        if not self.specific_files:
 
540
            return
 
541
 
 
542
        # ignore removals that don't match filespec
 
543
        for path, new_ie in self.basis_inv.iter_entries():
 
544
            if new_ie.file_id in self.work_inv:
 
545
                continue
 
546
            if is_inside_any(self.specific_files, path):
 
547
                continue
 
548
            ie = new_ie.copy()
 
549
            ie.revision = None
 
550
            self.builder.record_entry_contents(ie, self.parent_invs, path,
 
551
                                               self.basis_tree)
 
552
 
547
553
    def _emit_progress_update(self):
548
554
        """Emit an update to the progress bar."""
549
555
        self.pb.update("Committing", self.pb_count, self.pb_total)