bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 1704.2.14
by Martin Pool [merge] work from 0.8 fixes | 1 | # Copyright (C) 2005, 2006 Canonical Ltd
 | 
| 2 | ||
| 485
by Martin Pool - move commit code into its own module | 3 | # This program is free software; you can redistribute it and/or modify
 | 
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 1248
by Martin Pool - new weave based cleanup [broken] | 7 | #
 | 
| 485
by Martin Pool - move commit code into its own module | 8 | # This program is distributed in the hope that it will be useful,
 | 
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 1248
by Martin Pool - new weave based cleanup [broken] | 12 | #
 | 
| 485
by Martin Pool - move commit code into its own module | 13 | # You should have received a copy of the GNU General Public License
 | 
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 16 | ||
| 17 | ||
| 1248
by Martin Pool - new weave based cleanup [broken] | 18 | # XXX: Can we do any better about making interrupted commits change
 | 
| 19 | # nothing?  Perhaps the best approach is to integrate commit of
 | |
| 20 | # AtomicFiles with releasing the lock on the Branch.
 | |
| 21 | ||
| 22 | # TODO: Separate 'prepare' phase where we find a list of potentially
 | |
| 23 | # committed files.  We then can then pause the commit to prompt for a
 | |
| 24 | # commit message, knowing the summary will be the same as what's
 | |
| 25 | # actually used for the commit.  (But perhaps simpler to simply get
 | |
| 26 | # the tree status, then use that for a selective commit?)
 | |
| 27 | ||
| 28 | # The newly committed revision is going to have a shape corresponding
 | |
| 29 | # to that of the working inventory.  Files that are not in the
 | |
| 30 | # working tree and that were in the predecessor are reported as
 | |
| 31 | # removed --- this can include files that were either removed from the
 | |
| 32 | # inventory or deleted in the working tree.  If they were only
 | |
| 33 | # deleted from disk, they are removed from the working inventory.
 | |
| 34 | ||
| 35 | # We then consider the remaining entries, which will be in the new
 | |
| 36 | # version.  Directory entries are simply copied across.  File entries
 | |
| 37 | # must be checked to see if a new version of the file should be
 | |
| 38 | # recorded.  For each parent revision inventory, we check to see what
 | |
| 39 | # version of the file was present.  If the file was present in at
 | |
| 40 | # least one tree, and if it was the same version in all the trees,
 | |
| 41 | # then we can just refer to that version.  Otherwise, a new version
 | |
| 42 | # representing the merger of the file versions must be added.
 | |
| 43 | ||
| 44 | # TODO: Update hashcache before and after - or does the WorkingTree
 | |
| 45 | # look after that?
 | |
| 1245
by Martin Pool doc | 46 | |
| 1339
by Martin Pool - doc | 47 | # TODO: Rather than mashing together the ancestry and storing it back,
 | 
| 48 | # perhaps the weave should have single method which does it all in one
 | |
| 49 | # go, avoiding a lot of redundant work.
 | |
| 1335
by Martin Pool doc | 50 | |
| 1341
by Martin Pool - doc | 51 | # TODO: Perhaps give a warning if one of the revisions marked as
 | 
| 52 | # merged is already in the ancestry, and then don't record it as a
 | |
| 53 | # distinct parent.
 | |
| 54 | ||
| 1343
by Martin Pool - fix up test for merge of trees | 55 | # TODO: If the file is newly merged but unchanged from the version it
 | 
| 56 | # merges from, then it should still be reported as newly added
 | |
| 57 | # relative to the basis revision.
 | |
| 58 | ||
| 1185.16.66
by mbp at sourcefrog - todo | 59 | # TODO: Do checks that the tree can be committed *before* running the 
 | 
| 60 | # editor; this should include checks for a pointless commit and for 
 | |
| 61 | # unknown or missing files.
 | |
| 62 | ||
| 63 | # TODO: If commit fails, leave the message in a file somewhere.
 | |
| 64 | ||
| 1194
by Martin Pool - [BROKEN] more progress of commit into weaves | 65 | |
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 66 | import os | 
| 1390
by Robert Collins pair programming worx... merge integration and weave | 67 | import re | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 68 | import sys | 
| 1188
by Martin Pool - clean up imports in commit code | 69 | import time | 
| 1773.4.1
by Martin Pool Add pyflakes makefile target; fix many warnings | 70 | import warnings | 
| 1194
by Martin Pool - [BROKEN] more progress of commit into weaves | 71 | |
| 72 | from cStringIO import StringIO | |
| 1188
by Martin Pool - clean up imports in commit code | 73 | |
| 1508.1.6
by Robert Collins Move Branch.unknowns() to WorkingTree. | 74 | from bzrlib.atomicfile import AtomicFile | 
| 1442.1.2
by Robert Collins create a config module - there is enough config logic to make this worthwhile, and start testing config processing. | 75 | import bzrlib.config | 
| 1508.1.22
by Robert Collins implement out of date working tree checks in commit. | 76 | import bzrlib.errors as errors | 
| 1264
by Martin Pool - Raise a better error from commit when a parent is absent | 77 | from bzrlib.errors import (BzrError, PointlessCommit, | 
| 1185.16.65
by mbp at sourcefrog - new commit --strict option | 78 | ConflictsInTree, | 
| 79 |                            StrictCommitFailed
 | |
| 1264
by Martin Pool - Raise a better error from commit when a parent is absent | 80 |                            )
 | 
| 1740.3.10
by Jelmer Vernooij Fix some minor issues pointed out by j-a-m. | 81 | from bzrlib.osutils import (kind_marker, isdir,isfile, is_inside_any, | 
| 82 | is_inside_or_parent_of_any, | |
| 83 | quotefn, sha_file, split_lines) | |
| 1442.1.62
by Robert Collins Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions. | 84 | from bzrlib.testament import Testament | 
| 1264
by Martin Pool - Raise a better error from commit when a parent is absent | 85 | from bzrlib.trace import mutter, note, warning | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 86 | from bzrlib.xml5 import serializer_v5 | 
| 1668.1.5
by Martin Pool [broken] fix up display of files changed by a commit | 87 | from bzrlib.inventory import Inventory, ROOT_ID, InventoryEntry | 
| 1773.4.1
by Martin Pool Add pyflakes makefile target; fix many warnings | 88 | from bzrlib.symbol_versioning import (deprecated_passed, | 
| 1773.4.3
by Martin Pool [merge] bzr.dev | 89 | deprecated_function, | 
| 90 | zero_seven, | |
| 1773.4.1
by Martin Pool Add pyflakes makefile target; fix many warnings | 91 | DEPRECATED_PARAMETER) | 
| 1508.1.6
by Robert Collins Move Branch.unknowns() to WorkingTree. | 92 | from bzrlib.workingtree import WorkingTree | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 93 | |
| 94 | ||
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 95 | @deprecated_function(zero_seven) | 
| 1205
by Martin Pool - add bzrlib.commit.commit compatability interface | 96 | def commit(*args, **kwargs): | 
| 97 | """Commit a new revision to a branch. | |
| 98 | ||
| 99 |     Function-style interface for convenience of old callers.
 | |
| 100 | ||
| 101 |     New code should use the Commit class instead.
 | |
| 102 |     """
 | |
| 1773.1.1
by Robert Collins Teach WorkingTree.commit to return the committed revision id. | 103 |     ## XXX: Remove this in favor of WorkingTree.commit?
 | 
| 1205
by Martin Pool - add bzrlib.commit.commit compatability interface | 104 | Commit().commit(*args, **kwargs) | 
| 105 | ||
| 106 | ||
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 107 | class NullCommitReporter(object): | 
| 108 | """I report on progress of a commit.""" | |
| 1185.12.8
by Aaron Bentley Fixed commit so all output comes though CommitReporter | 109 | |
| 110 | def snapshot_change(self, change, path): | |
| 111 |         pass
 | |
| 112 | ||
| 113 | def completed(self, revno, rev_id): | |
| 114 |         pass
 | |
| 115 | ||
| 116 | def deleted(self, file_id): | |
| 117 |         pass
 | |
| 118 | ||
| 119 | def escaped(self, escape_count, message): | |
| 120 |         pass
 | |
| 121 | ||
| 122 | def missing(self, path): | |
| 123 |         pass
 | |
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 124 | |
| 1668.1.5
by Martin Pool [broken] fix up display of files changed by a commit | 125 | def renamed(self, change, old_path, new_path): | 
| 126 |         pass
 | |
| 127 | ||
| 1508.1.6
by Robert Collins Move Branch.unknowns() to WorkingTree. | 128 | |
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 129 | class ReportCommitToLog(NullCommitReporter): | 
| 1185.12.8
by Aaron Bentley Fixed commit so all output comes though CommitReporter | 130 | |
| 1668.1.5
by Martin Pool [broken] fix up display of files changed by a commit | 131 |     # this may be more useful if 'note' was replaced by an overridable
 | 
| 132 |     # method on self, which would allow more trivial subclassing.
 | |
| 133 |     # alternative, a callable could be passed in, allowing really trivial
 | |
| 134 |     # reuse for some uis. RBC 20060511
 | |
| 135 | ||
| 1185.12.8
by Aaron Bentley Fixed commit so all output comes though CommitReporter | 136 | def snapshot_change(self, change, path): | 
| 1616.1.4
by Martin Pool Verbose commit shouldn't talk about every unchanged file. | 137 | if change == 'unchanged': | 
| 138 |             return
 | |
