# HG changeset patch # User Pierre-Yves David # Date 2016-02-08 17:12:06 # Node ID 5ad2017454eeafa6e70fe42a78cef22fa593a41c # Parent b54c0246295b8b3cfe09ba15e529b5c29b695ea8 destutil: remove current head from list of candidates early While 'hg merge' will refuse to pick a default destination if the working copy is not on a head, this will be a common and valid case for rebase. In this case, we will need to exclude from the candidate destination all descendants from the rebased set. We make a step forward in that direction by removing parents of the working copy from the candidate destinations instead of manually filtering the working copy parent at the end of the process. This will make the extra step of filtering descendant much simpler in a future changeset. diff --git a/mercurial/destutil.py b/mercurial/destutil.py --- a/mercurial/destutil.py +++ b/mercurial/destutil.py @@ -212,7 +212,6 @@ def _destmergebranch(repo, action='merge parent = repo.dirstate.p1() branch = repo.dirstate.branch() bheads = repo.branchheads(branch) - nbhs = [bh for bh in bheads if not repo[bh].bookmarks()] if parent not in bheads: # Case A: working copy if not on a head. @@ -223,21 +222,25 @@ def _destmergebranch(repo, action='merge else: msg, hint = msgdestmerge['notatheads'][action] raise error.Abort(msg, hint=hint) - elif len(nbhs) > 2: - # Case B: There is more than 2 anonymous heads + # remove current head from the set + bheads = [bh for bh in bheads if bh != parent] + # filters out bookmarked heads + nbhs = [bh for bh in bheads if not repo[bh].bookmarks()] + if len(nbhs) > 1: + # Case B: There is more than 1 other anonymous heads # # This means that there will be more than 1 candidate. This is # ambiguous. We abort asking the user to pick as explicit destination # instead. msg, hint = msgdestmerge['toomanyheads'][action] - msg %= (branch, len(bheads)) + msg %= (branch, len(bheads) + 1) raise error.Abort(msg, hint=hint) - elif len(nbhs) <= 1: - # Case B: There is no other anonymous head that the one we are one + elif not nbhs: + # Case B: There is no other anonymous heads # # This means that there is no natural candidate to merge with. # We abort, with various messages for various cases. - if len(bheads) > 1: + if bheads: msg, hint = msgdestmerge['bookmarkedheads'][action] elif len(repo.heads()) > 1: msg, hint = msgdestmerge['nootherbranchheads'][action] @@ -245,8 +248,6 @@ def _destmergebranch(repo, action='merge else: msg, hint = msgdestmerge['nootherheads'][action] raise error.Abort(msg, hint=hint) - elif parent == nbhs[0]: - node = nbhs[-1] else: node = nbhs[0] assert node is not None