mercurial/exchange.py
changeset 20472 b97a453b8c27
parent 20469 6b4c789d618d
child 20473 1516daaca632
--- a/mercurial/exchange.py	Mon Jan 27 21:39:25 2014 +0100
+++ b/mercurial/exchange.py	Thu Jan 30 17:24:49 2014 -0800
@@ -373,10 +373,23 @@
         else:
             ui.warn(_('updating bookmark %s failed!\n') % b)
 
+class pulloperation(object):
+    """A object that represent a single pull 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 pull from
+        self.repo = repo
 
 def pull(repo, remote, heads=None, force=False):
+    pullop = pulloperation(repo)
     if remote.local():
-        missing = set(remote.requirements) - repo.supported
+        missing = set(remote.requirements) - pullop.repo.supported
         if missing:
             msg = _("required features are not"
                     " supported in the destination:"
@@ -387,18 +400,18 @@
     # rollback call
     tr = None
     trname = 'pull\n' + util.hidepassword(remote.url())
-    lock = repo.lock()
+    lock = pullop.repo.lock()
     try:
-        tmp = discovery.findcommonincoming(repo.unfiltered(), remote,
+        tmp = discovery.findcommonincoming(pullop.repo.unfiltered(), remote,
                                            heads=heads, force=force)
         common, fetch, rheads = tmp
         if not fetch:
-            repo.ui.status(_("no changes found\n"))
+            pullop.repo.ui.status(_("no changes found\n"))
             result = 0
         else:
-            tr = repo.transaction(trname)
+            tr = pullop.repo.transaction(trname)
             if heads is None and list(common) == [nullid]:
-                repo.ui.status(_("requesting all changes\n"))
+                pullop.repo.ui.status(_("requesting all changes\n"))
             elif heads is None and remote.capable('changegroupsubset'):
                 # issue1320, avoid a race if remote changed after discovery
                 heads = rheads
@@ -415,7 +428,7 @@
                                        "changegroupsubset."))
             else:
                 cg = remote.changegroupsubset(fetch, heads, 'pull')
-            result = repo.addchangegroup(cg, 'pull', remote.url())
+            result = pullop.repo.addchangegroup(cg, 'pull', remote.url())
 
         # compute target subset
         if heads is None:
@@ -432,21 +445,21 @@
         publishing = bool(remotephases.get('publishing', False))
         if remotephases and not publishing:
             # remote is new and unpublishing
-            pheads, _dr = phases.analyzeremotephases(repo, subset,
+            pheads, _dr = phases.analyzeremotephases(pullop.repo, subset,
                                                      remotephases)
-            phases.advanceboundary(repo, phases.public, pheads)
-            phases.advanceboundary(repo, phases.draft, subset)
+            phases.advanceboundary(pullop.repo, phases.public, pheads)
+            phases.advanceboundary(pullop.repo, phases.draft, subset)
         else:
             # Remote is old or publishing all common changesets
             # should be seen as public
-            phases.advanceboundary(repo, phases.public, subset)
+            phases.advanceboundary(pullop.repo, phases.public, subset)
 
         def gettransaction():
             if tr is None:
-                return repo.transaction(trname)
+                return pullop.repo.transaction(trname)
             return tr
 
-        obstr = obsolete.syncpull(repo, remote, gettransaction)
+        obstr = obsolete.syncpull(pullop.repo, remote, gettransaction)
         if obstr is not None:
             tr = obstr