# HG changeset patch # User Pulkit Goyal <7895pulkit@gmail.com> # Date 1599650359 -19800 # Node ID 6877b0ee5f9d710e0b34eb51a29d4b0d9944c84f # Parent e7587430ca239f3e7a148359063548b55415c919 mergestate: introduce a new ACTION_KEEP_NEW `ACTION_KEEP` is overloaded and it's hard to figure out how we end up with this KEEP, what was the state of things. In a previous patch, we introduced `ACTION_KEEP_ABSENT` which represents files which are kept absent in the working directory. There is another special case where we keep the file when it's not present on both ancestor and remote side. We introduce a dedicated action for that. The goal is to use these information to make bid merge smarter. Differential Revision: https://phab.mercurial-scm.org/D9002 diff -r e7587430ca23 -r 6877b0ee5f9d mercurial/merge.py --- a/mercurial/merge.py Mon Sep 21 10:23:25 2020 -0400 +++ b/mercurial/merge.py Wed Sep 09 16:49:19 2020 +0530 @@ -552,6 +552,7 @@ NO_OP_ACTIONS = ( mergestatemod.ACTION_KEEP, mergestatemod.ACTION_KEEP_ABSENT, + mergestatemod.ACTION_KEEP_NEW, ) def __init__(self): @@ -921,7 +922,7 @@ else: # file not in ancestor, not in remote mresult.addfile( f, - mergestatemod.ACTION_KEEP, + mergestatemod.ACTION_KEEP_NEW, None, b'ancestor missing, remote missing', ) @@ -1191,6 +1192,11 @@ repo.ui.note(_(b" %s: picking 'keep absent' action\n") % f) mresult.addfile(f, *bids[mergestatemod.ACTION_KEEP_ABSENT][0]) continue + # If keep new is an option, let's just do that + if mergestatemod.ACTION_KEEP_NEW in bids: + repo.ui.note(_(b" %s: picking 'keep new' action\n") % f) + mresult.addfile(f, *bids[mergestatemod.ACTION_KEEP_NEW][0]) + continue # If there are gets and they all agree [how could they not?], do it. if mergestatemod.ACTION_GET in bids: ga0 = bids[mergestatemod.ACTION_GET][0] @@ -1496,16 +1502,10 @@ progress.increment(item=f) # keep (noop, just log it) - for f, args, msg in mresult.getactions( - (mergestatemod.ACTION_KEEP,), sort=True - ): - repo.ui.debug(b" %s: %s -> k\n" % (f, msg)) - # no progress - for f, args, msg in mresult.getactions( - (mergestatemod.ACTION_KEEP_ABSENT,), sort=True - ): - repo.ui.debug(b" %s: %s -> ka\n" % (f, msg)) - # no progress + for a in mergeresult.NO_OP_ACTIONS: + for f, args, msg in mresult.getactions((a,), sort=True): + repo.ui.debug(b" %s: %s -> %s\n" % (f, msg, a)) + # no progress # directory rename, move local for f, args, msg in mresult.getactions( diff -r e7587430ca23 -r 6877b0ee5f9d mercurial/mergestate.py --- a/mercurial/mergestate.py Mon Sep 21 10:23:25 2020 -0400 +++ b/mercurial/mergestate.py Wed Sep 09 16:49:19 2020 +0530 @@ -117,6 +117,9 @@ # keep it absent (absent means file not present, it can be a result # of file deletion, rename etc.) ACTION_KEEP_ABSENT = b'ka' +# the file is absent on the ancestor and remote side of the merge +# hence this file is new and we should keep it +ACTION_KEEP_NEW = b'kn' ACTION_EXEC = b'e' ACTION_CREATED_MERGE = b'cm' @@ -767,6 +770,10 @@ for f, args, msg in actions.get(ACTION_KEEP_ABSENT, []): pass + # keep new + for f, args, msg in actions.get(ACTION_KEEP_NEW, []): + pass + # get for f, args, msg in actions.get(ACTION_GET, []): if branchmerge: diff -r e7587430ca23 -r 6877b0ee5f9d tests/test-merge-criss-cross.t --- a/tests/test-merge-criss-cross.t Mon Sep 21 10:23:25 2020 -0400 +++ b/tests/test-merge-criss-cross.t Wed Sep 09 16:49:19 2020 +0530 @@ -431,8 +431,8 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 11b5b303e36c, local: c0ef19750a22+, remote: 6ca01f7342b9 - d1/a: ancestor missing, remote missing -> k - d1/b: ancestor missing, remote missing -> k + d1/a: ancestor missing, remote missing -> kn + d1/b: ancestor missing, remote missing -> kn d2/b: remote created -> g calculating bids for ancestor 154e6000f54e @@ -452,13 +452,13 @@ auction for merging merge bids (2 ancestors) list of bids for d1/a: - ancestor missing, remote missing -> k + ancestor missing, remote missing -> kn other deleted -> r - d1/a: picking 'keep' action + d1/a: picking 'keep new' action list of bids for d1/b: - ancestor missing, remote missing -> k + ancestor missing, remote missing -> kn other deleted -> r - d1/b: picking 'keep' action + d1/b: picking 'keep new' action list of bids for d2/b: remote created -> g remote created -> g @@ -467,8 +467,8 @@ d2/b: remote created -> g getting d2/b - d1/a: ancestor missing, remote missing -> k - d1/b: ancestor missing, remote missing -> k + d1/a: ancestor missing, remote missing -> kn + d1/b: ancestor missing, remote missing -> kn 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit)