# HG changeset patch # User Pierre-Yves David # Date 2015-09-17 21:03:15 # Node ID c99b4d6efdd815dd456fe4b69be99c7a3b3cec09 # Parent 5ba3358ebc7fdd7718bcad44e4c574c06c388beb merge: move default destination computation in a revset This is another step toward having "default" destination more clear and unified. diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -4768,58 +4768,8 @@ def merge(ui, repo, node=None, **opts): if node: node = scmutil.revsingle(repo, node).node() - if not node and repo._activebookmark: - bmheads = repo.bookmarkheads(repo._activebookmark) - curhead = repo[repo._activebookmark].node() - if len(bmheads) == 2: - if curhead == bmheads[0]: - node = bmheads[1] - else: - node = bmheads[0] - elif len(bmheads) > 2: - raise util.Abort(_("multiple matching bookmarks to merge - " - "please merge with an explicit rev or bookmark"), - hint=_("run 'hg heads' to see all heads")) - elif len(bmheads) <= 1: - raise util.Abort(_("no matching bookmark to merge - " - "please merge with an explicit rev or bookmark"), - hint=_("run 'hg heads' to see all heads")) - - elif not node: - branch = repo[None].branch() - bheads = repo.branchheads(branch) - nbhs = [bh for bh in bheads if not repo[bh].bookmarks()] - - if len(nbhs) > 2: - raise util.Abort(_("branch '%s' has %d heads - " - "please merge with an explicit rev") - % (branch, len(bheads)), - hint=_("run 'hg heads .' to see heads")) - - parent = repo.dirstate.p1() - if len(nbhs) <= 1: - if len(bheads) > 1: - raise util.Abort(_("heads are bookmarked - " - "please merge with an explicit rev"), - hint=_("run 'hg heads' to see all heads")) - if len(repo.heads()) > 1: - raise util.Abort(_("branch '%s' has one head - " - "please merge with an explicit rev") - % branch, - hint=_("run 'hg heads' to see all heads")) - msg, hint = _('nothing to merge'), None - if parent != repo.lookup(branch): - hint = _("use 'hg update' instead") - raise util.Abort(msg, hint=hint) - - if parent not in bheads: - raise util.Abort(_('working directory not at a head revision'), - hint=_("use 'hg update' or merge with an " - "explicit revision")) - if parent == nbhs[0]: - node = nbhs[-1] - else: - node = nbhs[0] + if not node: + node = scmutil.revsingle(repo, '_mergedefaultdest()').node() if opts.get('preview'): # find nodes that are ancestors of p2 but not of p1 diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -463,6 +463,67 @@ def func(repo, subset, a, b): # functions +def _mergedefaultdest(repo, subset, x): + # ``_mergedefaultdest()`` + + # default destination for merge. + # # XXX: Currently private because I expect the signature to change. + # # XXX: - taking rev as arguments, + # # XXX: - bailing out in case of ambiguity vs returning all data. + getargs(x, 0, 0, _("_mergedefaultdest takes no arguments")) + if repo._activebookmark: + bmheads = repo.bookmarkheads(repo._activebookmark) + curhead = repo[repo._activebookmark].node() + if len(bmheads) == 2: + if curhead == bmheads[0]: + node = bmheads[1] + else: + node = bmheads[0] + elif len(bmheads) > 2: + raise util.Abort(_("multiple matching bookmarks to merge - " + "please merge with an explicit rev or bookmark"), + hint=_("run 'hg heads' to see all heads")) + elif len(bmheads) <= 1: + raise util.Abort(_("no matching bookmark to merge - " + "please merge with an explicit rev or bookmark"), + hint=_("run 'hg heads' to see all heads")) + else: + branch = repo[None].branch() + bheads = repo.branchheads(branch) + nbhs = [bh for bh in bheads if not repo[bh].bookmarks()] + + if len(nbhs) > 2: + raise util.Abort(_("branch '%s' has %d heads - " + "please merge with an explicit rev") + % (branch, len(bheads)), + hint=_("run 'hg heads .' to see heads")) + + parent = repo.dirstate.p1() + if len(nbhs) <= 1: + if len(bheads) > 1: + raise util.Abort(_("heads are bookmarked - " + "please merge with an explicit rev"), + hint=_("run 'hg heads' to see all heads")) + if len(repo.heads()) > 1: + raise util.Abort(_("branch '%s' has one head - " + "please merge with an explicit rev") + % branch, + hint=_("run 'hg heads' to see all heads")) + msg, hint = _('nothing to merge'), None + if parent != repo.lookup(branch): + hint = _("use 'hg update' instead") + raise util.Abort(msg, hint=hint) + + if parent not in bheads: + raise util.Abort(_('working directory not at a head revision'), + hint=_("use 'hg update' or merge with an " + "explicit revision")) + if parent == nbhs[0]: + node = nbhs[-1] + else: + node = nbhs[0] + return subset & baseset([repo[node].rev()]) + def adds(repo, subset, x): """``adds(pattern)`` Changesets that add a file matching pattern. @@ -2100,6 +2161,7 @@ def _hexlist(repo, subset, x): return baseset([r for r in ls if r in s]) symbols = { + "_mergedefaultdest": _mergedefaultdest, "adds": adds, "all": getall, "ancestor": ancestor,