changeset 20346:42df1fe32552

push: introduce a pushoperation object This object will hold all data and state gathered through the push. This will allow us to split the long function into multiple small one. Smaller function will be easier to maintains and wrap. The idea is to blindly store all information related to the push in this object so that each step and extension can use them if necessary. We start by putting the `repo` variable in the object. More migration in other changeset.
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Thu, 30 Jan 2014 16:43:11 -0800
parents 8567b4ea76ac
children 3ec5f833348e
files mercurial/exchange.py
diffstat 1 files changed, 42 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/exchange.py	Thu Jan 30 15:34:01 2014 -0800
+++ b/mercurial/exchange.py	Thu Jan 30 16:43:11 2014 -0800
@@ -11,6 +11,20 @@
 import util, scmutil, changegroup
 import discovery, phases, obsolete, bookmarks
 
+
+class pushoperation(object):
+    """A object that represent a single push operation
+
+    It purpose is to carry push related state and very common operation.
+
+    A new should be created at the begining of each push and discarded
+    afterward.
+    """
+
+    def __init__(self, repo):
+        # repo we push from
+        self.repo = repo
+
 def push(repo, remote, force=False, revs=None, newbranch=False):
     '''Push outgoing changesets (limited by revs) from a local
     repository to remote. Return an integer:
@@ -20,8 +34,9 @@
         we have outgoing changesets but refused to push
       - other values as described by addchangegroup()
     '''
+    pushop = pushoperation(repo)
     if remote.local():
-        missing = set(repo.requirements) - remote.local().supported
+        missing = set(pushop.repo.requirements) - remote.local().supported
         if missing:
             msg = _("required features are not"
                     " supported in the destination:"
@@ -38,24 +53,24 @@
 
     if not remote.canpush():
         raise util.Abort(_("destination does not support push"))
-    unfi = repo.unfiltered()
+    unfi = pushop.repo.unfiltered()
     def localphasemove(nodes, phase=phases.public):
         """move <nodes> to <phase> in the local source repo"""
         if locallock is not None:
-            phases.advanceboundary(repo, phase, nodes)
+            phases.advanceboundary(pushop.repo, phase, nodes)
         else:
             # repo is not locked, do not change any phases!
             # Informs the user that phases should have been moved when
             # applicable.
-            actualmoves = [n for n in nodes if phase < repo[n].phase()]
+            actualmoves = [n for n in nodes if phase < pushop.repo[n].phase()]
             phasestr = phases.phasenames[phase]
             if actualmoves:
-                repo.ui.status(_('cannot lock source repo, skipping local'
-                                 ' %s phase update\n') % phasestr)
+                pushop.repo.ui.status(_('cannot lock source repo, skipping '
+                                        'local %s phase update\n') % phasestr)
     # get local lock as we might write phase data
     locallock = None
     try:
-        locallock = repo.lock()
+        locallock = pushop.repo.lock()
     except IOError, err:
         if err.errno != errno.EACCES:
             raise
@@ -63,9 +78,9 @@
         # We do not abort the push, but just disable the local phase
         # synchronisation.
         msg = 'cannot lock source repository: %s\n' % err
-        repo.ui.debug(msg)
+        pushop.repo.ui.debug(msg)
     try:
-        repo.checkpush(force, revs)
+        pushop.repo.checkpush(force, revs)
         lock = None
         unbundle = remote.capable('unbundle')
         if not unbundle:
@@ -109,7 +124,7 @@
                                 raise util.Abort(_(mst)
                                                  % (ctx.troubles()[0],
                                                     ctx))
-                    newbm = repo.ui.configlist('bookmarks', 'pushing')
+                    newbm = pushop.repo.ui.configlist('bookmarks', 'pushing')
                     discovery.checkheads(unfi, remote, outgoing,
                                          remoteheads, newbranch,
                                          bool(inc), newbm)
@@ -118,16 +133,17 @@
                 bundlecaps = None
                 # create a changegroup from local
                 if revs is None and not (outgoing.excluded
-                                         or repo.changelog.filteredrevs):
+                                        or pushop.repo.changelog.filteredrevs):
                     # push everything,
                     # use the fast path, no race possible on push
-                    bundler = changegroup.bundle10(repo, bundlecaps)
-                    cg = repo._changegroupsubset(outgoing,
-                                                 bundler,
-                                                 'push',
-                                                 fastpath=True)
+                    bundler = changegroup.bundle10(pushop.repo, bundlecaps)
+                    cg = pushop.repo._changegroupsubset(outgoing,
+                                                        bundler,
+                                                        'push',
+                                                        fastpath=True)
                 else:
-                    cg = repo.getlocalbundle('push', outgoing, bundlecaps)
+                    cg = pushop.repo.getlocalbundle('push', outgoing,
+                                                    bundlecaps)
 
                 # apply changegroup to remote
                 if unbundle:
@@ -143,7 +159,7 @@
                 else:
                     # we return an integer indicating remote head count
                     # change
-                    ret = remote.addchangegroup(cg, 'push', repo.url())
+                    ret = remote.addchangegroup(cg, 'push', pushop.repo.url())
 
             if ret:
                 # push succeed, synchronize target of the push
@@ -167,7 +183,7 @@
                 # We can pick:
                 # * missingheads part of common (::commonheads)
                 common = set(outgoing.common)
-                nm = repo.changelog.nodemap
+                nm = pushop.repo.changelog.nodemap
                 cheads = [node for node in revs if nm[node] in common]
                 # and
                 # * commonheads parents on missing
@@ -177,7 +193,7 @@
                 cheads.extend(c.node() for c in revset)
             # even when we don't push, exchanging phase data is useful
             remotephases = remote.listkeys('phases')
-            if (repo.ui.configbool('ui', '_usedassubrepo', False)
+            if (pushop.repo.ui.configbool('ui', '_usedassubrepo', False)
                 and remotephases    # server supports phases
                 and ret is None # nothing was pushed
                 and remotephases.get('publishing', False)):
@@ -195,7 +211,8 @@
                 localphasemove(cheads)
                 # don't push any phase data as there is nothing to push
             else:
-                ana = phases.analyzeremotephases(repo, cheads, remotephases)
+                ana = phases.analyzeremotephases(pushop.repo, cheads,
+                                                 remotephases)
                 pheads, droots = ana
                 ### Apply remote phase on local
                 if remotephases.get('publishing', False):
@@ -216,10 +233,10 @@
                                        str(phases.draft),
                                        str(phases.public))
                     if not r:
-                        repo.ui.warn(_('updating %s to public failed!\n')
+                        pushop.repo.ui.warn(_('updating %s to public failed!\n')
                                         % newremotehead)
-            repo.ui.debug('try to push obsolete markers to remote\n')
-            obsolete.syncpush(repo, remote)
+            pushop.repo.ui.debug('try to push obsolete markers to remote\n')
+            obsolete.syncpush(pushop.repo, remote)
         finally:
             if lock is not None:
                 lock.release()
@@ -227,5 +244,5 @@
         if locallock is not None:
             locallock.release()
 
-    bookmarks.updateremote(repo.ui, unfi, remote, revs)
+    bookmarks.updateremote(pushop.repo.ui, unfi, remote, revs)
     return ret