diff --git a/mercurial/commit.py b/mercurial/commit.py --- a/mercurial/commit.py +++ b/mercurial/commit.py @@ -335,9 +335,12 @@ if ms and ms.extras(fname).get(b'filenode-source') == b'other': fparent1, fparent2 = fparent2, nullid + force_new_node = False + if ms and ms.extras(fname).get(b'FORCE_NEW_FILENODE') == b'yes': + force_new_node = True # is the file changed? text = fctx.data() - if fparent2 != nullid or meta or flog.cmp(fparent1, text): + if fparent2 != nullid or meta or flog.cmp(fparent1, text) or force_new_node: if touched is None: # do not overwrite added touched = 'modified' fnode = flog.add(text, meta, tr, linkrev, fparent1, fparent2) diff --git a/tests/test-merge-combination.t b/tests/test-merge-combination.t --- a/tests/test-merge-combination.t +++ b/tests/test-merge-combination.t @@ -113,7 +113,7 @@ 1234 C: agree on "a" 123- C: agree on "a" 12-1 C: agree on "a" - 12-2 C: hg said "", expected "a" + 12-2 C: agree on "a" 12-3 C: agree on "a" 12-- C: agree on "a" 1-11 : hg said "", expected "a" diff --git a/tests/test-merge-criss-cross.t b/tests/test-merge-criss-cross.t --- a/tests/test-merge-criss-cross.t +++ b/tests/test-merge-criss-cross.t @@ -604,9 +604,10 @@ rev linkrev nodeid p1 p2 0 0 4b69178b9bda 000000000000 000000000000 1 1 59e363a07dc8 4b69178b9bda 000000000000 + 2 5 885af55420b3 59e363a07dc8 000000000000 $ hg update 'desc("updating-both-file")' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge 'desc("delete-the-file")' -t :local 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) @@ -630,11 +631,12 @@ rev linkrev nodeid p1 p2 0 0 4b69178b9bda 000000000000 000000000000 1 1 59e363a07dc8 4b69178b9bda 000000000000 + 2 5 885af55420b3 59e363a07dc8 000000000000 $ hg log -G -T '{node|short} {desc}\n' @ 5e3eccec60d8 merge-keeping-the-file-from-updated |\ - +---o e9b708131723 merge-keeping-the-file-from-deleted + +---o 38a4c3e7cac8 merge-keeping-the-file-from-deleted | |/ +---o a4e0e44229dc merge-deleting-the-file-from-updated | |/ @@ -666,16 +668,17 @@ $ hg update --clean 'desc("merge-deleting-the-file-from-deleted")' 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge 'desc("merge-keeping-the-file-from-deleted")' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ ls -1 other-file + the-file (merging a deletion with keeping → conflict) BROKEN: this should result in conflict $ hg update --clean 'desc("merge-deleting-the-file-from-deleted")' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg merge 'desc("merge-keeping-the-file-from-updated")' 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) @@ -698,16 +701,17 @@ $ hg update --clean 'desc("merge-deleting-the-file-from-updated")' 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge 'desc("merge-keeping-the-file-from-deleted")' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ ls -1 other-file + the-file (merging a deletion with keeping → conflict) BROKEN: this should result in conflict $ hg update --clean 'desc("merge-deleting-the-file-from-updated")' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg merge 'desc("merge-keeping-the-file-from-updated")' 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) @@ -719,7 +723,7 @@ $ hg update --clean 'desc("merge-keeping-the-file-from-updated")' 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge 'desc("merge-keeping-the-file-from-deleted")' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ ls -1 other-file @@ -729,7 +733,7 @@ BROKEN: this should result in conflict $ hg update --clean 'desc("merge-keeping-the-file-from-updated")' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge 'desc("merge-deleted-the-file-from-deleted")' abort: empty revision set [255] @@ -752,7 +756,7 @@ (merging two "keeping" together → no conflict) $ hg update --clean 'desc("merge-keeping-the-file-from-deleted")' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge 'desc("merge-keeping-the-file-from-updated")' 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit)