# HG changeset patch # User Pierre-Yves David # Date 1445382555 -7200 # Node ID 58ef5699fb35c15f8b6d9a9687d0852b5c549192 # Parent 8dd5200b40865304c3e66ffa41706d360c89b4f1 merge: use topic to pick default destination If the topic have multiple heads, reduce that. Otherwise, pick the branch we are on. diff -r 8dd5200b4086 -r 58ef5699fb35 src/topic/__init__.py --- a/src/topic/__init__.py Wed Oct 21 01:12:32 2015 +0200 +++ b/src/topic/__init__.py Wed Oct 21 01:09:15 2015 +0200 @@ -28,6 +28,7 @@ from . import constants from . import revset as topicrevset +from . import destination cmdtable = {} command = cmdutil.command(cmdtable) @@ -47,6 +48,9 @@ return [t] return [] +def uisetup(ui): + destination.setupdest() + def reposetup(ui, repo): orig = repo.__class__ class topicrepo(repo.__class__): 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 diff -r 8dd5200b4086 -r 58ef5699fb35 tests/test-topic-dest.t --- a/tests/test-topic-dest.t Wed Oct 21 01:12:32 2015 +0200 +++ b/tests/test-topic-dest.t Wed Oct 21 01:09:15 2015 +0200 @@ -91,3 +91,66 @@ $ hg log -r 'ngtip(.)' 6 () c_epsilon +merge destination +================= + + $ hg up 'ngtip(default)' + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo zeta >> zeta + $ hg add zeta + $ hg ci -m "c_zeta" + created new head + $ hg log -G + @ 9 () c_zeta + | + | o 8 (monkey) zephir + |/ + | o 7 (elephant) babar + |/ + o 6 () c_epsilon + | + o 3 () c_delta + | + o 2 () c_gamma + | + o 1 () c_beta + | + o 0 () c_alpha + + $ hg up elephant + switching to topic elephant + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg rebase # make sure tip is elsewhere + rebasing 7:8d0b77140b05 "babar" + $ hg up monkey + switching to topic monkey + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg merge + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg topic + elephant + * monkey + $ hg ci -m 'merge with default' + $ hg topic + elephant + * monkey + $ hg log -G + @ 11 (monkey) merge with default + |\ + | | o 10 (elephant) babar + | |/ + | o 9 () c_zeta + | | + o | 8 (monkey) zephir + |/ + o 6 () c_epsilon + | + o 3 () c_delta + | + o 2 () c_gamma + | + o 1 () c_beta + | + o 0 () c_alpha +