bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
485
by Martin Pool
 - move commit code into its own module  | 
1  | 
# Copyright (C) 2005 Canonical Ltd
 | 
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
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  | 
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
70  | 
import pdb  | 
| 
1194
by Martin Pool
 - [BROKEN] more progress of commit into weaves  | 
71  | 
|
| 
1188
by Martin Pool
 - clean up imports in commit code  | 
72  | 
from binascii import hexlify  | 
| 
1194
by Martin Pool
 - [BROKEN] more progress of commit into weaves  | 
73  | 
from cStringIO import StringIO  | 
| 
1188
by Martin Pool
 - clean up imports in commit code  | 
74  | 
|
| 
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  | 
from bzrlib.osutils import (local_time_offset,  | 
76  | 
rand_bytes, compact_date,  | 
|
| 
1188
by Martin Pool
 - clean up imports in commit code  | 
77  | 
kind_marker, is_inside_any, quotefn,  | 
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
78  | 
sha_string, sha_strings, sha_file, isdir, isfile,  | 
79  | 
split_lines)  | 
|
| 
1352
by Martin Pool
 - store control weaves in .bzr/, not mixed in with file weaves  | 
80  | 
from bzrlib.branch import gen_file_id  | 
| 
1442.1.2
by Robert Collins
 create a config module - there is enough config logic to make this worthwhile, and start testing config processing.  | 
81  | 
import bzrlib.config  | 
| 
1264
by Martin Pool
 - Raise a better error from commit when a parent is absent  | 
82  | 
from bzrlib.errors import (BzrError, PointlessCommit,  | 
83  | 
HistoryMissing,  | 
|
| 
1185.16.65
by mbp at sourcefrog
 - new commit --strict option  | 
84  | 
ConflictsInTree,  | 
85  | 
                           StrictCommitFailed
 | 
|
| 
1264
by Martin Pool
 - Raise a better error from commit when a parent is absent  | 
86  | 
                           )
 | 
| 
1442.1.60
by Robert Collins
 gpg sign commits if the policy says we need to  | 
87  | 
import bzrlib.gpg as gpg  | 
| 
1311
by Martin Pool
 - remove RevisionReference; just hold parent ids directly  | 
88  | 
from bzrlib.revision import Revision  | 
| 
1442.1.62
by Robert Collins
 Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.  | 
89  | 
from bzrlib.testament import Testament  | 
| 
1264
by Martin Pool
 - Raise a better error from commit when a parent is absent  | 
90  | 
from bzrlib.trace import mutter, note, warning  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
91  | 
from bzrlib.xml5 import serializer_v5  | 
| 
1416
by Robert Collins
 when committing a specific file, include all its parents  | 
92  | 
from bzrlib.inventory import Inventory, ROOT_ID  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
93  | 
from bzrlib.weave import Weave  | 
94  | 
from bzrlib.weavefile import read_weave, write_weave_v5  | 
|
95  | 
from bzrlib.atomicfile import AtomicFile  | 
|
96  | 
||
97  | 
||
| 
1205
by Martin Pool
 - add bzrlib.commit.commit compatability interface  | 
98  | 
def commit(*args, **kwargs):  | 
99  | 
"""Commit a new revision to a branch.  | 
|
100  | 
||
101  | 
    Function-style interface for convenience of old callers.
 | 
|
102  | 
||
103  | 
    New code should use the Commit class instead.
 | 
|
104  | 
    """
 | 
|
| 
1276
by Martin Pool
 - make Branch.commit accept (and ignore) verbose argument  | 
105  | 
    ## XXX: Remove this in favor of Branch.commit?
 | 
| 
1205
by Martin Pool
 - add bzrlib.commit.commit compatability interface  | 
106  | 
Commit().commit(*args, **kwargs)  | 
107  | 
||
108  | 
||
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
109  | 
class NullCommitReporter(object):  | 
110  | 
"""I report on progress of a commit."""  | 
|
| 
1185.12.8
by Aaron Bentley
 Fixed commit so all output comes though CommitReporter  | 
111  | 
|
112  | 
def snapshot_change(self, change, path):  | 
|
113  | 
        pass
 | 
|
114  | 
||
115  | 
def completed(self, revno, rev_id):  | 
|
116  | 
        pass
 | 
|
117  | 
||
118  | 
def deleted(self, file_id):  | 
|
119  | 
        pass
 | 
|
120  | 
||
121  | 
def escaped(self, escape_count, message):  | 
|
122  | 
        pass
 | 
|
123  | 
||
124  | 
def missing(self, path):  | 
|
125  | 
        pass
 | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
126  | 
|
127  | 
class ReportCommitToLog(NullCommitReporter):  | 
|
| 
1185.12.8
by Aaron Bentley
 Fixed commit so all output comes though CommitReporter  | 
128  | 
|
129  | 
def snapshot_change(self, change, path):  | 
|
130  | 
note("%s %s", change, path)  | 
|
131  | 
||
132  | 
def completed(self, revno, rev_id):  | 
|
133  | 
note('committed r%d {%s}', revno, rev_id)  | 
|
134  | 
||
135  | 
def deleted(self, file_id):  | 
|
136  | 
note('deleted %s', file_id)  | 
|
137  | 
||
138  | 
def escaped(self, escape_count, message):  | 
|
139  | 
note("replaced %d control characters in message", escape_count)  | 
|
140  | 
||
141  | 
def missing(self, path):  | 
|
142  | 
note('missing %s', path)  | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
143  | 
|
144  | 
class Commit(object):  | 
|
145  | 
"""Task of committing a new revision.  | 
|
146  | 
||
147  | 
    This is a MethodObject: it accumulates state as the commit is
 | 
|
148  | 
    prepared, and then it is discarded.  It doesn't represent
 | 
|
149  | 
    historical revisions, just the act of recording a new one.
 | 
|
150  | 
||
151  | 
            missing_ids
 | 
|
152  | 
            Modified to hold a list of files that have been deleted from
 | 
|
153  | 
            the working directory; these should be removed from the
 | 
|
154  | 
            working inventory.
 | 
|
| 
485
by Martin Pool
 - move commit code into its own module  | 
155  | 
    """
 | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
156  | 
def __init__(self,  | 
| 
1442.1.60
by Robert Collins
 gpg sign commits if the policy says we need to  | 
157  | 
reporter=None,  | 
158  | 
config=None):  | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
159  | 
if reporter is not None:  | 
160  | 
self.reporter = reporter  | 
|
161  | 
else:  | 
|
162  | 
self.reporter = NullCommitReporter()  | 
|
| 
1442.1.60
by Robert Collins
 gpg sign commits if the policy says we need to  | 
163  | 
if config is not None:  | 
164  | 
self.config = config  | 
|
165  | 
else:  | 
|
166  | 
self.config = None  | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
167  | 
|
168  | 
def commit(self,  | 
|
169  | 
branch, message,  | 
|
170  | 
timestamp=None,  | 
|
171  | 
timezone=None,  | 
|
172  | 
committer=None,  | 
|
173  | 
specific_files=None,  | 
|
174  | 
rev_id=None,  | 
|
| 
1276
by Martin Pool
 - make Branch.commit accept (and ignore) verbose argument  | 
175  | 
allow_pointless=True,  | 
| 
1185.16.65
by mbp at sourcefrog
 - new commit --strict option  | 
176  | 
strict=False,  | 
| 
1185.16.35
by Martin Pool
 - stub for revision properties  | 
177  | 
verbose=False,  | 
178  | 
revprops=None):  | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
179  | 
"""Commit working copy as a new revision.  | 
180  | 
||
181  | 
        timestamp -- if not None, seconds-since-epoch for a
 | 
|
182  | 
             postdated/predated commit.
 | 
|
183  | 
||
| 
1253
by Martin Pool
 - test that pointless commits are trapped  | 
184  | 
        specific_files -- If true, commit only those files.
 | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
185  | 
|
| 
1253
by Martin Pool
 - test that pointless commits are trapped  | 
186  | 
        rev_id -- If set, use this as the new revision id.
 | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
187  | 
            Useful for test or import commands that need to tightly
 | 
188  | 
            control what revisions are assigned.  If you duplicate
 | 
|
189  | 
            a revision id that exists elsewhere it is your own fault.
 | 
|
190  | 
            If null (default), a time/random revision id is generated.
 | 
|
| 
1253
by Martin Pool
 - test that pointless commits are trapped  | 
191  | 
|
192  | 
        allow_pointless -- If true (default), commit even if nothing
 | 
|
193  | 
            has changed and no merges are recorded.
 | 
|
| 
1185.16.35
by Martin Pool
 - stub for revision properties  | 
194  | 
|
| 
1185.16.65
by mbp at sourcefrog
 - new commit --strict option  | 
195  | 
        strict -- If true, don't allow a commit if the working tree
 | 
196  | 
            contains unknown files.
 | 
|
197  | 
||
| 
1185.16.35
by Martin Pool
 - stub for revision properties  | 
198  | 
        revprops -- Properties for new revision
 | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
199  | 
        """
 | 
| 
1285
by Martin Pool
 - fix bug in committing files that are renamed but not modified  | 
200  | 
mutter('preparing to commit')  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
201  | 
|
202  | 
self.branch = branch  | 
|
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
203  | 
self.weave_store = branch.weave_store  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
204  | 
self.rev_id = rev_id  | 
205  | 
self.specific_files = specific_files  | 
|
| 
1194
by Martin Pool
 - [BROKEN] more progress of commit into weaves  | 
206  | 
self.allow_pointless = allow_pointless  | 
| 
1185.35.15
by Aaron Bentley
 Added branch nicks to revisions  | 
207  | 
self.revprops = {'branch-nick': branch.nick}  | 
208  | 
if revprops:  | 
|
209  | 
self.revprops.update(revprops)  | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
210  | 
|
| 
1185.22.4
by Michael Ellerman
 Strict commit was a little .. ah .. too strict, oops :}  | 
211  | 
if strict:  | 
212  | 
            # raise an exception as soon as we find a single unknown.
 | 
|
213  | 
for unknown in branch.unknowns():  | 
|
214  | 
raise StrictCommitFailed()  | 
|
| 
1185.16.65
by mbp at sourcefrog
 - new commit --strict option  | 
215  | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
216  | 
if timestamp is None:  | 
217  | 
self.timestamp = time.time()  | 
|
218  | 
else:  | 
|
219  | 
self.timestamp = long(timestamp)  | 
|
220  | 
||
| 
1442.1.60
by Robert Collins
 gpg sign commits if the policy says we need to  | 
221  | 
if self.config is None:  | 
222  | 
self.config = bzrlib.config.BranchConfig(self.branch)  | 
|
223  | 
||
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
224  | 
if rev_id is None:  | 
| 
1442.1.60
by Robert Collins
 gpg sign commits if the policy says we need to  | 
225  | 
self.rev_id = _gen_revision_id(self.config, self.timestamp)  | 
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
226  | 
else:  | 
227  | 
self.rev_id = rev_id  | 
|
228  | 
||
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
229  | 
if committer is None:  | 
| 
1442.1.60
by Robert Collins
 gpg sign commits if the policy says we need to  | 
230  | 
self.committer = self.config.username()  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
231  | 
else:  | 
232  | 
assert isinstance(committer, basestring), type(committer)  | 
|
233  | 
self.committer = committer  | 
|
234  | 
||
235  | 
if timezone is None:  | 
|
236  | 
self.timezone = local_time_offset()  | 
|
237  | 
else:  | 
|
238  | 
self.timezone = int(timezone)  | 
|
239  | 
||
| 
1393.4.2
by Harald Meland
 Cleanup + better test of commit-msg control character escape code.  | 
240  | 
if isinstance(message, str):  | 
241  | 
message = message.decode(bzrlib.user_encoding)  | 
|
242  | 
assert isinstance(message, unicode), type(message)  | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
243  | 
self.message = message  | 
| 
1390
by Robert Collins
 pair programming worx... merge integration and weave  | 