| 1185.12.8
by Aaron Bentley Fixed commit so all output comes though CommitReporter | 139 | note("%s %s", change, path) | 
| 140 | ||
| 141 | def completed(self, revno, rev_id): | |
| 1607.1.5
by Robert Collins Make commit verbose mode work!. | 142 | note('Committed revision %d.', revno) | 
| 1185.12.8
by Aaron Bentley Fixed commit so all output comes though CommitReporter | 143 | |
| 144 | def deleted(self, file_id): | |
| 145 | note('deleted %s', file_id) | |
| 146 | ||
| 147 | def escaped(self, escape_count, message): | |
| 148 | note("replaced %d control characters in message", escape_count) | |
| 149 | ||
| 150 | def missing(self, path): | |
| 151 | note('missing %s', path) | |
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 152 | |
| 1668.1.5
by Martin Pool [broken] fix up display of files changed by a commit | 153 | def renamed(self, change, old_path, new_path): | 
| 154 | note('%s %s => %s', change, old_path, new_path) | |
| 155 | ||
| 1508.1.6
by Robert Collins Move Branch.unknowns() to WorkingTree. | 156 | |
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 157 | class Commit(object): | 
| 158 | """Task of committing a new revision. | |
| 159 | ||
| 160 |     This is a MethodObject: it accumulates state as the commit is
 | |
| 161 |     prepared, and then it is discarded.  It doesn't represent
 | |
| 162 |     historical revisions, just the act of recording a new one.
 | |
| 163 | ||
| 164 |             missing_ids
 | |
| 165 |             Modified to hold a list of files that have been deleted from
 | |
| 166 |             the working directory; these should be removed from the
 | |
| 167 |             working inventory.
 | |
| 485
by Martin Pool - move commit code into its own module | 168 |     """
 | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 169 | def __init__(self, | 
| 1442.1.60
by Robert Collins gpg sign commits if the policy says we need to | 170 | reporter=None, | 
| 171 | config=None): | |
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 172 | if reporter is not None: | 
| 173 | self.reporter = reporter | |
| 174 | else: | |
| 175 | self.reporter = NullCommitReporter() | |
| 1442.1.60
by Robert Collins gpg sign commits if the policy says we need to | 176 | if config is not None: | 
| 177 | self.config = config | |
| 178 | else: | |
| 179 | self.config = None | |
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 180 | |
| 181 | def commit(self, | |
| 1534.4.32
by Robert Collins Rename deprecated_nonce to DEPRECATED_PARAMETER | 182 | branch=DEPRECATED_PARAMETER, message=None, | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 183 | timestamp=None, | 
| 184 | timezone=None, | |
| 185 | committer=None, | |
| 186 | specific_files=None, | |
| 187 | rev_id=None, | |
| 1276
by Martin Pool - make Branch.commit accept (and ignore) verbose argument | 188 | allow_pointless=True, | 
| 1185.16.65
by mbp at sourcefrog - new commit --strict option | 189 | strict=False, | 
| 1185.16.35
by Martin Pool - stub for revision properties | 190 | verbose=False, | 
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 191 | revprops=None, | 
| 1587.1.8
by Robert Collins Local commits on unbound branches fail. | 192 | working_tree=None, | 
| 1607.1.5
by Robert Collins Make commit verbose mode work!. | 193 | local=False, | 
| 194 | reporter=None, | |
| 195 | config=None): | |
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 196 | """Commit working copy as a new revision. | 
| 197 | ||
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 198 |         branch -- the deprecated branch to commit to. New callers should pass in 
 | 
| 199 |                   working_tree instead
 | |
| 200 | ||
| 201 |         message -- the commit message, a mandatory parameter
 | |
| 202 | ||
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 203 |         timestamp -- if not None, seconds-since-epoch for a
 | 
| 204 |              postdated/predated commit.
 | |
| 205 | ||
| 1253
by Martin Pool - test that pointless commits are trapped | 206 |         specific_files -- If true, commit only those files.
 | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 207 | |
| 1253
by Martin Pool - test that pointless commits are trapped | 208 |         rev_id -- If set, use this as the new revision id.
 | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 209 |             Useful for test or import commands that need to tightly
 | 
| 210 |             control what revisions are assigned.  If you duplicate
 | |
| 211 |             a revision id that exists elsewhere it is your own fault.
 | |
| 212 |             If null (default), a time/random revision id is generated.
 | |
| 1253
by Martin Pool - test that pointless commits are trapped | 213 | |
| 214 |         allow_pointless -- If true (default), commit even if nothing
 | |
| 215 |             has changed and no merges are recorded.
 | |
| 1185.16.35
by Martin Pool - stub for revision properties | 216 | |
| 1185.16.65
by mbp at sourcefrog - new commit --strict option | 217 |         strict -- If true, don't allow a commit if the working tree
 | 
| 218 |             contains unknown files.
 | |
| 219 | ||
| 1185.16.35
by Martin Pool - stub for revision properties | 220 |         revprops -- Properties for new revision
 | 
| 1587.1.8
by Robert Collins Local commits on unbound branches fail. | 221 |         :param local: Perform a local only commit.
 | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 222 |         """
 | 
| 1285
by Martin Pool - fix bug in committing files that are renamed but not modified | 223 | mutter('preparing to commit') | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 224 | |
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 225 | if deprecated_passed(branch): | 
| 1773.4.1
by Martin Pool Add pyflakes makefile target; fix many warnings | 226 | warnings.warn("Commit.commit (branch, ...): The branch parameter is " | 
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 227 | "deprecated as of bzr 0.8. Please use working_tree= instead.", | 
| 1534.4.26
by Robert Collins Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create. | 228 | DeprecationWarning, stacklevel=2) | 
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 229 | self.branch = branch | 
| 1508.1.19
by Robert Collins Give format3 working trees their own last-revision marker. | 230 | self.work_tree = self.branch.bzrdir.open_workingtree() | 
| 1534.4.25
by Robert Collins Add a --transport parameter to the test suite to set the default transport to be used in the test suite. | 231 | elif working_tree is None: | 
| 232 | raise BzrError("One of branch and working_tree must be passed into commit().") | |
| 233 | else: | |
| 234 | self.work_tree = working_tree | |
| 235 | self.branch = self.work_tree.branch | |
| 236 | if message is None: | |
| 237 | raise BzrError("The message keyword parameter is required for commit().") | |
| 238 | ||
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 239 | self.bound_branch = None | 
| 1587.1.9
by Robert Collins Local commits do no alter or access the master branch. | 240 | self.local = local | 
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 241 | self.master_branch = None | 
| 1614.1.1
by Aaron Bentley Fixed master locking in commit | 242 | self.master_locked = False | 
| 1740.3.10
by Jelmer Vernooij Fix some minor issues pointed out by j-a-m. | 243 | self.rev_id = None | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 244 | self.specific_files = specific_files | 
| 1194
by Martin Pool - [BROKEN] more progress of commit into weaves | 245 | self.allow_pointless = allow_pointless | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 246 | |
| 1607.1.5
by Robert Collins Make commit verbose mode work!. | 247 | if reporter is None and self.reporter is None: | 
| 248 | self.reporter = NullCommitReporter() | |
| 1607.1.8
by Robert Collins Integrate latest bzr.dev. | 249 | elif reporter is not None: | 
| 1607.1.5
by Robert Collins Make commit verbose mode work!. | 250 | self.reporter = reporter | 
| 251 | ||
| 1587.1.6
by Robert Collins Update bound branch implementation to 0.8. | 252 | self.work_tree.lock_write() | 
| 1666.1.18
by Robert Collins Add a progress bar during commit operations. | 253 | self.pb = bzrlib.ui.ui_factory.nested_progress_bar() | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 254 | try: | 
| 1666.1.18
by Robert Collins Add a progress bar during commit operations. | 255 |             # Cannot commit with conflicts present.
 | 
| 256 | if len(self.work_tree.conflicts())>0: | |
| 257 | raise ConflictsInTree | |
| 258 | ||
| 1587.1.6
by Robert Collins Update bound branch implementation to 0.8. | 259 |             # setup the bound branch variables as needed.
 | 
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 260 | self._check_bound_branch() | 
| 261 | ||
| 1587.1.6
by Robert Collins Update bound branch implementation to 0.8. | 262 |             # check for out of date working trees
 | 
| 263 |             # if we are bound, then self.branch is the master branch and this
 | |
| 264 |             # test is thus all we need.
 | |
| 1587.1.8
by Robert Collins Local commits on unbound branches fail. | 265 | if self.work_tree.last_revision() != self.master_branch.last_revision(): | 
| 1587.1.6
by Robert Collins Update bound branch implementation to 0.8. | 266 | raise errors.OutOfDateTree(self.work_tree) | 
| 267 | ||
| 268 | if strict: | |
| 269 |                 # raise an exception as soon as we find a single unknown.
 | |
| 270 | for unknown in self.work_tree.unknowns(): | |
| 271 | raise StrictCommitFailed() | |
| 1740.3.7
by Jelmer Vernooij Move committer, log, revprops, timestamp and timezone to CommitBuilder. | 272 | |
| 1587.1.6
by Robert Collins Update bound branch implementation to 0.8. | 273 | if self.config is None: | 
| 274 | self.config = bzrlib.config.BranchConfig(self.branch) | |
| 1740.3.7
by Jelmer Vernooij Move committer, log, revprops, timestamp and timezone to CommitBuilder. | 275 | |
| 1587.1.6
by Robert Collins Update bound branch implementation to 0.8. | 276 | if isinstance(message, str): | 
| 277 | message = message.decode(bzrlib.user_encoding) | |
| 278 | assert isinstance(message, unicode), type(message) | |
| 279 | self.message = message | |
| 280 | self._escape_commit_message() | |
| 281 | ||
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 282 | self.work_inv = self.work_tree.inventory | 
| 1534.4.35
by Robert Collins Give branch its own basis tree and last_revision methods; deprecated branch.working_tree() | 283 | self.basis_tree = self.work_tree.basis_tree() | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 284 | self.basis_inv = self.basis_tree.inventory | 
| 1666.1.18
by Robert Collins Add a progress bar during commit operations. | 285 |             # one to finish, one for rev and inventory, and one for each
 | 
| 286 |             # inventory entry, and the same for the new inventory.
 | |
| 287 |             # note that this estimate is too long when we do a partial tree
 | |
| 288 |             # commit which excludes some new files from being considered.
 | |
| 289 |             # The estimate is corrected when we populate the new inv.
 | |
