# HG changeset patch # User Pierre-Yves David # Date 1444875354 -3600 # Node ID e8f1b728591786143174515ea18089db0df4af90 # Parent 5b7fd48f9868ce57ae58c3d2d2366c75d82b3f2d destmerge: extract logic based on branch heads in its own function One of the main goal of having consolidated destination function is to allow extension to play with this logic. We extract sub logic to make is wrapping more practical. diff -r 5b7fd48f9868 -r e8f1b7285917 mercurial/destutil.py --- a/mercurial/destutil.py Thu Oct 15 03:13:14 2015 +0100 +++ b/mercurial/destutil.py Thu Oct 15 03:15:54 2015 +0100 @@ -152,42 +152,49 @@ assert node is not None return node +def _destmergebranch(repo): + """find merge destination based on branch heads""" + node = None + branch = repo[None].branch() + bheads = repo.branchheads(branch) + nbhs = [bh for bh in bheads if not repo[bh].bookmarks()] + + if len(nbhs) > 2: + raise error.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 error.Abort(_("heads are bookmarked - " + "please merge with an explicit rev"), + hint=_("run 'hg heads' to see all heads")) + if len(repo.heads()) > 1: + raise error.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 error.Abort(msg, hint=hint) + + if parent not in bheads: + raise error.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] + assert node is not None + return node + def destmerge(repo): if repo._activebookmark: node = _destmergebook(repo) 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 error.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 error.Abort(_("heads are bookmarked - " - "please merge with an explicit rev"), - hint=_("run 'hg heads' to see all heads")) - if len(repo.heads()) > 1: - raise error.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 error.Abort(msg, hint=hint) - - if parent not in bheads: - raise error.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] + node = _destmergebranch(repo) return repo[node].rev()