diff mercurial/exchange.py @ 20968:33d5fdd9bd99

unbundle: extract the core logic in another function The `exchange` module now contains an `unbundle` function that holds the core unbundle logic. The wire protocol keeps its own unbundle function. It enforces wireprotocol-specific logic and then calls the extracted function. This aims at implementing unbundle for localrepo.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Fri, 04 Apr 2014 17:28:59 -0700
parents 984850270acb
children 7a679918ee2b
line wrap: on
line diff
--- a/mercurial/exchange.py	Fri Apr 04 17:15:25 2014 -0700
+++ b/mercurial/exchange.py	Fri Apr 04 17:28:59 2014 -0700
@@ -5,6 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
+import sys
 from i18n import _
 from node import hex, nullid
 import cStringIO
@@ -628,3 +629,28 @@
         # were transferring data
         raise PushRaced('repository changed while %s - '
                         'please try again' % context)
+
+def unbundle(repo, cg, heads, source, url):
+    """Apply a bundle to a repo.
+
+    this function makes sure the repo is locked during the application and have
+    mechanism to check that no push race occured between the creation of the
+    bundle and its application.
+
+    If the push was raced as PushRaced exception is raised."""
+    r = 0
+    lock = repo.lock()
+    try:
+        check_heads(repo, heads, 'uploading changes')
+        # push can proceed
+        try:
+            r = changegroup.addchangegroup(repo, cg, source, url)
+        except util.Abort, inst:
+            # The old code we moved used sys.stderr directly.
+            # We did not changed it to minise code change.
+            # This need to be moved to something proper.
+            # Feel free to do it.
+            sys.stderr.write("abort: %s\n" % inst)
+    finally:
+        lock.release()
+    return r