| 1740.3.10
by Jelmer Vernooij Fix some minor issues pointed out by j-a-m. | 290 | self.pb_total = len(self.work_inv) + 5 | 
| 1666.1.18
by Robert Collins Add a progress bar during commit operations. | 291 | self.pb_count = 0 | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 292 | |
| 1223
by Martin Pool - store inventories in weave | 293 | self._gather_parents() | 
| 1344
by Martin Pool - disallow selected-file commit of merges | 294 | if len(self.parents) > 1 and self.specific_files: | 
| 1704.2.11
by Martin Pool Handle 'bzr commit DIR' when dir contains pending merges. | 295 | raise NotImplementedError('selected-file commit of merges is not supported yet: files %r', | 
| 296 | self.specific_files) | |
| 1284
by Martin Pool - in commit, avoid reading basis inventory twice | 297 | self._check_parents_present() | 
| 1740.3.7
by Jelmer Vernooij Move committer, log, revprops, timestamp and timezone to CommitBuilder. | 298 | self.builder = self.branch.get_commit_builder(self.parents, | 
| 299 | self.config, timestamp, timezone, committer, revprops, rev_id) | |
| 1284
by Martin Pool - in commit, avoid reading basis inventory twice | 300 | |
| 1251
by Martin Pool - fix up commit in directory with some deleted files | 301 | self._remove_deleted() | 
| 1092.2.22
by Robert Collins text_version and name_version unification looking reasonable | 302 | self._populate_new_inv() | 
| 1248
by Martin Pool - new weave based cleanup [broken] | 303 | self._report_deletes() | 
| 1245
by Martin Pool doc | 304 | |
| 1248
by Martin Pool - new weave based cleanup [broken] | 305 | if not (self.allow_pointless | 
| 1279
by Martin Pool - pointless commit of r1 no longer allowed | 306 | or len(self.parents) > 1 | 
| 1740.3.4
by Jelmer Vernooij Move inventory to commit builder. | 307 | or self.builder.new_inventory != self.basis_inv): | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 308 | raise PointlessCommit() | 
| 309 | ||
| 1666.1.22
by Robert Collins Rename Commit._update to _emit_progress_update. | 310 | self._emit_progress_update() | 
| 1740.3.9
by Jelmer Vernooij Make the commit message the first argument of CommitBuilder.commit(). | 311 |             # TODO: Now the new inventory is known, check for conflicts and prompt the 
 | 
| 312 |             # user for a commit message.
 | |
| 1740.3.8
by Jelmer Vernooij Move make_revision() to commit builder. | 313 | self.builder.finish_inventory() | 
| 1666.1.22
by Robert Collins Rename Commit._update to _emit_progress_update. | 314 | self._emit_progress_update() | 
| 1740.3.9
by Jelmer Vernooij Make the commit message the first argument of CommitBuilder.commit(). | 315 | self.rev_id = self.builder.commit(self.message) | 
| 1740.3.10
by Jelmer Vernooij Fix some minor issues pointed out by j-a-m. | 316 | self._emit_progress_update() | 
| 1587.1.7
by Robert Collins Commit revision data locally first for bound branch commits. | 317 |             # revision data is in the local branch now.
 | 
| 1587.1.6
by Robert Collins Update bound branch implementation to 0.8. | 318 | |
| 1587.1.7
by Robert Collins Commit revision data locally first for bound branch commits. | 319 |             # upload revision data to the master.
 | 
| 1759.2.1
by Jelmer Vernooij Fix some types (found using aspell). | 320 |             # this will propagate merged revisions too if needed.
 | 
| 1587.1.7
by Robert Collins Commit revision data locally first for bound branch commits. | 321 | if self.bound_branch: | 
| 322 | self.master_branch.repository.fetch(self.branch.repository, | |
| 323 | revision_id=self.rev_id) | |
| 324 |                 # now the master has the revision data
 | |
| 325 |                 # 'commit' to the master first so a timeout here causes the local
 | |
| 326 |                 # branch to be out of date
 | |
| 327 | self.master_branch.append_revision(self.rev_id) | |
| 328 | ||
| 329 |             # and now do the commit locally.
 | |
| 1194
by Martin Pool - [BROKEN] more progress of commit into weaves | 330 | self.branch.append_revision(self.rev_id) | 
| 1587.1.6
by Robert Collins Update bound branch implementation to 0.8. | 331 | |
| 1185.33.59
by Martin Pool [patch] keep a cached basis inventory (Johan Rydberg) | 332 | self.work_tree.set_pending_merges([]) | 
| 1638.1.2
by Robert Collins Change the basis-inventory file to not have the revision-id in the file name. | 333 | self.work_tree.set_last_revision(self.rev_id) | 
| 1587.1.6
by Robert Collins Update bound branch implementation to 0.8. | 334 |             # now the work tree is up to date with the branch
 | 
| 335 | ||
| 1607.1.5
by Robert Collins Make commit verbose mode work!. | 336 | self.reporter.completed(self.branch.revno(), self.rev_id) | 
| 1472
by Robert Collins post commit hook, first pass implementation | 337 | if self.config.post_commit() is not None: | 
| 338 | hooks = self.config.post_commit().split(' ') | |
| 339 |                 # this would be nicer with twisted.python.reflect.namedAny
 | |
| 340 | for hook in hooks: | |
| 341 | result = eval(hook + '(branch, rev_id)', | |
| 342 | {'branch':self.branch, | |
| 343 | 'bzrlib':bzrlib, | |
| 344 | 'rev_id':self.rev_id}) | |
| 1666.1.22
by Robert Collins Rename Commit._update to _emit_progress_update. | 345 | self._emit_progress_update() | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 346 | finally: | 
| 1666.1.18
by Robert Collins Add a progress bar during commit operations. | 347 | self._cleanup() | 
| 1773.1.1
by Robert Collins Teach WorkingTree.commit to return the committed revision id. | 348 | return self.rev_id | 
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 349 | |
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 350 | def _check_bound_branch(self): | 
| 351 | """Check to see if the local branch is bound. | |
| 352 | ||
| 353 |         If it is bound, then most of the commit will actually be
 | |
| 354 |         done using the remote branch as the target branch.
 | |
| 355 |         Only at the end will the local branch be updated.
 | |
| 356 |         """
 | |
| 1587.1.9
by Robert Collins Local commits do no alter or access the master branch. | 357 | if self.local and not self.branch.get_bound_location(): | 
| 358 | raise errors.LocalRequiresBoundBranch() | |
| 359 | ||
| 360 | if not self.local: | |
| 361 | self.master_branch = self.branch.get_master_branch() | |
| 362 | ||
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 363 | if not self.master_branch: | 
| 1587.1.8
by Robert Collins Local commits on unbound branches fail. | 364 |             # make this branch the reference branch for out of date checks.
 | 
| 365 | self.master_branch = self.branch | |
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 366 |             return
 | 
| 367 | ||
| 368 |         # If the master branch is bound, we must fail
 | |
| 369 | master_bound_location = self.master_branch.get_bound_location() | |
| 370 | if master_bound_location: | |
| 1505.1.27
by John Arbash Meinel Adding tests against an sftp branch. | 371 | raise errors.CommitToDoubleBoundBranch(self.branch, | 
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 372 | self.master_branch, master_bound_location) | 
| 373 | ||
| 374 |         # TODO: jam 20051230 We could automatically push local
 | |
| 375 |         #       commits to the remote branch if they would fit.
 | |
| 376 |         #       But for now, just require remote to be identical
 | |
| 377 |         #       to local.
 | |
| 378 | ||
| 379 |         # Make sure the local branch is identical to the master
 | |
| 380 | master_rh = self.master_branch.revision_history() | |
| 381 | local_rh = self.branch.revision_history() | |
| 382 | if local_rh != master_rh: | |
| 383 | raise errors.BoundBranchOutOfDate(self.branch, | |
| 384 | self.master_branch) | |
| 385 | ||
| 386 |         # Now things are ready to change the master branch
 | |
| 387 |         # so grab the lock
 | |
| 388 | self.bound_branch = self.branch | |
| 389 | self.master_branch.lock_write() | |
| 1614.1.1
by Aaron Bentley Fixed master locking in commit | 390 | self.master_locked = True | 
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 391 | |
| 1666.1.18
by Robert Collins Add a progress bar during commit operations. | 392 | def _cleanup(self): | 
| 393 | """Cleanup any open locks, progress bars etc.""" | |
| 394 | cleanups = [self._cleanup_bound_branch, | |
| 395 | self.work_tree.unlock, | |
| 396 | self.pb.finished] | |
| 397 | found_exception = None | |
| 398 | for cleanup in cleanups: | |
| 399 | try: | |
| 400 | cleanup() | |
| 401 |             # we want every cleanup to run no matter what.
 | |
| 402 |             # so we have a catchall here, but we will raise the
 | |
| 403 |             # last encountered exception up the stack: and
 | |
| 404 |             # typically this will be useful enough.
 | |
| 405 | except Exception, e: | |
| 406 | found_exception = e | |
| 407 | if found_exception is not None: | |
| 1759.2.2
by Jelmer Vernooij Revert some of my spelling fixes and fix some typos after review by Aaron. | 408 |             # don't do a plan raise, because the last exception may have been
 | 
| 1666.1.18
by Robert Collins Add a progress bar during commit operations. | 409 |             # trashed, e is our sure-to-work exception even though it loses the
 | 
| 410 |             # full traceback. XXX: RBC 20060421 perhaps we could check the
 | |
| 411 |             # exc_info and if its the same one do a plain raise otherwise 
 | |
| 412 |             # 'raise e' as we do now.
 | |
| 413 | raise e | |
| 414 | ||
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 415 | def _cleanup_bound_branch(self): | 
| 416 | """Executed at the end of a try/finally to cleanup a bound branch. | |
| 417 | ||
| 418 |         If the branch wasn't bound, this is a no-op.
 | |
| 419 |         If it was, it resents self.branch to the local branch, instead
 | |
| 420 |         of being the master.
 | |
| 421 |         """
 | |
| 422 | if not self.bound_branch: | |
| 423 |             return
 | |
| 1614.1.1
by Aaron Bentley Fixed master locking in commit | 424 | if self.master_locked: | 
| 425 | self.master_branch.unlock() | |
| 1505.1.24
by John Arbash Meinel Updated commit to handle bound branches. Included test to handle commit after merge | 426 | |
| 1390
by Robert Collins pair programming worx... merge integration and weave | 427 | def _escape_commit_message(self): | 
| 428 | """Replace xml-incompatible control characters.""" | |
| 1666.1.6
by Robert Collins Make knit the default format. | 429 |         # FIXME: RBC 20060419 this should be done by the revision
 | 
| 430 |         # serialiser not by commit. Then we can also add an unescaper
 | |
| 431 |         # in the deserializer and start roundtripping revision messages
 | |
| 432 |         # precisely. See repository_implementations/test_repository.py
 | |
| 433 | ||
| 1185.11.5
by John Arbash Meinel Merged up-to-date against mainline, still broken. | 434 |         # Python strings can include characters that can't be
 | 
| 435 |         # represented in well-formed XML; escape characters that
 | |
| 436 |         # aren't listed in the XML specification
 | |
| 437 |         # (http://www.w3.org/TR/REC-xml/#NT-Char).
 | |
| 1390
by Robert Collins pair programming worx... merge integration and weave | 438 | self.message, escape_count = re.subn( | 
| 1393.4.2
by Harald Meland Cleanup + better test of commit-msg control character escape code. | 439 | u'[^\x09\x0A\x0D\u0020-\uD7FF\uE000-\uFFFD]+', | 
| 1185.11.5
by John Arbash Meinel Merged up-to-date against mainline, still broken. | 440 | lambda match: match.group(0).encode('unicode_escape'), | 
| 1390
by Robert Collins pair programming worx... merge integration and weave | 441 | self.message) | 
| 1185.11.5
by John Arbash Meinel Merged up-to-date against mainline, still broken. | 442 | if escape_count: | 
| 1185.12.8
by Aaron Bentley Fixed commit so all output comes though CommitReporter | 443 | self.reporter.escaped(escape_count, self.message) | 
| 1223
by Martin Pool - store inventories in weave | 444 | |
| 445 | def _gather_parents(self): | |
| 1092.2.25
by Robert Collins support ghosts in commits | 446 | """Record the parents of a merge for merge detection.""" | 
| 1740.3.6
by Jelmer Vernooij Move inventory writing to the commit builder. | 447 |         # TODO: Make sure that this list doesn't contain duplicate 
 | 
| 448 |         # entries and the order is preserved when doing this.
 | |
| 1773.2.1
by Robert Collins Teach all trees about unknowns, conflicts and get_parent_ids. | 449 | self.parents = self.work_tree.get_parent_ids() | 
| 1408
by Robert Collins we do not need revision_trees in commit, parent inventories are sufficient | 450 | self.parent_invs = [] | 
| 1092.2.25
by Robert Collins support ghosts in commits | 451 | for revision in self.parents: | 
| 1185.67.2
by Aaron Bentley Renamed Branch.storage to Branch.repository | 452 | if self.branch.repository.has_revision(revision): | 
| 453 | inventory = self.branch.repository.get_inventory(revision) | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 454 | self.parent_invs.append(inventory) | 
| 1284
by Martin Pool - in commit, avoid reading basis inventory twice | 455 | |
| 456 | def _check_parents_present(self): | |
| 1264
by Martin Pool - Raise a better error from commit when a parent is absent | 457 | for parent_id in self.parents: | 
| 1270
by Martin Pool - fix recording of merged ancestry lines | 458 | mutter('commit parent revision {%s}', parent_id) | 
| 1185.67.2
by Aaron Bentley Renamed Branch.storage to Branch.repository | 459 | if not self.branch.repository.has_revision(parent_id): | 
| 1092.2.25
by Robert Collins support ghosts in commits | 460 | if parent_id == self.branch.last_revision(): | 
| 1185.12.9
by Aaron Bentley Removed crude language | 461 | warning("parent is missing %r", parent_id) | 
| 1740.5.6
by Martin Pool Clean up many exception classes. | 462 | raise BzrCheckError("branch %s is missing revision {%s}" | 
| 463 | % (self.branch, parent_id)) | |
| 1284
by Martin Pool - in commit, avoid reading basis inventory twice | 464 | |
| 1189
by Martin Pool - BROKEN: partial support for commit into weave | 465 | def _remove_deleted(self): | 
| 1248
by Martin Pool - new weave based cleanup [broken] | 466 | """Remove deleted files from the working inventories. | 
| 467 | ||
| 468 |         This is done prior to taking the working inventory as the
 | |
| 469 |         basis for the new committed inventory.
 | |
| 470 | ||
| 471 |         This returns true if any files
 | |
| 472 |         *that existed in the basis inventory* were deleted.
 | |
| 473 |         Files that were added and deleted
 | |
| 474 |         in the working copy don't matter.
 | |
| 475 |         """
 | |
| 1254
by Martin Pool - fix handling of selective commit with deleted files | 476 | specific = self.specific_files | 
| 477 | deleted_ids = [] | |
| 478 | for path, ie in self.work_inv.iter_entries(): | |
| 479 | if specific and not is_inside_any(specific, path): | |
| 480 |                 continue
 | |
| 481 | if not self.work_tree.has_filename(path): | |
| 1185.12.8
by Aaron Bentley Fixed commit so all output comes though CommitReporter | 482 | self.reporter.missing(path) | 
| 1185.12.5
by Aaron Bentley Fixed ordering issue in Commit._remove_deleted | 483 | deleted_ids.append((path, ie.file_id)) | 
| 1254
by Martin Pool - fix handling of selective commit with deleted files | 484 | if deleted_ids: | 
| 1185.12.5
by Aaron Bentley Fixed ordering issue in Commit._remove_deleted | 485 | deleted_ids.sort(reverse=True) | 
| 486 | for path, file_id in deleted_ids: | |
| 1248
by Martin Pool - new weave based cleanup [broken] | 487 | del self.work_inv[file_id] | 
| 1457.1.11
by Robert Collins Move _write_inventory to WorkingTree. | 488 | self.work_tree._write_inventory(self.work_inv) | 
| 1248
by Martin Pool - new weave based cleanup [broken] | 489 | |
| 1092.2.22
by Robert Collins text_version and name_version unification looking reasonable | 490 | def _populate_new_inv(self): | 
| 491 | """Build revision inventory. | |
| 492 | ||
| 493 |         This creates a new empty inventory. Depending on
 | |
| 494 |         which files are selected for commit, and what is present in the
 | |
| 495 |         current tree, the new inventory is populated. inventory entries 
 | |
| 496 |         which are candidates for modification have their revision set to
 | |
| 497 |         None; inventory entries that are carried over untouched have their
 | |
| 498 |         revision set to their prior value.
 | |
| 1301
by Martin Pool - more docs in commit code | 499 |         """
 | 
| 1092.2.22
by Robert Collins text_version and name_version unification looking reasonable | 500 | mutter("Selecting files for commit with filter %s", self.specific_files) | 
| 1666.1.18
by Robert Collins Add a progress bar during commit operations. | 501 |         # iter_entries does not visit the ROOT_ID node so we need to call
 | 
| 1666.1.22
by Robert Collins Rename Commit._update to _emit_progress_update. | 502 |         # self._emit_progress_update once by hand.
 | 
| 503 | self._emit_progress_update() | |
| 1249
by Martin Pool - improvements to weave commit [broken] | 504 | for path, new_ie in self.work_inv.iter_entries(): | 
| 1666.1.22
by Robert Collins Rename Commit._update to _emit_progress_update. | 505 | self._emit_progress_update() | 
| 1249
by Martin Pool - improvements to weave commit [broken] | 506 | file_id = new_ie.file_id | 
| 1740.3.9
by Jelmer Vernooij Make the commit message the first argument of CommitBuilder.commit(). | 507 | mutter('check %s {%s}', path, file_id) | 
| 1740.3.5
by Jelmer Vernooij Simplify inventory population code by using is_inside_or_parent_of_any() | 508 | if (not self.specific_files or | 
| 509 | is_inside_or_parent_of_any(self.specific_files, path)): | |
| 510 | mutter('%s selected for commit', path) | |
| 1740.3.6
by Jelmer Vernooij Move inventory writing to the commit builder. | 511 | ie = new_ie.copy() | 
| 512 | ie.revision = None | |
| 1740.3.5
by Jelmer Vernooij Simplify inventory population code by using is_inside_or_parent_of_any() | 513 | else: | 
| 514 | mutter('%s not selected for commit', path) | |
| 1740.3.6
by Jelmer Vernooij Move inventory writing to the commit builder. | 515 | if self.basis_inv.has_id(file_id): | 
| 516 | ie = self.basis_inv[file_id].copy() | |
| 517 | else: | |
| 518 |                     # this entry is new and not being committed
 | |
| 519 |                     continue
 | |
| 520 | ||
| 521 | self.builder.record_entry_contents(ie, self.parent_invs, | |
| 1740.3.7
by Jelmer Vernooij Move committer, log, revprops, timestamp and timezone to CommitBuilder. | 522 | path, self.work_tree) | 
| 1759.2.1
by Jelmer Vernooij Fix some types (found using aspell). | 523 |             # describe the nature of the change that has occurred relative to
 | 
| 1740.3.6
by Jelmer Vernooij Move inventory writing to the commit builder. | 524 |             # the basis inventory.
 | 
| 525 | if (self.basis_inv.has_id(ie.file_id)): | |
| 526 | basis_ie = self.basis_inv[ie.file_id] | |
| 527 | else: | |
| 528 | basis_ie = None | |
| 529 | change = ie.describe_change(basis_ie, ie) | |
| 530 | if change in (InventoryEntry.RENAMED, | |
| 531 | InventoryEntry.MODIFIED_AND_RENAMED): | |
| 532 | old_path = self.basis_inv.id2path(ie.file_id) | |
| 533 | self.reporter.renamed(change, old_path, path) | |
| 534 | else: | |
| 535 | self.reporter.snapshot_change(change, path) | |
| 1416
by Robert Collins when committing a specific file, include all its parents | 536 | |
| 1666.1.22
by Robert Collins Rename Commit._update to _emit_progress_update. | 537 | def _emit_progress_update(self): | 
| 1666.1.18
by Robert Collins Add a progress bar during commit operations. | 538 | """Emit an update to the progress bar.""" | 
| 539 | self.pb.update("Committing", self.pb_count, self.pb_total) | |
| 540 | self.pb_count += 1 | |
| 541 | ||
| 1248
by Martin Pool - new weave based cleanup [broken] | 542 | def _report_deletes(self): | 
| 1668.1.5
by Martin Pool [broken] fix up display of files changed by a commit | 543 | for path, ie in self.basis_inv.iter_entries(): | 
| 1740.3.4
by Jelmer Vernooij Move inventory to commit builder. | 544 | if ie.file_id not in self.builder.new_inventory: | 
| 1668.1.5
by Martin Pool [broken] fix up display of files changed by a commit | 545 | self.reporter.deleted(path) | 
| 1248
by Martin Pool - new weave based cleanup [broken] | 546 | |
| 1740.3.7
by Jelmer Vernooij Move committer, log, revprops, timestamp and timezone to CommitBuilder. | 547 |