[PATCH 1 of 4 defaultdest V2] destupdate: move the check related to the "clean" logic in the function
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Mon Oct 12 17:22:53 UTC 2015
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1444042247 25200
# Mon Oct 05 03:50:47 2015 -0700
# Node ID b11a6b6eb40b453a53a01da69f876a4ab78de402
# Parent 9ca13d10881d7044b79d903ad64653f6541591f1
# EXP-Topic defaultdest
# Available At http://hg.netv6.net/marmoute-wip/mercurial/
# hg pull http://hg.netv6.net/marmoute-wip/mercurial/ -r b11a6b6eb40b
destupdate: move the check related to the "clean" logic in the function
We want this function to exactly predict the behavior for update. Moreover, we
would like to remove all high level behavior logic out of the merge module so
this is a step forward.
Now that the 'destupdate' function both compute and validate the destination, we
can directly use it at the command level, ensuring that the 'hg update' command
never call 'merge.update' without a defined destination. This is a first (but
significant) step toward having 'merge.update' always feed with a properly
validated destination and free of high level logic.
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -18,11 +18,11 @@ import extensions
from hgweb import server as hgweb_server
import merge as mergemod
import minirst, revset, fileset
import dagparser, context, simplemerge, graphmod, copies
import random, operator
-import setdiscovery, treediscovery, dagutil, pvec, localrepo
+import setdiscovery, treediscovery, dagutil, pvec, localrepo, destutil
import phases, obsolete, exchange, bundle2, repair, lock as lockmod
import ui as uimod
table = {}
@@ -6577,10 +6577,12 @@ def update(ui, repo, node=None, rev=None
if check:
cmdutil.bailifchanged(repo, merge=False)
if rev is None:
rev = repo[repo[None].branch()].rev()
+ elif rev is None:
+ rev = destutil.destupdate(repo, clean=clean)
repo.ui.setconfig('ui', 'forcemerge', tool, 'update')
if clean:
ret = hg.clean(repo, rev)
diff --git a/mercurial/destutil.py b/mercurial/destutil.py
--- a/mercurial/destutil.py
+++ b/mercurial/destutil.py
@@ -9,11 +9,11 @@ from .i18n import _
from . import (
error,
obsolete,
)
-def destupdate(repo):
+def destupdate(repo, clean=False):
"""destination for bare update operation
"""
# Here is where we should consider bookmarks, divergent bookmarks, and tip
# of current branch; but currently we are only checking the branch tips.
node = None
@@ -50,6 +50,30 @@ def destupdate(repo):
successors = [n for sub in successors for n in sub]
# get the max revision for the given successors set,
# i.e. the 'tip' of a set
node = repo.revs('max(%ln)', successors).first()
- return repo[node].rev()
+ rev = repo[node].rev()
+
+ if not clean:
+ # Check that the update is linear.
+ #
+ # Mercurial do not allow update-merge for non linear pattern
+ # (that would be technically possible but was considered too confusing
+ # for user a long time ago)
+ #
+ # See mercurial.merge.update for details
+ if p1.rev() not in repo.changelog.ancestors([rev], inclusive=True):
+ dirty = wc.dirty(missing=True)
+ foreground = obsolete.foreground(repo, [p1.node()])
+ if not repo[rev].node() in foreground:
+ if dirty:
+ msg = _("uncommitted changes")
+ hint = _("commit and merge, or update --clean to"
+ " discard changes")
+ raise error.Abort(msg, hint=hint)
+ else: # destination is not a descendant.
+ msg = _("not a linear update")
+ hint = _("merge or update --check to force update")
+ raise error.Abort(msg, hint=hint)
+
+ return rev
More information about the Mercurial-devel
mailing list