From patchwork Tue Feb 11 21:32:52 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [2,of,7,(push,is,done; ,12,more,to,go,for,pull)] push: move changeset push logic in its own function From: Pierre-Yves David X-Patchwork-Id: 3583 Message-Id: To: mercurial-devel@selenic.com Cc: pierre-yves.david@ens-lyon.org Date: Tue, 11 Feb 2014 13:32:52 -0800 # HG changeset patch # User Pierre-Yves David # Date 1391143495 28800 # Thu Jan 30 20:44:55 2014 -0800 # Node ID d90f282f42ed0f761e95cffb997088cf4974e2b8 # Parent 783539ede731dee892842d1d07d27e8be95f8fa3 push: move changeset push logic in its own function Now that every necessary information is held in the `pushoperation` object, we can extract the logic pushing changeset to it's own function. This changeset is pure code movement only. diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -139,47 +139,11 @@ def push(repo, remote, force=False, revs ctx)) newbm = pushop.ui.configlist('bookmarks', 'pushing') discovery.checkheads(unfi, pushop.remote, outgoing, remoteheads, pushop.newbranch, bool(inc), newbm) - - # TODO: get bundlecaps from remote - bundlecaps = None - # create a changegroup from local - if pushop.revs is None and not (outgoing.excluded - or pushop.repo.changelog.filteredrevs): - # push everything, - # use the fast path, no race possible on push - bundler = changegroup.bundle10(pushop.repo, bundlecaps) - cg = pushop.repo._changegroupsubset(outgoing, - bundler, - 'push', - fastpath=True) - else: - cg = pushop.repo.getlocalbundle('push', outgoing, - bundlecaps) - - # apply changegroup to remote - if unbundle: - # local repo finds heads on server, finds out what - # revs it must push. once revs transferred, if server - # finds it has different heads (someone else won - # commit/push race), server aborts. - if pushop.force: - remoteheads = ['force'] - else: - remoteheads = pushop.remoteheads - # ssh: return remote's addchangegroup() - # http: return remote's addchangegroup() or 0 for error - pushop.ret = pushop.remote.unbundle(cg, remoteheads, - 'push') - else: - # we return an integer indicating remote head count - # change - pushop.ret = pushop.remote.addchangegroup(cg, 'push', - pushop.repo.url()) - + _pushchangeset(pushop) _pushsyncphase(pushop) _pushobsolete(pushop) finally: if lock is not None: lock.release() @@ -188,10 +152,49 @@ def push(repo, remote, force=False, revs locallock.release() _pushbookmark(pushop) return pushop.ret +def _pushchangeset(pushop): + """Make the actual push of changeset bundle to remote repo""" + outgoing = pushop.outgoing + unbundle = pushop.remote.capable('unbundle') + # TODO: get bundlecaps from remote + bundlecaps = None + # create a changegroup from local + if pushop.revs is None and not (outgoing.excluded + or pushop.repo.changelog.filteredrevs): + # push everything, + # use the fast path, no race possible on push + bundler = changegroup.bundle10(pushop.repo, bundlecaps) + cg = pushop.repo._changegroupsubset(outgoing, + bundler, + 'push', + fastpath=True) + else: + cg = pushop.repo.getlocalbundle('push', outgoing, bundlecaps) + + # apply changegroup to remote + if unbundle: + # local repo finds heads on server, finds out what + # revs it must push. once revs transferred, if server + # finds it has different heads (someone else won + # commit/push race), server aborts. + if pushop.force: + remoteheads = ['force'] + else: + remoteheads = pushop.remoteheads + # ssh: return remote's addchangegroup() + # http: return remote's addchangegroup() or 0 for error + pushop.ret = pushop.remote.unbundle(cg, remoteheads, + 'push') + else: + # we return an integer indicating remote head count + # change + pushop.ret = pushop.remote.addchangegroup(cg, 'push', + pushop.repo.url()) + def _pushsyncphase(pushop): """synchronise phase information locally and remotly""" unfi = pushop.repo.unfiltered() if pushop.ret: # push succeed, synchronize target of the push