244  | 
self._escape_commit_message()  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
245  | 
|
| 
1245
by Martin Pool
 doc  | 
246  | 
self.branch.lock_write()  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
247  | 
try:  | 
248  | 
self.work_tree = self.branch.working_tree()  | 
|
249  | 
self.work_inv = self.work_tree.inventory  | 
|
250  | 
self.basis_tree = self.branch.basis_tree()  | 
|
251  | 
self.basis_inv = self.basis_tree.inventory  | 
|
252  | 
||
| 
1223
by Martin Pool
 - store inventories in weave  | 
253  | 
self._gather_parents()  | 
| 
1344
by Martin Pool
 - disallow selected-file commit of merges  | 
254  | 
if len(self.parents) > 1 and self.specific_files:  | 
255  | 
raise NotImplementedError('selected-file commit of merges is not supported yet')  | 
|
| 
1284
by Martin Pool
 - in commit, avoid reading basis inventory twice  | 
256  | 
self._check_parents_present()  | 
257  | 
||
| 
1251
by Martin Pool
 - fix up commit in directory with some deleted files  | 
258  | 
self._remove_deleted()  | 
| 
1092.2.22
by Robert Collins
 text_version and name_version unification looking reasonable  | 
259  | 
self._populate_new_inv()  | 
260  | 
self._store_snapshot()  | 
|
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
261  | 
self._report_deletes()  | 
| 
1245
by Martin Pool
 doc  | 
262  | 
|
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
263  | 
if not (self.allow_pointless  | 
| 
1279
by Martin Pool
 - pointless commit of r1 no longer allowed  | 
264  | 
or len(self.parents) > 1  | 
| 
1249
by Martin Pool
 - improvements to weave commit [broken]  | 
265  | 
or self.new_inv != self.basis_inv):  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
266  | 
raise PointlessCommit()  | 
267  | 
||
| 
1185.14.10
by Aaron Bentley
 Commit aborts with conflicts in the tree.  | 
268  | 
if len(list(self.work_tree.iter_conflicts()))>0:  | 
269  | 
raise ConflictsInTree  | 
|
270  | 
||
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
271  | 
self._record_inventory()  | 
272  | 
self._make_revision()  | 
|
| 
1194
by Martin Pool
 - [BROKEN] more progress of commit into weaves  | 
273  | 
self.branch.append_revision(self.rev_id)  | 
| 
1457.1.16
by Robert Collins
 Move set_pending_merges to WorkingTree.  | 
274  | 
self.work_tree.set_pending_merges([])  | 
| 
1472
by Robert Collins
 post commit hook, first pass implementation  | 
275  | 
self.reporter.completed(self.branch.revno()+1, self.rev_id)  | 
276  | 
if self.config.post_commit() is not None:  | 
|
277  | 
hooks = self.config.post_commit().split(' ')  | 
|
278  | 
                # this would be nicer with twisted.python.reflect.namedAny
 | 
|
279  | 
for hook in hooks:  | 
|
280  | 
result = eval(hook + '(branch, rev_id)',  | 
|
281  | 
{'branch':self.branch,  | 
|
282  | 
'bzrlib':bzrlib,  | 
|
283  | 
'rev_id':self.rev_id})  | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
284  | 
finally:  | 
285  | 
self.branch.unlock()  | 
|
286  | 
||
287  | 
def _record_inventory(self):  | 
|
| 
1223
by Martin Pool
 - store inventories in weave  | 
288  | 
"""Store the inventory for the new revision."""  | 
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
289  | 
inv_text = serializer_v5.write_inventory_to_string(self.new_inv)  | 
290  | 
self.inv_sha1 = sha_string(inv_text)  | 
|
| 
1390
by Robert Collins
 pair programming worx... merge integration and weave  | 
291  | 
s = self.branch.control_weaves  | 
| 
1352
by Martin Pool
 - store control weaves in .bzr/, not mixed in with file weaves  | 
