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.
--- 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
--- a/mercurial/wireproto.py Fri Apr 04 17:15:25 2014 -0700
+++ b/mercurial/wireproto.py Fri Apr 04 17:28:59 2014 -0700
@@ -765,21 +765,10 @@
r = 0
try:
proto.getfile(fp)
- lock = repo.lock()
- try:
- exchange.check_heads(repo, their_heads, 'uploading changes')
-
- # push can proceed
- fp.seek(0)
- gen = changegroupmod.readbundle(fp, None)
-
- try:
- r = changegroupmod.addchangegroup(repo, gen, 'serve',
- proto._client())
- except util.Abort, inst:
- sys.stderr.write("abort: %s\n" % inst)
- finally:
- lock.release()
+ fp.seek(0)
+ gen = changegroupmod.readbundle(fp, None)
+ r = exchange.unbundle(repo, gen, their_heads, 'serve',
+ proto._client())
return pushres(r)
finally: