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