@@ -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 = {}
@@ -6572,10 +6572,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)
@@ -10,11 +10,11 @@ from . import (
error,
util,
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
@@ -51,6 +51,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 util.Abort(msg, hint=hint)
+ else: # destination is not a descendant.
+ msg = _("not a linear update")
+ hint = _("merge or update --check to force update")
+ raise util.Abort(msg, hint=hint)
+
+ return rev