# HG changeset patch # User Pierre-Yves David # Date 1396657739 25200 # Node ID 33d5fdd9bd991902851972795459c086b059af8a # Parent 984850270acba93831c907e4e93757645c2b29b0 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. diff -r 984850270acb -r 33d5fdd9bd99 mercurial/exchange.py --- 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 diff -r 984850270acb -r 33d5fdd9bd99 mercurial/wireproto.py --- 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: