diff -r 8dd5200b4086 -r 58ef5699fb35 src/topic/destination.py --- a/src/topic/destination.py Wed Oct 21 01:12:32 2015 +0200 +++ b/src/topic/destination.py Wed Oct 21 01:09:15 2015 +0200 @@ -1,5 +1,48 @@ -from mercurial import revset from mercurial import error +from mercurial import util +from mercurial import destutil +from mercurial import extensions +from mercurial.i18n import _ + +def _destmergebranch(orig, repo): + p1 = repo['.'] + top = p1.topic() + if top: + heads = repo.revs('heads(topic(.)::topic(.))') + if p1.rev() not in heads: + raise error.Abort(_("not at topic head, update or explicit")) + elif 1 == len(heads): + # should look at all branch involved but... later + bhead = ngtip(repo, p1.branch(), all=True) + if not bhead: + raise error.Abort(_("nothing to merge")) + elif 1 == len(bhead): + return bhead.first() + else: + raise error.Abort(_("branch '%s' has %d heads - " + "please merge with an explicit rev") + % (p1.branch(), len(bhead)), + hint=_("run 'hg heads .' to see heads")) + elif 2 == len(heads): + heads = [r for r in heads if r != p1.rev()] + # XXX: bla bla bla bla bla + if 1 < len(heads): + raise error.Abort(_('working directory not at a head revision'), + hint=_("use 'hg update' or merge with an " + "explicit revision")) + return heads[0] + elif 2 < len(heads): + raise error.Abort(_("topic '%s' has %d heads - " + "please merge with an explicit rev") + % (top, len(heads))) + else: + assert False # that's impossible + return orig(repo) + +def setupdest(): + if util.safehasattr(destutil, '_destmergebranch'): + extensions.wrapfunction(destutil, '_destmergebranch', _destmergebranch) + def ngtip(repo, branch, all=False): """tip new generation""" ## search for untopiced heads of branch