292  | 
s.add_text('inventory', self.rev_id,  | 
| 
1417.1.8
by Robert Collins
 use transactions in the weave store interface, which enables caching for log  | 
293  | 
split_lines(inv_text), self.present_parents,  | 
294  | 
self.branch.get_transaction())  | 
|
| 
1223
by Martin Pool
 - store inventories in weave  | 
295  | 
|
| 
1390
by Robert Collins
 pair programming worx... merge integration and weave  | 
296  | 
def _escape_commit_message(self):  | 
297  | 
"""Replace xml-incompatible control characters."""  | 
|
| 
1185.11.5
by John Arbash Meinel
 Merged up-to-date against mainline, still broken.  | 
298  | 
        # Python strings can include characters that can't be
 | 
299  | 
        # represented in well-formed XML; escape characters that
 | 
|
300  | 
        # aren't listed in the XML specification
 | 
|
301  | 
        # (http://www.w3.org/TR/REC-xml/#NT-Char).
 | 
|
| 
1390
by Robert Collins
 pair programming worx... merge integration and weave  | 
302  | 
self.message, escape_count = re.subn(  | 
| 
1393.4.2
by Harald Meland
 Cleanup + better test of commit-msg control character escape code.  | 
303  | 
u'[^\x09\x0A\x0D\u0020-\uD7FF\uE000-\uFFFD]+',  | 
| 
1185.11.5
by John Arbash Meinel
 Merged up-to-date against mainline, still broken.  | 
304  | 
lambda match: match.group(0).encode('unicode_escape'),  | 
| 
1390
by Robert Collins
 pair programming worx... merge integration and weave  | 
305  | 
self.message)  | 
| 
1185.11.5
by John Arbash Meinel
 Merged up-to-date against mainline, still broken.  | 
306  | 
if escape_count:  | 
| 
1185.12.8
by Aaron Bentley
 Fixed commit so all output comes though CommitReporter  | 
307  | 
self.reporter.escaped(escape_count, self.message)  | 
| 
1223
by Martin Pool
 - store inventories in weave  | 
308  | 
|
309  | 
def _gather_parents(self):  | 
|
| 
1092.2.25
by Robert Collins
 support ghosts in commits  | 
310  | 
"""Record the parents of a merge for merge detection."""  | 
| 
1457.1.14
by Robert Collins
 Move pending_merges() to WorkingTree.  | 
311  | 
pending_merges = self.work_tree.pending_merges()  | 
| 
1223
by Martin Pool
 - store inventories in weave  | 
312  | 
self.parents = []  | 
| 
1408
by Robert Collins
 we do not need revision_trees in commit, parent inventories are sufficient  | 
313  | 
self.parent_invs = []  | 
| 
1092.2.25
by Robert Collins
 support ghosts in commits  | 
314  | 
self.present_parents = []  | 
| 
1241
by Martin Pool
 - rename last_patch to last_revision  | 
315  | 
precursor_id = self.branch.last_revision()  | 
| 
1223
by Martin Pool
 - store inventories in weave  | 
316  | 
if precursor_id:  | 
317  | 
self.parents.append(precursor_id)  | 
|
318  | 
self.parents += pending_merges  | 
|
| 
1092.2.25
by Robert Collins
 support ghosts in commits  | 
319  | 
for revision in self.parents:  | 
320  | 
if self.branch.has_revision(revision):  | 
|
| 
1408
by Robert Collins
 we do not need revision_trees in commit, parent inventories are sufficient  | 
321  | 
self.parent_invs.append(self.branch.get_inventory(revision))  | 
| 
1092.2.25
by Robert Collins
 support ghosts in commits  | 
322  | 
self.present_parents.append(revision)  | 
| 
1284
by Martin Pool
 - in commit, avoid reading basis inventory twice  | 
323  | 
|
324  | 
def _check_parents_present(self):  | 
|
| 
1264
by Martin Pool
 - Raise a better error from commit when a parent is absent  | 
