merge: give priority to "not at head" failures for bare 'hg merge'
authorPierre-Yves David <pierre-yves.david@fb.com>
Mon, 08 Feb 2016 14:55:58 +0100
changeset 28103 7d852bb47b0a
parent 28102 bd74b5e0d2c0
child 28104 96f8baddbd6a
merge: give priority to "not at head" failures for bare 'hg merge' We refuse to pick a destination for a bare 'hg merge' if the working copy is not at head. This is meant to prevent strange merge from user who forget to update. (Moreover, such merge does not reduce actually the number of heads) However, we were doing that as the last possible failure type. So user were recommended to merge with an explicit head (from this bad location) if the branch had too many heads. We now make "not on branch heads" class of failure the first things to check and fail on. The one test that change was actually trying to check for these failure (and did not). The new test output is correct.
mercurial/destutil.py
tests/test-merge-default.t
--- a/mercurial/destutil.py	Tue Feb 09 21:14:37 2016 +0000
+++ b/mercurial/destutil.py	Mon Feb 08 14:55:58 2016 +0100
@@ -193,31 +193,33 @@
 def _destmergebranch(repo):
     """find merge destination based on branch heads"""
     node = None
+    parent = repo.dirstate.p1()
     branch = repo[None].branch()
     bheads = repo.branchheads(branch)
     nbhs = [bh for bh in bheads if not repo[bh].bookmarks()]
 
+    if parent not in bheads:
+        if len(repo.heads()) <= 1:
+            msg, hint = msgdestmerge['nootherheadsbehind']
+        else:
+            msg, hint = msgdestmerge['notatheads']
+        raise error.Abort(msg, hint=hint)
+
     if len(nbhs) > 2:
         msg, hint = msgdestmerge['toomanyheads']
         msg %= (branch, len(bheads))
         raise error.Abort(msg, hint=hint)
 
-    parent = repo.dirstate.p1()
     if len(nbhs) <= 1:
         if len(bheads) > 1:
             msg, hint = msgdestmerge['bookmarkedheads']
         elif len(repo.heads()) > 1:
             msg, hint = msgdestmerge['nootherbranchheads']
             msg %= branch
-        elif parent != repo.lookup(branch):
-            msg, hint = msgdestmerge['nootherheadsbehind']
         else:
             msg, hint = msgdestmerge['nootherheads']
         raise error.Abort(msg, hint=hint)
 
-    if parent not in bheads:
-        msg, hint = msgdestmerge['notatheads']
-        raise error.Abort(msg, hint=hint)
     if parent == nbhs[0]:
         node = nbhs[-1]
     else:
--- a/tests/test-merge-default.t	Tue Feb 09 21:14:37 2016 +0000
+++ b/tests/test-merge-default.t	Mon Feb 08 14:55:58 2016 +0100
@@ -27,8 +27,8 @@
 Should fail because not at a head:
 
   $ hg merge
-  abort: branch 'default' has 3 heads - please merge with an explicit rev
-  (run 'hg heads .' to see heads)
+  abort: working directory not at a head revision
+  (use 'hg update' or merge with an explicit revision)
   [255]
 
   $ hg up