Rev 3: Split the code into more helper functions, and properly lock objects in http://bzr.arbash-meinel.com/plugins/push_and_update
John Arbash Meinel
john at arbash-meinel.com
Mon Feb 12 22:21:00 GMT 2007
At http://bzr.arbash-meinel.com/plugins/push_and_update
------------------------------------------------------------
revno: 3
revision-id: john at arbash-meinel.com-20070212222100-1wbs77fjibz2roee
parent: john at arbash-meinel.com-20070212214850-mqhmsw85adrwhqlc
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: push_and_update
timestamp: Mon 2007-02-12 16:21:00 -0600
message:
Split the code into more helper functions, and properly lock objects
modified:
push_and_update.py push_and_update.py-20070212212941-xifrmnv3jrbcv28z-2
-------------- next part --------------
=== modified file 'push_and_update.py'
--- a/push_and_update.py 2007-02-12 21:48:50 +0000
+++ b/push_and_update.py 2007-02-12 22:21:00 +0000
@@ -30,26 +30,60 @@
"""Push to a remote location, and update it as well"""
local_branch, relpath = branch.Branch.open_containing('.')
+ saved = ''
if location is None:
stored_loc = local_branch.get_push_location()
if stored_loc is None:
raise errors.BzrCommandError('no push location known or specified.')
else:
- print 'Using saved location: %s' % (stored_loc,)
+ saved = ' saved'
location = stored_loc
-
+ print 'Updating%s location: %s' % (saved, location,)
+
+ local_branch.lock_read()
+ try:
+ _push_and_update(local_branch, location)
+ finally:
+ local_branch.unlock()
+
+
+def _get_target_branch(local_branch, location):
+ """This will grab the target location, or create a new one."""
try:
target_branch = branch.Branch.open(location)
except errors.NotBranchError:
- to_transport = transport.get_transport(location)
- try:
- to_transport.mkdir('.')
- except errors.FileExists:
- pass
- target_bzrdir = local_branch.bzrdir.clone(to_transport.base,
- revision_id=local_branch.last_revision())
- target_branch = target_bzrdir.open_branch()
-
+ location = str(location)
+ target_branch = local_branch.bzrdir.create_branch_and_repo(location)
+ return target_branch
+
+
+def _push_and_update(local_branch, location):
+ target_branch = _get_target_branch(local_branch, location)
+ target_branch.lock_write()
+ try:
+ start_revno, start_num_revs = _get_info(target_branch)
+ _push_revisions(local_branch, target_branch)
+ end_revno, end_num_revs = _get_info(target_branch)
+ finally:
+ target_branch.unlock()
+
+ print 'Pushed %s revisions (%s mainline)' % (end_num_revs - start_num_revs,
+ end_revno - start_revno)
+
+ _update_remote_tree(target_branch)
+
+
+def _get_info(a_branch):
+ """Figure out how long the remote ancestry is."""
+ starting_revno = a_branch.revno()
+ if starting_revno is 0:
+ return 0, 0
+ last_rev = a_branch.last_revision()
+ anc = a_branch.repository.get_ancestry(last_rev)
+ return starting_revno, len(anc)
+
+
+def _push_revisions(local_branch, target_branch):
push_func = getattr(local_branch, 'push', None)
if push_func is not None:
# bzr-0.15 introduces Branch.push() instead of only having
@@ -58,6 +92,9 @@
else:
target_branch.pull(local_branch)
+
+def _update_remote_tree(target_branch):
+ """Update the remote working tree if it exists."""
try:
target_wt = target_branch.bzrdir.open_workingtree()
except errors.NoWorkingTree:
More information about the bazaar-commits
mailing list