325  | 
for parent_id in self.parents:  | 
| 
1270
by Martin Pool
 - fix recording of merged ancestry lines  | 
326  | 
mutter('commit parent revision {%s}', parent_id)  | 
| 
1264
by Martin Pool
 - Raise a better error from commit when a parent is absent  | 
327  | 
if not self.branch.has_revision(parent_id):  | 
| 
1092.2.25
by Robert Collins
 support ghosts in commits  | 
328  | 
if parent_id == self.branch.last_revision():  | 
| 
1185.12.9
by Aaron Bentley
 Removed crude language  | 
329  | 
warning("parent is missing %r", parent_id)  | 
| 
1092.2.25
by Robert Collins
 support ghosts in commits  | 
330  | 
raise HistoryMissing(self.branch, 'revision', parent_id)  | 
331  | 
else:  | 
|
332  | 
mutter("commit will ghost revision %r", parent_id)  | 
|
| 
1284
by Martin Pool
 - in commit, avoid reading basis inventory twice  | 
333  | 
|
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
334  | 
def _make_revision(self):  | 
335  | 
"""Record a new revision object for this commit."""  | 
|
336  | 
self.rev = Revision(timestamp=self.timestamp,  | 
|
337  | 
timezone=self.timezone,  | 
|
338  | 
committer=self.committer,  | 
|
339  | 
message=self.message,  | 
|
340  | 
inventory_sha1=self.inv_sha1,  | 
|
| 
1185.16.35
by Martin Pool
 - stub for revision properties  | 
341  | 
revision_id=self.rev_id,  | 
342  | 
properties=self.revprops)  | 
|
| 
1313
by Martin Pool
 - rename to Revision.parent_ids to avoid confusion with old usage  | 
343  | 
self.rev.parent_ids = self.parents  | 
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
344  | 
rev_tmp = StringIO()  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
345  | 
serializer_v5.write_revision(self.rev, rev_tmp)  | 
| 
580
by Martin Pool
 - Use explicit lock methods on a branch, rather than doing it  | 
346  | 
rev_tmp.seek(0)  | 
| 
1442.1.62
by Robert Collins
 Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.  | 
347  | 
if self.config.signature_needed():  | 
348  | 
plaintext = Testament(self.rev, self.new_inv).as_short_text()  | 
|
349  | 
self.branch.store_revision_signature(gpg.GPGStrategy(self.config),  | 
|
350  | 
plaintext, self.rev_id)  | 
|
| 
1393.2.3
by John Arbash Meinel
 Fixing typos, updating stores, getting tests to pass.  | 
351  | 
self.branch.revision_store.add(rev_tmp, self.rev_id)  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
352  | 
mutter('new revision_id is {%s}', self.rev_id)  | 
353  | 
||
354  | 
def _remove_deleted(self):  | 
|
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
355  | 
"""Remove deleted files from the working inventories.  | 
356  | 
||
357  | 
        This is done prior to taking the working inventory as the
 | 
|
358  | 
        basis for the new committed inventory.
 | 
|
359  | 
||
360  | 
        This returns true if any files
 | 
|
361  | 
        *that existed in the basis inventory* were deleted.
 | 
|
362  | 
        Files that were added and deleted
 | 
|
363  | 
        in the working copy don't matter.
 | 
|
364  | 
        """
 | 
|
| 
1254
by Martin Pool
 - fix handling of selective commit with deleted files  | 
365  | 
specific = self.specific_files  | 
366  | 
deleted_ids = []  | 
|
367  | 
for path, ie in self.work_inv.iter_entries():  | 
|
368  | 
if specific and not is_inside_any(specific, path):  | 
|
369  | 
                continue
 | 
|
370  | 
if not self.work_tree.has_filename(path):  | 
|
| 
1185.12.8
by Aaron Bentley
 Fixed commit so all output comes though CommitReporter  | 
371  | 
self.reporter.missing(path)  | 
| 
1185.12.5
by Aaron Bentley
 Fixed ordering issue in Commit._remove_deleted  | 
372  | 
deleted_ids.append((path, ie.file_id))  | 
| 
1254
by Martin Pool
 - fix handling of selective commit with deleted files  | 
373  | 
if deleted_ids:  | 
| 
1185.12.5
by Aaron Bentley
 Fixed ordering issue in Commit._remove_deleted  | 
374  | 
deleted_ids.sort(reverse=True)  | 
375  | 
for path, file_id in deleted_ids:  | 
|
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
376  | 
del self.work_inv[file_id]  | 
| 
1457.1.11
by Robert Collins
 Move _write_inventory to WorkingTree.  | 
377  | 
self.work_tree._write_inventory(self.work_inv)  | 
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
378  | 
|
| 
1092.2.22
by Robert Collins
 text_version and name_version unification looking reasonable  | 
379  | 
def _store_snapshot(self):  | 
380  | 
"""Pass over inventory and record a snapshot.  | 
|
| 
1303
by Martin Pool
 - commit updates entry_version  | 
381  | 
|
| 
1092.2.21
by Robert Collins
 convert name_version to revision in inventory entries  | 
382  | 
        Entries get a new revision when they are modified in 
 | 
383  | 
        any way, which includes a merge with a new set of
 | 
|
| 
1411
by Robert Collins
 use weave ancestry to determine inventory entry previous heads, prevent propogating 'I did a merge' merges.  | 
384  | 
        parents that have the same entry. 
 | 
| 
1092.2.21
by Robert Collins
 convert name_version to revision in inventory entries  | 
385  | 
        """
 | 
| 
1303
by Martin Pool
 - commit updates entry_version  | 
386  | 
        # XXX: Need to think more here about when the user has
 | 
387  | 
        # made a specific decision on a particular value -- c.f.
 | 
|
388  | 
        # mark-merge.  
 | 
|
389  | 
for path, ie in self.new_inv.iter_entries():  | 
|
| 
1411
by Robert Collins
 use weave ancestry to determine inventory entry previous heads, prevent propogating 'I did a merge' merges.  | 
390  | 
previous_entries = ie.find_previous_heads(  | 
391  | 
self.parent_invs,  | 
|
| 
1417.1.8
by Robert Collins
 use transactions in the weave store interface, which enables caching for log  | 
392  | 
self.weave_store.get_weave_or_empty(ie.file_id,  | 
393  | 
self.branch.get_transaction()))  | 
|
| 
1092.2.23
by Robert Collins
 move inventory entry centric snapshot taking logic to inventory.py  | 
394  | 
if ie.revision is None:  | 
395  | 
change = ie.snapshot(self.rev_id, path, previous_entries,  | 
|
| 
1417.1.8
by Robert Collins
 use transactions in the weave store interface, which enables caching for log  | 
396  | 
self.work_tree, self.weave_store,  | 
397  | 
self.branch.get_transaction())  | 
|
| 
1092.2.23
by Robert Collins
 move inventory entry centric snapshot taking logic to inventory.py  | 
398  | 
else:  | 
399  | 
change = "unchanged"  | 
|
| 
1185.12.8
by Aaron Bentley
 Fixed commit so all output comes though CommitReporter  | 
400  | 
self.reporter.snapshot_change(change, path)  | 
| 
1092.2.22
by Robert Collins
 text_version and name_version unification looking reasonable  | 
401  | 
|
402  | 
def _populate_new_inv(self):  | 
|
403  | 
"""Build revision inventory.  | 
|
404  | 
||
405  | 
        This creates a new empty inventory. Depending on
 | 
|
406  | 
        which files are selected for commit, and what is present in the
 | 
|
407  | 
        current tree, the new inventory is populated. inventory entries 
 | 
|
408  | 
        which are candidates for modification have their revision set to
 | 
|
409  | 
        None; inventory entries that are carried over untouched have their
 | 
|
410  | 
        revision set to their prior value.
 | 
|
| 
1301
by Martin Pool
 - more docs in commit code  | 
411  | 
        """
 | 
| 
1092.2.22
by Robert Collins
 text_version and name_version unification looking reasonable  | 
