Rev 3027: Lock correctness and commit_group management for re-sign, in builtins. in http://people.ubuntu.com/~robertc/baz2.0/pack.read-locks
Robert Collins
robertc at robertcollins.net
Thu Nov 22 02:34:49 GMT 2007
At http://people.ubuntu.com/~robertc/baz2.0/pack.read-locks
------------------------------------------------------------
revno: 3027
revision-id:robertc at robertcollins.net-20071122023439-1stck34grarbn91o
parent: robertc at robertcollins.net-20071122023349-i0nc5or8vpvdu84q
committer: Robert Collins <robertc at robertcollins.net>
branch nick: pack.read-locks
timestamp: Thu 2007-11-22 13:34:39 +1100
message:
Lock correctness and commit_group management for re-sign, in builtins.
modified:
bzrlib/builtins.py builtins.py-20050830033751-fc01482b9ca23183
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py 2007-11-20 14:43:47 +0000
+++ b/bzrlib/builtins.py 2007-11-22 02:34:39 +0000
@@ -2115,7 +2115,6 @@
if revision is not None and len(revision) != 1:
raise errors.BzrCommandError("bzr cat --revision takes exactly"
" one number")
-
tree = None
try:
tree, b, relpath = \
@@ -2125,6 +2124,14 @@
if revision is not None and revision[0].get_branch() is not None:
b = Branch.open(revision[0].get_branch())
+ b.lock_read()
+ try:
+ return self._run(tree, b, relpath, filename, revision,
+ name_from_revision)
+ finally:
+ b.unlock()
+
+ def _run(self, tree, b, relpath, filename, revision, name_from_revision):
if tree is None:
tree = b.basis_tree()
if revision is None:
@@ -2686,14 +2693,21 @@
branch1 = Branch.open_containing(branch)[0]
branch2 = Branch.open_containing(other)[0]
-
- last1 = ensure_null(branch1.last_revision())
- last2 = ensure_null(branch2.last_revision())
-
- graph = branch1.repository.get_graph(branch2.repository)
- base_rev_id = graph.find_unique_lca(last1, last2)
-
- print 'merge base is revision %s' % base_rev_id
+ branch1.lock_read()
+ try:
+ branch2.lock_read()
+ try:
+ last1 = ensure_null(branch1.last_revision())
+ last2 = ensure_null(branch2.last_revision())
+
+ graph = branch1.repository.get_graph(branch2.repository)
+ base_rev_id = graph.find_unique_lca(last1, last2)
+
+ print 'merge base is revision %s' % base_rev_id
+ finally:
+ branch2.unlock()
+ finally:
+ branch1.unlock()
class cmd_merge(Command):
@@ -3422,20 +3436,41 @@
takes_options = ['revision']
def run(self, revision_id_list=None, revision=None):
- import bzrlib.gpg as gpg
if revision_id_list is not None and revision is not None:
raise errors.BzrCommandError('You can only supply one of revision_id or --revision')
if revision_id_list is None and revision is None:
raise errors.BzrCommandError('You must supply either --revision or a revision_id')
b = WorkingTree.open_containing(u'.')[0].branch
+ b.lock_write()
+ try:
+ return self._run(b, revision_id_list, revision)
+ finally:
+ b.unlock()
+
+ def _run(self, b, revision_id_list, revision):
+ import bzrlib.gpg as gpg
gpg_strategy = gpg.GPGStrategy(b.get_config())
if revision_id_list is not None:
- for revision_id in revision_id_list:
- b.repository.sign_revision(revision_id, gpg_strategy)
+ b.repository.start_write_group()
+ try:
+ for revision_id in revision_id_list:
+ b.repository.sign_revision(revision_id, gpg_strategy)
+ except:
+ b.repository.abort_write_group()
+ raise
+ else:
+ b.repository.commit_write_group()
elif revision is not None:
if len(revision) == 1:
revno, rev_id = revision[0].in_history(b)
- b.repository.sign_revision(rev_id, gpg_strategy)
+ b.repository.start_write_group()
+ try:
+ b.repository.sign_revision(rev_id, gpg_strategy)
+ except:
+ b.repository.abort_write_group()
+ raise
+ else:
+ b.repository.commit_write_group()
elif len(revision) == 2:
# are they both on rh- if so we can walk between them
# might be nice to have a range helper for arbitrary
@@ -3446,9 +3481,16 @@
to_revno = b.revno()
if from_revno is None or to_revno is None:
raise errors.BzrCommandError('Cannot sign a range of non-revision-history revisions')
- for revno in range(from_revno, to_revno + 1):
- b.repository.sign_revision(b.get_rev_id(revno),
- gpg_strategy)
+ b.repository.start_write_group()
+ try:
+ for revno in range(from_revno, to_revno + 1):
+ b.repository.sign_revision(b.get_rev_id(revno),
+ gpg_strategy)
+ except:
+ b.repository.abort_write_group()
+ raise
+ else:
+ b.repository.commit_write_group()
else:
raise errors.BzrCommandError('Please supply either one revision, or a range.')
@@ -3965,6 +4007,9 @@
outfile = open(output, 'wb')
try:
branch = Branch.open_containing(from_)[0]
+ # we may need to write data into branch's repository to calculate
+ # the data to send.
+ branch.lock_write()
if output is None:
config = branch.get_config()
if mail_to is None:
@@ -4052,6 +4097,7 @@
finally:
if output != '-':
outfile.close()
+ branch.unlock()
class cmd_bundle_revisions(cmd_send):
More information about the bazaar-commits
mailing list