src/topic/destination.py
changeset 1871 58ef5699fb35
parent 1870 8dd5200b4086
child 1878 c44f161575ba
--- 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