412  | 
mutter("Selecting files for commit with filter %s", self.specific_files)  | 
413  | 
self.new_inv = Inventory()  | 
|
| 
1249
by Martin Pool
 - improvements to weave commit [broken]  | 
414  | 
for path, new_ie in self.work_inv.iter_entries():  | 
415  | 
file_id = new_ie.file_id  | 
|
416  | 
mutter('check %s {%s}', path, new_ie.file_id)  | 
|
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
417  | 
if self.specific_files:  | 
418  | 
if not is_inside_any(self.specific_files, path):  | 
|
| 
1249
by Martin Pool
 - improvements to weave commit [broken]  | 
419  | 
mutter('%s not selected for commit', path)  | 
| 
1416
by Robert Collins
 when committing a specific file, include all its parents  | 
420  | 
self._carry_entry(file_id)  | 
| 
1249
by Martin Pool
 - improvements to weave commit [broken]  | 
421  | 
                    continue
 | 
| 
1416
by Robert Collins
 when committing a specific file, include all its parents  | 
422  | 
else:  | 
423  | 
                    # this is selected, ensure its parents are too.
 | 
|
424  | 
parent_id = new_ie.parent_id  | 
|
425  | 
while parent_id != ROOT_ID:  | 
|
426  | 
if not self.new_inv.has_id(parent_id):  | 
|
427  | 
ie = self._select_entry(self.work_inv[parent_id])  | 
|
428  | 
mutter('%s selected for commit because of %s',  | 
|
429  | 
self.new_inv.id2path(parent_id), path)  | 
|
430  | 
||
431  | 
ie = self.new_inv[parent_id]  | 
|
432  | 
if ie.revision is not None:  | 
|
433  | 
ie.revision = None  | 
|
434  | 
mutter('%s selected for commit because of %s',  | 
|
435  | 
self.new_inv.id2path(parent_id), path)  | 
|
436  | 
parent_id = ie.parent_id  | 
|
| 
1092.2.22
by Robert Collins
 text_version and name_version unification looking reasonable  | 
437  | 
mutter('%s selected for commit', path)  | 
| 
1416
by Robert Collins
 when committing a specific file, include all its parents  | 
438  | 
self._select_entry(new_ie)  | 
439  | 
||
440  | 
def _select_entry(self, new_ie):  | 
|
441  | 
"""Make new_ie be considered for committing."""  | 
|
442  | 
ie = new_ie.copy()  | 
|
443  | 
ie.revision = None  | 
|
444  | 
self.new_inv.add(ie)  | 
|
445  | 
return ie  | 
|
446  | 
||
447  | 
def _carry_entry(self, file_id):  | 
|
| 
1285
by Martin Pool
 - fix bug in committing files that are renamed but not modified  | 
448  | 
"""Carry the file unchanged from the basis revision."""  | 
| 
1249
by Martin Pool
 - improvements to weave commit [broken]  | 
449  | 
if self.basis_inv.has_id(file_id):  | 
450  | 
self.new_inv.add(self.basis_inv[file_id].copy())  | 
|
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
451  | 
|
452  | 
def _report_deletes(self):  | 
|
453  | 
for file_id in self.basis_inv:  | 
|
454  | 
if file_id not in self.new_inv:  | 
|
| 
1185.12.8
by Aaron Bentley
 Fixed commit so all output comes though CommitReporter  | 
455  | 
self.reporter.deleted(self.basis_inv.id2path(file_id))  | 
| 
1248
by Martin Pool
 - new weave based cleanup [broken]  | 
456  | 
|
| 
1442.1.6
by Robert Collins
 first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs  | 
457  | 
def _gen_revision_id(config, when):  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
458  | 
"""Return new revision-id."""  | 
| 
1442.1.6
by Robert Collins
 first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs  | 
459  | 
s = '%s-%s-' % (config.user_email(), compact_date(when))  | 
| 
1189
by Martin Pool
 - BROKEN: partial support for commit into weave  | 
460  | 
s += hexlify(rand_bytes(8))  | 
461  | 
return s  |