# HG changeset patch # User Martin von Zweigbergk # Date 2017-02-08 22:49:37 # Node ID 47278970fc8c1666a9922285ed15267c2ad5fb70 # Parent 23eed7d423b4d6d40dd5c0ae9e5ebd1420a265e0 update: localize logic around which ancestor to use The merge code works by applying the changes between an ancestor and the working copy onto the destination. To achieve an update, it sets the ancestor to be the parent of the working copy. To achieve a clean update (update -C), it sets the ancestor to be the working copy itself (so there are no changes to carry over). The logic for this was spread out a bit. Let's move it all to one place so it's easier to follow the reason for it. Also add some documentation. diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -1556,7 +1556,7 @@ def update(repo, node, branchmerge, forc foreground = obsolete.foreground(repo, [p1.node()]) # note: the variable contains a random identifier if repo[node].node() in foreground: - pas = [p1] # allow updating to successors + pass # allow updating to successors elif dirty: msg = _("uncommitted changes") if onode is None: @@ -1572,15 +1572,17 @@ def update(repo, node, branchmerge, forc raise error.Abort(msg, hint=hint) else: # Allow jumping branches if clean and specific rev given - pas = [p1] + pass + + if overwrite: + pas = [wc] + elif not branchmerge: + pas = [p1] # deprecated config: merge.followcopies followcopies = repo.ui.configbool('merge', 'followcopies', True) if overwrite: - pas = [wc] followcopies = False - elif pas == [p2]: # backwards - pas = [p1] elif not pas[0]: followcopies = False if not branchmerge and not wc.dirty(missing=True):