{"thread":{"id":"53992","subject":"[PATCH] Collect merge-related tests to t64xx","startedAt":"2020-08-05T20:09:47Z","lastAt":"2020-08-10T22:29:38Z","messageCount":28,"participants":["Elijah Newren via GitGitGadget","Eric Sunshine","Elijah Newren"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"402954","messageId":"pull.827.git.git.1596644952296.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":null,"subject":"[PATCH] Collect merge-related tests to t64xx","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-05T16:29:12Z","receivedAt":"2020-08-05T20:09:47Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nThe tests for the merge machinery are spread over several places.\nCollect them into t64xx for simplicity.  Some notes:\n\nt60[234]*.sh:\n  Merge tests started in t602*, overgrew bisect and remote tracking\n  tests in t6030, t6040, and t6041, and nearly overtook replace tests\n  in t6050.  This made picking out relevant tests that I wanted to run\n  in a tighter loop slightly more annoying for years.\n\nt303*.sh:\n  These started out as tests for the 'merge-recursive' toplevel command,\n  but did not restrict to that and had lots of overlap with the\n  underlying merge machinery.\nt7405, t7613:\n  submodule-specific merge logic started out in submodule.c but was\n  moved to merge-recursive.c in commit 18cfc08866 (\"submodule.c: move\n  submodule merging to merge-recursive.c\", 2018-05-15).  Since these\n  tests are about the logic found in the merge machinery, moving these\n  tests to be with the merge tests makes sense.\n\nt7607, t7609:\n  Having tests spread all over the place makes it more likely that\n  additional tests related to a certain piece of logic grow in all those\n  other places.  Much like t303*.sh, these two tests were about the\n  underlying merge machinery rather than outer levels.\n\nTests that were NOT moved:\n\nt76[01]*.sh:\n  Other than the four tests mentioned above, the remaining tests in\n  t76[01]*.sh are related to non-recursive merge strategies, parameter\n  parsing, and other stuff associated with the highlevel builtin/merge.c\n  rather than the recursive merge machinery.\n\nt3[45]*.sh:\n  The rebase testcases in t34*.sh also test the merge logic pretty\n  heavily; sometimes changes I make only trigger failures in the rebase\n  tests.  The rebase tests are already nicely coupled together, though,\n  and I didn't want to mess that up.  Similar comments apply for the\n  cherry-pick tests in t35*.sh.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n    Collect merge machinery related tests into t64*.sh\n    \n    Although there are a couple in-flight topics that modify some of these\n    tests (en/eol-attr-gotchas and bc/sha-256-part-3), since this commit\n    only contains 100% renames, it merges cleanly and automatically with\n    both next and seen.\n\nPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-827%2Fnewren%2Fmerge-test-rename-v1\nFetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-827/newren/merge-test-rename-v1\nPull-Request: https://github.com/git/git/pull/827\n\n t/{t6020-merge-df.sh => t6400-merge-df.sh}                        | 0\n t/{t6021-merge-criss-cross.sh => t6401-merge-criss-cross.sh}      | 0\n t/{t6022-merge-rename.sh => t6402-merge-rename.sh}                | 0\n t/{t6023-merge-file.sh => t6403-merge-file.sh}                    | 0\n t/{t6024-recursive-merge.sh => t6404-recursive-merge.sh}          | 0\n t/{t6025-merge-symlinks.sh => t6405-merge-symlinks.sh}            | 0\n t/{t6026-merge-attr.sh => t6406-merge-attr.sh}                    | 0\n t/{t6027-merge-binary.sh => t6407-merge-binary.sh}                | 0\n t/{t6028-merge-up-to-date.sh => t6408-merge-up-to-date.sh}        | 0\n t/{t6029-merge-subtree.sh => t6409-merge-subtree.sh}              | 0\n t/{t6031-merge-filemode.sh => t6411-merge-filemode.sh}            | 0\n t/{t6032-merge-large-rename.sh => t6412-merge-large-rename.sh}    | 0\n t/{t6033-merge-crlf.sh => t6413-merge-crlf.sh}                    | 0\n ...6034-merge-rename-nocruft.sh => t6414-merge-rename-nocruft.sh} | 0\n ...6035-merge-dir-to-symlink.sh => t6415-merge-dir-to-symlink.sh} | 0\n ...-recursive-corner-cases.sh => t6416-recursive-corner-cases.sh} | 0\n t/{t6037-merge-ours-theirs.sh => t6417-merge-ours-theirs.sh}      | 0\n t/{t6038-merge-text-auto.sh => t6418-merge-text-auto.sh}          | 0\n t/{t6039-merge-ignorecase.sh => t6419-merge-ignorecase.sh}        | 0\n ...-rename-corner-cases.sh => t6422-merge-rename-corner-cases.sh} | 0\n ...ge-rename-directories.sh => t6423-merge-rename-directories.sh} | 0\n ...ed-index-changes.sh => t6424-merge-unrelated-index-changes.sh} | 0\n t/{t6045-merge-rename-delete.sh => t6425-merge-rename-delete.sh}  | 0\n ...p-unneeded-updates.sh => t6426-merge-skip-unneeded-updates.sh} | 0\n ...-diff3-conflict-markers.sh => t6427-diff3-conflict-markers.sh} | 0\n t/{t3030-merge-recursive.sh => t6430-merge-recursive.sh}          | 0\n t/{t3031-merge-criscross.sh => t6431-merge-criscross.sh}          | 0\n ...ve-space-options.sh => t6432-merge-recursive-space-options.sh} | 0\n t/{t3033-merge-toplevel.sh => t6433-merge-toplevel.sh}            | 0\n ...-rename-options.sh => t6434-merge-recursive-rename-options.sh} | 0\n t/{t3035-merge-sparse.sh => t6435-merge-sparse.sh}                | 0\n t/{t7607-merge-overwrite.sh => t6436-merge-overwrite.sh}          | 0\n t/{t7405-submodule-merge.sh => t6437-submodule-merge.sh}          | 0\n ...e-submodule.sh => t6438-submodule-directory-file-conflicts.sh} | 0\n t/{t7609-merge-co-error-msgs.sh => t6439-merge-co-error-msgs.sh}  | 0\n 35 files changed, 0 insertions(+), 0 deletions(-)\n rename t/{t6020-merge-df.sh => t6400-merge-df.sh} (100%)\n rename t/{t6021-merge-criss-cross.sh => t6401-merge-criss-cross.sh} (100%)\n rename t/{t6022-merge-rename.sh => t6402-merge-rename.sh} (100%)\n rename t/{t6023-merge-file.sh => t6403-merge-file.sh} (100%)\n rename t/{t6024-recursive-merge.sh => t6404-recursive-merge.sh} (100%)\n rename t/{t6025-merge-symlinks.sh => t6405-merge-symlinks.sh} (100%)\n rename t/{t6026-merge-attr.sh => t6406-merge-attr.sh} (100%)\n rename t/{t6027-merge-binary.sh => t6407-merge-binary.sh} (100%)\n rename t/{t6028-merge-up-to-date.sh => t6408-merge-up-to-date.sh} (100%)\n rename t/{t6029-merge-subtree.sh => t6409-merge-subtree.sh} (100%)\n rename t/{t6031-merge-filemode.sh => t6411-merge-filemode.sh} (100%)\n rename t/{t6032-merge-large-rename.sh => t6412-merge-large-rename.sh} (100%)\n rename t/{t6033-merge-crlf.sh => t6413-merge-crlf.sh} (100%)\n rename t/{t6034-merge-rename-nocruft.sh => t6414-merge-rename-nocruft.sh} (100%)\n rename t/{t6035-merge-dir-to-symlink.sh => t6415-merge-dir-to-symlink.sh} (100%)\n rename t/{t6036-recursive-corner-cases.sh => t6416-recursive-corner-cases.sh} (100%)\n rename t/{t6037-merge-ours-theirs.sh => t6417-merge-ours-theirs.sh} (100%)\n rename t/{t6038-merge-text-auto.sh => t6418-merge-text-auto.sh} (100%)\n rename t/{t6039-merge-ignorecase.sh => t6419-merge-ignorecase.sh} (100%)\n rename t/{t6042-merge-rename-corner-cases.sh => t6422-merge-rename-corner-cases.sh} (100%)\n rename t/{t6043-merge-rename-directories.sh => t6423-merge-rename-directories.sh} (100%)\n rename t/{t6044-merge-unrelated-index-changes.sh => t6424-merge-unrelated-index-changes.sh} (100%)\n rename t/{t6045-merge-rename-delete.sh => t6425-merge-rename-delete.sh} (100%)\n rename t/{t6046-merge-skip-unneeded-updates.sh => t6426-merge-skip-unneeded-updates.sh} (100%)\n rename t/{t6047-diff3-conflict-markers.sh => t6427-diff3-conflict-markers.sh} (100%)\n rename t/{t3030-merge-recursive.sh => t6430-merge-recursive.sh} (100%)\n rename t/{t3031-merge-criscross.sh => t6431-merge-criscross.sh} (100%)\n rename t/{t3032-merge-recursive-space-options.sh => t6432-merge-recursive-space-options.sh} (100%)\n rename t/{t3033-merge-toplevel.sh => t6433-merge-toplevel.sh} (100%)\n rename t/{t3034-merge-recursive-rename-options.sh => t6434-merge-recursive-rename-options.sh} (100%)\n rename t/{t3035-merge-sparse.sh => t6435-merge-sparse.sh} (100%)\n rename t/{t7607-merge-overwrite.sh => t6436-merge-overwrite.sh} (100%)\n rename t/{t7405-submodule-merge.sh => t6437-submodule-merge.sh} (100%)\n rename t/{t7613-merge-submodule.sh => t6438-submodule-directory-file-conflicts.sh} (100%)\n rename t/{t7609-merge-co-error-msgs.sh => t6439-merge-co-error-msgs.sh} (100%)\n\ndiff --git a/t/t6020-merge-df.sh b/t/t6400-merge-df.sh\nsimilarity index 100%\nrename from t/t6020-merge-df.sh\nrename to t/t6400-merge-df.sh\ndiff --git a/t/t6021-merge-criss-cross.sh b/t/t6401-merge-criss-cross.sh\nsimilarity index 100%\nrename from t/t6021-merge-criss-cross.sh\nrename to t/t6401-merge-criss-cross.sh\ndiff --git a/t/t6022-merge-rename.sh b/t/t6402-merge-rename.sh\nsimilarity index 100%\nrename from t/t6022-merge-rename.sh\nrename to t/t6402-merge-rename.sh\ndiff --git a/t/t6023-merge-file.sh b/t/t6403-merge-file.sh\nsimilarity index 100%\nrename from t/t6023-merge-file.sh\nrename to t/t6403-merge-file.sh\ndiff --git a/t/t6024-recursive-merge.sh b/t/t6404-recursive-merge.sh\nsimilarity index 100%\nrename from t/t6024-recursive-merge.sh\nrename to t/t6404-recursive-merge.sh\ndiff --git a/t/t6025-merge-symlinks.sh b/t/t6405-merge-symlinks.sh\nsimilarity index 100%\nrename from t/t6025-merge-symlinks.sh\nrename to t/t6405-merge-symlinks.sh\ndiff --git a/t/t6026-merge-attr.sh b/t/t6406-merge-attr.sh\nsimilarity index 100%\nrename from t/t6026-merge-attr.sh\nrename to t/t6406-merge-attr.sh\ndiff --git a/t/t6027-merge-binary.sh b/t/t6407-merge-binary.sh\nsimilarity index 100%\nrename from t/t6027-merge-binary.sh\nrename to t/t6407-merge-binary.sh\ndiff --git a/t/t6028-merge-up-to-date.sh b/t/t6408-merge-up-to-date.sh\nsimilarity index 100%\nrename from t/t6028-merge-up-to-date.sh\nrename to t/t6408-merge-up-to-date.sh\ndiff --git a/t/t6029-merge-subtree.sh b/t/t6409-merge-subtree.sh\nsimilarity index 100%\nrename from t/t6029-merge-subtree.sh\nrename to t/t6409-merge-subtree.sh\ndiff --git a/t/t6031-merge-filemode.sh b/t/t6411-merge-filemode.sh\nsimilarity index 100%\nrename from t/t6031-merge-filemode.sh\nrename to t/t6411-merge-filemode.sh\ndiff --git a/t/t6032-merge-large-rename.sh b/t/t6412-merge-large-rename.sh\nsimilarity index 100%\nrename from t/t6032-merge-large-rename.sh\nrename to t/t6412-merge-large-rename.sh\ndiff --git a/t/t6033-merge-crlf.sh b/t/t6413-merge-crlf.sh\nsimilarity index 100%\nrename from t/t6033-merge-crlf.sh\nrename to t/t6413-merge-crlf.sh\ndiff --git a/t/t6034-merge-rename-nocruft.sh b/t/t6414-merge-rename-nocruft.sh\nsimilarity index 100%\nrename from t/t6034-merge-rename-nocruft.sh\nrename to t/t6414-merge-rename-nocruft.sh\ndiff --git a/t/t6035-merge-dir-to-symlink.sh b/t/t6415-merge-dir-to-symlink.sh\nsimilarity index 100%\nrename from t/t6035-merge-dir-to-symlink.sh\nrename to t/t6415-merge-dir-to-symlink.sh\ndiff --git a/t/t6036-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh\nsimilarity index 100%\nrename from t/t6036-recursive-corner-cases.sh\nrename to t/t6416-recursive-corner-cases.sh\ndiff --git a/t/t6037-merge-ours-theirs.sh b/t/t6417-merge-ours-theirs.sh\nsimilarity index 100%\nrename from t/t6037-merge-ours-theirs.sh\nrename to t/t6417-merge-ours-theirs.sh\ndiff --git a/t/t6038-merge-text-auto.sh b/t/t6418-merge-text-auto.sh\nsimilarity index 100%\nrename from t/t6038-merge-text-auto.sh\nrename to t/t6418-merge-text-auto.sh\ndiff --git a/t/t6039-merge-ignorecase.sh b/t/t6419-merge-ignorecase.sh\nsimilarity index 100%\nrename from t/t6039-merge-ignorecase.sh\nrename to t/t6419-merge-ignorecase.sh\ndiff --git a/t/t6042-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nsimilarity index 100%\nrename from t/t6042-merge-rename-corner-cases.sh\nrename to t/t6422-merge-rename-corner-cases.sh\ndiff --git a/t/t6043-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nsimilarity index 100%\nrename from t/t6043-merge-rename-directories.sh\nrename to t/t6423-merge-rename-directories.sh\ndiff --git a/t/t6044-merge-unrelated-index-changes.sh b/t/t6424-merge-unrelated-index-changes.sh\nsimilarity index 100%\nrename from t/t6044-merge-unrelated-index-changes.sh\nrename to t/t6424-merge-unrelated-index-changes.sh\ndiff --git a/t/t6045-merge-rename-delete.sh b/t/t6425-merge-rename-delete.sh\nsimilarity index 100%\nrename from t/t6045-merge-rename-delete.sh\nrename to t/t6425-merge-rename-delete.sh\ndiff --git a/t/t6046-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh\nsimilarity index 100%\nrename from t/t6046-merge-skip-unneeded-updates.sh\nrename to t/t6426-merge-skip-unneeded-updates.sh\ndiff --git a/t/t6047-diff3-conflict-markers.sh b/t/t6427-diff3-conflict-markers.sh\nsimilarity index 100%\nrename from t/t6047-diff3-conflict-markers.sh\nrename to t/t6427-diff3-conflict-markers.sh\ndiff --git a/t/t3030-merge-recursive.sh b/t/t6430-merge-recursive.sh\nsimilarity index 100%\nrename from t/t3030-merge-recursive.sh\nrename to t/t6430-merge-recursive.sh\ndiff --git a/t/t3031-merge-criscross.sh b/t/t6431-merge-criscross.sh\nsimilarity index 100%\nrename from t/t3031-merge-criscross.sh\nrename to t/t6431-merge-criscross.sh\ndiff --git a/t/t3032-merge-recursive-space-options.sh b/t/t6432-merge-recursive-space-options.sh\nsimilarity index 100%\nrename from t/t3032-merge-recursive-space-options.sh\nrename to t/t6432-merge-recursive-space-options.sh\ndiff --git a/t/t3033-merge-toplevel.sh b/t/t6433-merge-toplevel.sh\nsimilarity index 100%\nrename from t/t3033-merge-toplevel.sh\nrename to t/t6433-merge-toplevel.sh\ndiff --git a/t/t3034-merge-recursive-rename-options.sh b/t/t6434-merge-recursive-rename-options.sh\nsimilarity index 100%\nrename from t/t3034-merge-recursive-rename-options.sh\nrename to t/t6434-merge-recursive-rename-options.sh\ndiff --git a/t/t3035-merge-sparse.sh b/t/t6435-merge-sparse.sh\nsimilarity index 100%\nrename from t/t3035-merge-sparse.sh\nrename to t/t6435-merge-sparse.sh\ndiff --git a/t/t7607-merge-overwrite.sh b/t/t6436-merge-overwrite.sh\nsimilarity index 100%\nrename from t/t7607-merge-overwrite.sh\nrename to t/t6436-merge-overwrite.sh\ndiff --git a/t/t7405-submodule-merge.sh b/t/t6437-submodule-merge.sh\nsimilarity index 100%\nrename from t/t7405-submodule-merge.sh\nrename to t/t6437-submodule-merge.sh\ndiff --git a/t/t7613-merge-submodule.sh b/t/t6438-submodule-directory-file-conflicts.sh\nsimilarity index 100%\nrename from t/t7613-merge-submodule.sh\nrename to t/t6438-submodule-directory-file-conflicts.sh\ndiff --git a/t/t7609-merge-co-error-msgs.sh b/t/t6439-merge-co-error-msgs.sh\nsimilarity index 100%\nrename from t/t7609-merge-co-error-msgs.sh\nrename to t/t6439-merge-co-error-msgs.sh\n\nbase-commit: dc04167d378fb29d30e1647ff6ff51dd182bc9a3\n-- \ngitgitgadget\n"},{"id":"403197","messageId":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.git.git.1596644952296.gitgitgadget@gmail.com","subject":"[PATCH v2 00/11] Start preparing merge-related tests to work with multiple merge backends","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:09Z","receivedAt":"2020-08-08T17:01:34Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"This series starts preparing the merge related tests to work with multiple\nbackends: merge-recursive or merge-ort. Further work will be coming.\n\nv1 of this series only had the first patch (which collected merge machinery\nrelated tests into t64*.sh). This series adds 10 more patches, which:\n\nChanges since v1:\n\n * tighten some testcases so they don't pass with completely wrong results\n * fix various errors in causing many test_expect_failure tests to fail for\n   the wrong reasons\n * add clarifying comments or fix various comments\n * make some tests more flexible in handling console output messages\n   produced by either backend.\n * I'm curious about portability of the second-to-last patch -- is it safe\n   to use backreferences with test_i18n_grep? If not, anyone have\n   alternative ideas for handling those needed changes?\n\nThe greater flexibility patches at the end of the series also previews some\nof the design changes being brought by merge-ort.\n\nElijah Newren (11):\n  Collect merge-related tests to t64xx\n  t6418: tighten delete/normalize conflict testcase\n  t6422: fix bad check against missing file\n  t6416, t6422: fix incorrect untracked file count\n  t6423: fix test setup for a couple tests\n  t6422: fix multiple errors with the mod6 test expectations\n  t6416, t6423: clarify some comments and fix some typos\n  t6423: add an explanation about why one of the tests does not pass\n  t6422, t6426: be more flexible for add/add conflicts involving renames\n  t642[23]: be more flexible for add/add conflicts involving pair\n    renames\n  t6425: be more flexible with rename/delete conflict messages\n\n t/{t6020-merge-df.sh => t6400-merge-df.sh}    |  0\n ...ss-cross.sh => t6401-merge-criss-cross.sh} |  0\n ...-merge-rename.sh => t6402-merge-rename.sh} |  0\n ...6023-merge-file.sh => t6403-merge-file.sh} |  0\n ...sive-merge.sh => t6404-recursive-merge.sh} |  0\n ...ge-symlinks.sh => t6405-merge-symlinks.sh} |  0\n ...6026-merge-attr.sh => t6406-merge-attr.sh} |  0\n ...-merge-binary.sh => t6407-merge-binary.sh} |  0\n ...p-to-date.sh => t6408-merge-up-to-date.sh} |  0\n ...erge-subtree.sh => t6409-merge-subtree.sh} |  0\n ...ge-filemode.sh => t6411-merge-filemode.sh} |  0\n ...-rename.sh => t6412-merge-large-rename.sh} |  0\n ...6033-merge-crlf.sh => t6413-merge-crlf.sh} |  0\n ...cruft.sh => t6414-merge-rename-nocruft.sh} |  0\n ...mlink.sh => t6415-merge-dir-to-symlink.sh} |  0\n ...ses.sh => t6416-recursive-corner-cases.sh} |  4 +-\n ...s-theirs.sh => t6417-merge-ours-theirs.sh} |  0\n ...-text-auto.sh => t6418-merge-text-auto.sh} |  3 +-\n ...gnorecase.sh => t6419-merge-ignorecase.sh} |  0\n ....sh => t6422-merge-rename-corner-cases.sh} | 68 +++++++++++--------\n ...s.sh => t6423-merge-rename-directories.sh} | 39 +++++++----\n ...=> t6424-merge-unrelated-index-changes.sh} |  0\n ...delete.sh => t6425-merge-rename-delete.sh} |  3 +-\n ...h => t6426-merge-skip-unneeded-updates.sh} |  2 +-\n ...ers.sh => t6427-diff3-conflict-markers.sh} |  0\n ...-recursive.sh => t6430-merge-recursive.sh} |  0\n ...-criscross.sh => t6431-merge-criscross.sh} |  0\n ...=> t6432-merge-recursive-space-options.sh} |  0\n ...ge-toplevel.sh => t6433-merge-toplevel.sh} |  0\n ...> t6434-merge-recursive-rename-options.sh} |  0\n ...-merge-sparse.sh => t6435-merge-sparse.sh} |  0\n ...-overwrite.sh => t6436-merge-overwrite.sh} |  0\n ...dule-merge.sh => t6437-submodule-merge.sh} |  0\n ...438-submodule-directory-file-conflicts.sh} |  0\n ...r-msgs.sh => t6439-merge-co-error-msgs.sh} |  0\n 35 files changed, 71 insertions(+), 48 deletions(-)\n rename t/{t6020-merge-df.sh => t6400-merge-df.sh} (100%)\n rename t/{t6021-merge-criss-cross.sh => t6401-merge-criss-cross.sh} (100%)\n rename t/{t6022-merge-rename.sh => t6402-merge-rename.sh} (100%)\n rename t/{t6023-merge-file.sh => t6403-merge-file.sh} (100%)\n rename t/{t6024-recursive-merge.sh => t6404-recursive-merge.sh} (100%)\n rename t/{t6025-merge-symlinks.sh => t6405-merge-symlinks.sh} (100%)\n rename t/{t6026-merge-attr.sh => t6406-merge-attr.sh} (100%)\n rename t/{t6027-merge-binary.sh => t6407-merge-binary.sh} (100%)\n rename t/{t6028-merge-up-to-date.sh => t6408-merge-up-to-date.sh} (100%)\n rename t/{t6029-merge-subtree.sh => t6409-merge-subtree.sh} (100%)\n rename t/{t6031-merge-filemode.sh => t6411-merge-filemode.sh} (100%)\n rename t/{t6032-merge-large-rename.sh => t6412-merge-large-rename.sh} (100%)\n rename t/{t6033-merge-crlf.sh => t6413-merge-crlf.sh} (100%)\n rename t/{t6034-merge-rename-nocruft.sh => t6414-merge-rename-nocruft.sh} (100%)\n rename t/{t6035-merge-dir-to-symlink.sh => t6415-merge-dir-to-symlink.sh} (100%)\n rename t/{t6036-recursive-corner-cases.sh => t6416-recursive-corner-cases.sh} (99%)\n rename t/{t6037-merge-ours-theirs.sh => t6417-merge-ours-theirs.sh} (100%)\n rename t/{t6038-merge-text-auto.sh => t6418-merge-text-auto.sh} (99%)\n rename t/{t6039-merge-ignorecase.sh => t6419-merge-ignorecase.sh} (100%)\n rename t/{t6042-merge-rename-corner-cases.sh => t6422-merge-rename-corner-cases.sh} (94%)\n rename t/{t6043-merge-rename-directories.sh => t6423-merge-rename-directories.sh} (98%)\n rename t/{t6044-merge-unrelated-index-changes.sh => t6424-merge-unrelated-index-changes.sh} (100%)\n rename t/{t6045-merge-rename-delete.sh => t6425-merge-rename-delete.sh} (72%)\n rename t/{t6046-merge-skip-unneeded-updates.sh => t6426-merge-skip-unneeded-updates.sh} (99%)\n rename t/{t6047-diff3-conflict-markers.sh => t6427-diff3-conflict-markers.sh} (100%)\n rename t/{t3030-merge-recursive.sh => t6430-merge-recursive.sh} (100%)\n rename t/{t3031-merge-criscross.sh => t6431-merge-criscross.sh} (100%)\n rename t/{t3032-merge-recursive-space-options.sh => t6432-merge-recursive-space-options.sh} (100%)\n rename t/{t3033-merge-toplevel.sh => t6433-merge-toplevel.sh} (100%)\n rename t/{t3034-merge-recursive-rename-options.sh => t6434-merge-recursive-rename-options.sh} (100%)\n rename t/{t3035-merge-sparse.sh => t6435-merge-sparse.sh} (100%)\n rename t/{t7607-merge-overwrite.sh => t6436-merge-overwrite.sh} (100%)\n rename t/{t7405-submodule-merge.sh => t6437-submodule-merge.sh} (100%)\n rename t/{t7613-merge-submodule.sh => t6438-submodule-directory-file-conflicts.sh} (100%)\n rename t/{t7609-merge-co-error-msgs.sh => t6439-merge-co-error-msgs.sh} (100%)\n\n\nbase-commit: dc04167d378fb29d30e1647ff6ff51dd182bc9a3\nPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-827%2Fnewren%2Fmerge-test-rename-v2\nFetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-827/newren/merge-test-rename-v2\nPull-Request: https://github.com/git/git/pull/827\n\nRange-diff vs v1:\n\n  1:  3a2b7e9743 =  1:  3a2b7e9743 Collect merge-related tests to t64xx\n  -:  ---------- >  2:  621c9a159e t6418: tighten delete/normalize conflict testcase\n  -:  ---------- >  3:  7f408b7d40 t6422: fix bad check against missing file\n  -:  ---------- >  4:  9ce80f2f94 t6416, t6422: fix incorrect untracked file count\n  -:  ---------- >  5:  382d65649d t6423: fix test setup for a couple tests\n  -:  ---------- >  6:  56e169b1d8 t6422: fix multiple errors with the mod6 test expectations\n  -:  ---------- >  7:  7b534d123a t6416, t6423: clarify some comments and fix some typos\n  -:  ---------- >  8:  f2d7e744fc t6423: add an explanation about why one of the tests does not pass\n  -:  ---------- >  9:  b4e165eca4 t6422, t6426: be more flexible for add/add conflicts involving renames\n  -:  ---------- > 10:  a9a02a0ca5 t642[23]: be more flexible for add/add conflicts involving pair renames\n  -:  ---------- > 11:  38f6573511 t6425: be more flexible with rename/delete conflict messages\n\n-- \ngitgitgadget\n"},{"id":"403198","messageId":"621c9a159ef6e64a5fd6b6fdcac01c0c7aa57d4b.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 02/11] t6418: tighten delete/normalize conflict testcase","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:11Z","receivedAt":"2020-08-08T17:01:37Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nThe testcase only required that the merge complete without conflict,\nwithout specifying what the correct resolution was.  Since normalization\nchanged this from a modify/delete to a not-modified/delete, the correct\nresolution is to have the file be removed at the end.  Add a check for\nthis resolution.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6418-merge-text-auto.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t6418-merge-text-auto.sh b/t/t6418-merge-text-auto.sh\nindex 5e8d5fa50c..517f7a450d 100755\n--- a/t/t6418-merge-text-auto.sh\n+++ b/t/t6418-merge-text-auto.sh\n@@ -211,7 +211,8 @@ test_expect_success 'Test delete/normalize conflict' '\n \tgit commit -m \"remove file\" &&\n \tgit checkout master &&\n \tgit reset --hard a^ &&\n-\tgit merge side\n+\tgit merge side &&\n+\ttest_path_is_missing file\n '\n \n test_done\n-- \ngitgitgadget\n\n"},{"id":"403199","messageId":"3a2b7e9743af01efaf85cf1b8046d6e716ae77af.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 01/11] Collect merge-related tests to t64xx","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:10Z","receivedAt":"2020-08-08T17:01:39Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nThe tests for the merge machinery are spread over several places.\nCollect them into t64xx for simplicity.  Some notes:\n\nt60[234]*.sh:\n  Merge tests started in t602*, overgrew bisect and remote tracking\n  tests in t6030, t6040, and t6041, and nearly overtook replace tests\n  in t6050.  This made picking out relevant tests that I wanted to run\n  in a tighter loop slightly more annoying for years.\n\nt303*.sh:\n  These started out as tests for the 'merge-recursive' toplevel command,\n  but did not restrict to that and had lots of overlap with the\n  underlying merge machinery.\nt7405, t7613:\n  submodule-specific merge logic started out in submodule.c but was\n  moved to merge-recursive.c in commit 18cfc08866 (\"submodule.c: move\n  submodule merging to merge-recursive.c\", 2018-05-15).  Since these\n  tests are about the logic found in the merge machinery, moving these\n  tests to be with the merge tests makes sense.\n\nt7607, t7609:\n  Having tests spread all over the place makes it more likely that\n  additional tests related to a certain piece of logic grow in all those\n  other places.  Much like t303*.sh, these two tests were about the\n  underlying merge machinery rather than outer levels.\n\nTests that were NOT moved:\n\nt76[01]*.sh:\n  Other than the four tests mentioned above, the remaining tests in\n  t76[01]*.sh are related to non-recursive merge strategies, parameter\n  parsing, and other stuff associated with the highlevel builtin/merge.c\n  rather than the recursive merge machinery.\n\nt3[45]*.sh:\n  The rebase testcases in t34*.sh also test the merge logic pretty\n  heavily; sometimes changes I make only trigger failures in the rebase\n  tests.  The rebase tests are already nicely coupled together, though,\n  and I didn't want to mess that up.  Similar comments apply for the\n  cherry-pick tests in t35*.sh.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/{t6020-merge-df.sh => t6400-merge-df.sh}                        | 0\n t/{t6021-merge-criss-cross.sh => t6401-merge-criss-cross.sh}      | 0\n t/{t6022-merge-rename.sh => t6402-merge-rename.sh}                | 0\n t/{t6023-merge-file.sh => t6403-merge-file.sh}                    | 0\n t/{t6024-recursive-merge.sh => t6404-recursive-merge.sh}          | 0\n t/{t6025-merge-symlinks.sh => t6405-merge-symlinks.sh}            | 0\n t/{t6026-merge-attr.sh => t6406-merge-attr.sh}                    | 0\n t/{t6027-merge-binary.sh => t6407-merge-binary.sh}                | 0\n t/{t6028-merge-up-to-date.sh => t6408-merge-up-to-date.sh}        | 0\n t/{t6029-merge-subtree.sh => t6409-merge-subtree.sh}              | 0\n t/{t6031-merge-filemode.sh => t6411-merge-filemode.sh}            | 0\n t/{t6032-merge-large-rename.sh => t6412-merge-large-rename.sh}    | 0\n t/{t6033-merge-crlf.sh => t6413-merge-crlf.sh}                    | 0\n ...6034-merge-rename-nocruft.sh => t6414-merge-rename-nocruft.sh} | 0\n ...6035-merge-dir-to-symlink.sh => t6415-merge-dir-to-symlink.sh} | 0\n ...-recursive-corner-cases.sh => t6416-recursive-corner-cases.sh} | 0\n t/{t6037-merge-ours-theirs.sh => t6417-merge-ours-theirs.sh}      | 0\n t/{t6038-merge-text-auto.sh => t6418-merge-text-auto.sh}          | 0\n t/{t6039-merge-ignorecase.sh => t6419-merge-ignorecase.sh}        | 0\n ...-rename-corner-cases.sh => t6422-merge-rename-corner-cases.sh} | 0\n ...ge-rename-directories.sh => t6423-merge-rename-directories.sh} | 0\n ...ed-index-changes.sh => t6424-merge-unrelated-index-changes.sh} | 0\n t/{t6045-merge-rename-delete.sh => t6425-merge-rename-delete.sh}  | 0\n ...p-unneeded-updates.sh => t6426-merge-skip-unneeded-updates.sh} | 0\n ...-diff3-conflict-markers.sh => t6427-diff3-conflict-markers.sh} | 0\n t/{t3030-merge-recursive.sh => t6430-merge-recursive.sh}          | 0\n t/{t3031-merge-criscross.sh => t6431-merge-criscross.sh}          | 0\n ...ve-space-options.sh => t6432-merge-recursive-space-options.sh} | 0\n t/{t3033-merge-toplevel.sh => t6433-merge-toplevel.sh}            | 0\n ...-rename-options.sh => t6434-merge-recursive-rename-options.sh} | 0\n t/{t3035-merge-sparse.sh => t6435-merge-sparse.sh}                | 0\n t/{t7607-merge-overwrite.sh => t6436-merge-overwrite.sh}          | 0\n t/{t7405-submodule-merge.sh => t6437-submodule-merge.sh}          | 0\n ...e-submodule.sh => t6438-submodule-directory-file-conflicts.sh} | 0\n t/{t7609-merge-co-error-msgs.sh => t6439-merge-co-error-msgs.sh}  | 0\n 35 files changed, 0 insertions(+), 0 deletions(-)\n rename t/{t6020-merge-df.sh => t6400-merge-df.sh} (100%)\n rename t/{t6021-merge-criss-cross.sh => t6401-merge-criss-cross.sh} (100%)\n rename t/{t6022-merge-rename.sh => t6402-merge-rename.sh} (100%)\n rename t/{t6023-merge-file.sh => t6403-merge-file.sh} (100%)\n rename t/{t6024-recursive-merge.sh => t6404-recursive-merge.sh} (100%)\n rename t/{t6025-merge-symlinks.sh => t6405-merge-symlinks.sh} (100%)\n rename t/{t6026-merge-attr.sh => t6406-merge-attr.sh} (100%)\n rename t/{t6027-merge-binary.sh => t6407-merge-binary.sh} (100%)\n rename t/{t6028-merge-up-to-date.sh => t6408-merge-up-to-date.sh} (100%)\n rename t/{t6029-merge-subtree.sh => t6409-merge-subtree.sh} (100%)\n rename t/{t6031-merge-filemode.sh => t6411-merge-filemode.sh} (100%)\n rename t/{t6032-merge-large-rename.sh => t6412-merge-large-rename.sh} (100%)\n rename t/{t6033-merge-crlf.sh => t6413-merge-crlf.sh} (100%)\n rename t/{t6034-merge-rename-nocruft.sh => t6414-merge-rename-nocruft.sh} (100%)\n rename t/{t6035-merge-dir-to-symlink.sh => t6415-merge-dir-to-symlink.sh} (100%)\n rename t/{t6036-recursive-corner-cases.sh => t6416-recursive-corner-cases.sh} (100%)\n rename t/{t6037-merge-ours-theirs.sh => t6417-merge-ours-theirs.sh} (100%)\n rename t/{t6038-merge-text-auto.sh => t6418-merge-text-auto.sh} (100%)\n rename t/{t6039-merge-ignorecase.sh => t6419-merge-ignorecase.sh} (100%)\n rename t/{t6042-merge-rename-corner-cases.sh => t6422-merge-rename-corner-cases.sh} (100%)\n rename t/{t6043-merge-rename-directories.sh => t6423-merge-rename-directories.sh} (100%)\n rename t/{t6044-merge-unrelated-index-changes.sh => t6424-merge-unrelated-index-changes.sh} (100%)\n rename t/{t6045-merge-rename-delete.sh => t6425-merge-rename-delete.sh} (100%)\n rename t/{t6046-merge-skip-unneeded-updates.sh => t6426-merge-skip-unneeded-updates.sh} (100%)\n rename t/{t6047-diff3-conflict-markers.sh => t6427-diff3-conflict-markers.sh} (100%)\n rename t/{t3030-merge-recursive.sh => t6430-merge-recursive.sh} (100%)\n rename t/{t3031-merge-criscross.sh => t6431-merge-criscross.sh} (100%)\n rename t/{t3032-merge-recursive-space-options.sh => t6432-merge-recursive-space-options.sh} (100%)\n rename t/{t3033-merge-toplevel.sh => t6433-merge-toplevel.sh} (100%)\n rename t/{t3034-merge-recursive-rename-options.sh => t6434-merge-recursive-rename-options.sh} (100%)\n rename t/{t3035-merge-sparse.sh => t6435-merge-sparse.sh} (100%)\n rename t/{t7607-merge-overwrite.sh => t6436-merge-overwrite.sh} (100%)\n rename t/{t7405-submodule-merge.sh => t6437-submodule-merge.sh} (100%)\n rename t/{t7613-merge-submodule.sh => t6438-submodule-directory-file-conflicts.sh} (100%)\n rename t/{t7609-merge-co-error-msgs.sh => t6439-merge-co-error-msgs.sh} (100%)\n\ndiff --git a/t/t6020-merge-df.sh b/t/t6400-merge-df.sh\nsimilarity index 100%\nrename from t/t6020-merge-df.sh\nrename to t/t6400-merge-df.sh\ndiff --git a/t/t6021-merge-criss-cross.sh b/t/t6401-merge-criss-cross.sh\nsimilarity index 100%\nrename from t/t6021-merge-criss-cross.sh\nrename to t/t6401-merge-criss-cross.sh\ndiff --git a/t/t6022-merge-rename.sh b/t/t6402-merge-rename.sh\nsimilarity index 100%\nrename from t/t6022-merge-rename.sh\nrename to t/t6402-merge-rename.sh\ndiff --git a/t/t6023-merge-file.sh b/t/t6403-merge-file.sh\nsimilarity index 100%\nrename from t/t6023-merge-file.sh\nrename to t/t6403-merge-file.sh\ndiff --git a/t/t6024-recursive-merge.sh b/t/t6404-recursive-merge.sh\nsimilarity index 100%\nrename from t/t6024-recursive-merge.sh\nrename to t/t6404-recursive-merge.sh\ndiff --git a/t/t6025-merge-symlinks.sh b/t/t6405-merge-symlinks.sh\nsimilarity index 100%\nrename from t/t6025-merge-symlinks.sh\nrename to t/t6405-merge-symlinks.sh\ndiff --git a/t/t6026-merge-attr.sh b/t/t6406-merge-attr.sh\nsimilarity index 100%\nrename from t/t6026-merge-attr.sh\nrename to t/t6406-merge-attr.sh\ndiff --git a/t/t6027-merge-binary.sh b/t/t6407-merge-binary.sh\nsimilarity index 100%\nrename from t/t6027-merge-binary.sh\nrename to t/t6407-merge-binary.sh\ndiff --git a/t/t6028-merge-up-to-date.sh b/t/t6408-merge-up-to-date.sh\nsimilarity index 100%\nrename from t/t6028-merge-up-to-date.sh\nrename to t/t6408-merge-up-to-date.sh\ndiff --git a/t/t6029-merge-subtree.sh b/t/t6409-merge-subtree.sh\nsimilarity index 100%\nrename from t/t6029-merge-subtree.sh\nrename to t/t6409-merge-subtree.sh\ndiff --git a/t/t6031-merge-filemode.sh b/t/t6411-merge-filemode.sh\nsimilarity index 100%\nrename from t/t6031-merge-filemode.sh\nrename to t/t6411-merge-filemode.sh\ndiff --git a/t/t6032-merge-large-rename.sh b/t/t6412-merge-large-rename.sh\nsimilarity index 100%\nrename from t/t6032-merge-large-rename.sh\nrename to t/t6412-merge-large-rename.sh\ndiff --git a/t/t6033-merge-crlf.sh b/t/t6413-merge-crlf.sh\nsimilarity index 100%\nrename from t/t6033-merge-crlf.sh\nrename to t/t6413-merge-crlf.sh\ndiff --git a/t/t6034-merge-rename-nocruft.sh b/t/t6414-merge-rename-nocruft.sh\nsimilarity index 100%\nrename from t/t6034-merge-rename-nocruft.sh\nrename to t/t6414-merge-rename-nocruft.sh\ndiff --git a/t/t6035-merge-dir-to-symlink.sh b/t/t6415-merge-dir-to-symlink.sh\nsimilarity index 100%\nrename from t/t6035-merge-dir-to-symlink.sh\nrename to t/t6415-merge-dir-to-symlink.sh\ndiff --git a/t/t6036-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh\nsimilarity index 100%\nrename from t/t6036-recursive-corner-cases.sh\nrename to t/t6416-recursive-corner-cases.sh\ndiff --git a/t/t6037-merge-ours-theirs.sh b/t/t6417-merge-ours-theirs.sh\nsimilarity index 100%\nrename from t/t6037-merge-ours-theirs.sh\nrename to t/t6417-merge-ours-theirs.sh\ndiff --git a/t/t6038-merge-text-auto.sh b/t/t6418-merge-text-auto.sh\nsimilarity index 100%\nrename from t/t6038-merge-text-auto.sh\nrename to t/t6418-merge-text-auto.sh\ndiff --git a/t/t6039-merge-ignorecase.sh b/t/t6419-merge-ignorecase.sh\nsimilarity index 100%\nrename from t/t6039-merge-ignorecase.sh\nrename to t/t6419-merge-ignorecase.sh\ndiff --git a/t/t6042-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nsimilarity index 100%\nrename from t/t6042-merge-rename-corner-cases.sh\nrename to t/t6422-merge-rename-corner-cases.sh\ndiff --git a/t/t6043-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nsimilarity index 100%\nrename from t/t6043-merge-rename-directories.sh\nrename to t/t6423-merge-rename-directories.sh\ndiff --git a/t/t6044-merge-unrelated-index-changes.sh b/t/t6424-merge-unrelated-index-changes.sh\nsimilarity index 100%\nrename from t/t6044-merge-unrelated-index-changes.sh\nrename to t/t6424-merge-unrelated-index-changes.sh\ndiff --git a/t/t6045-merge-rename-delete.sh b/t/t6425-merge-rename-delete.sh\nsimilarity index 100%\nrename from t/t6045-merge-rename-delete.sh\nrename to t/t6425-merge-rename-delete.sh\ndiff --git a/t/t6046-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh\nsimilarity index 100%\nrename from t/t6046-merge-skip-unneeded-updates.sh\nrename to t/t6426-merge-skip-unneeded-updates.sh\ndiff --git a/t/t6047-diff3-conflict-markers.sh b/t/t6427-diff3-conflict-markers.sh\nsimilarity index 100%\nrename from t/t6047-diff3-conflict-markers.sh\nrename to t/t6427-diff3-conflict-markers.sh\ndiff --git a/t/t3030-merge-recursive.sh b/t/t6430-merge-recursive.sh\nsimilarity index 100%\nrename from t/t3030-merge-recursive.sh\nrename to t/t6430-merge-recursive.sh\ndiff --git a/t/t3031-merge-criscross.sh b/t/t6431-merge-criscross.sh\nsimilarity index 100%\nrename from t/t3031-merge-criscross.sh\nrename to t/t6431-merge-criscross.sh\ndiff --git a/t/t3032-merge-recursive-space-options.sh b/t/t6432-merge-recursive-space-options.sh\nsimilarity index 100%\nrename from t/t3032-merge-recursive-space-options.sh\nrename to t/t6432-merge-recursive-space-options.sh\ndiff --git a/t/t3033-merge-toplevel.sh b/t/t6433-merge-toplevel.sh\nsimilarity index 100%\nrename from t/t3033-merge-toplevel.sh\nrename to t/t6433-merge-toplevel.sh\ndiff --git a/t/t3034-merge-recursive-rename-options.sh b/t/t6434-merge-recursive-rename-options.sh\nsimilarity index 100%\nrename from t/t3034-merge-recursive-rename-options.sh\nrename to t/t6434-merge-recursive-rename-options.sh\ndiff --git a/t/t3035-merge-sparse.sh b/t/t6435-merge-sparse.sh\nsimilarity index 100%\nrename from t/t3035-merge-sparse.sh\nrename to t/t6435-merge-sparse.sh\ndiff --git a/t/t7607-merge-overwrite.sh b/t/t6436-merge-overwrite.sh\nsimilarity index 100%\nrename from t/t7607-merge-overwrite.sh\nrename to t/t6436-merge-overwrite.sh\ndiff --git a/t/t7405-submodule-merge.sh b/t/t6437-submodule-merge.sh\nsimilarity index 100%\nrename from t/t7405-submodule-merge.sh\nrename to t/t6437-submodule-merge.sh\ndiff --git a/t/t7613-merge-submodule.sh b/t/t6438-submodule-directory-file-conflicts.sh\nsimilarity index 100%\nrename from t/t7613-merge-submodule.sh\nrename to t/t6438-submodule-directory-file-conflicts.sh\ndiff --git a/t/t7609-merge-co-error-msgs.sh b/t/t6439-merge-co-error-msgs.sh\nsimilarity index 100%\nrename from t/t7609-merge-co-error-msgs.sh\nrename to t/t6439-merge-co-error-msgs.sh\n-- \ngitgitgadget\n\n"},{"id":"403200","messageId":"9ce80f2f943278fcb8ef46fd1a9507d832657246.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 04/11] t6416, t6422: fix incorrect untracked file count","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:13Z","receivedAt":"2020-08-08T17:01:40Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nApparently I don't know how to count untracked files, and since the tests\nin question were marked as test_expect_failure, no one every noticed it\nuntil know.  Correct the count, as these tests clearly creates three\nuntracked files ('out', 'err', and 'file_count').\n\n(I believe this problem arose because earlier incarnations counted lines\nvia a pipe to 'wc -l'.  Reviewers asked that it be replaced by writing\nthe output to a file and using test_line_count, but when the temporary\noutput was added to a separate file, the count of untracked files should\nhave increased.)\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6416-recursive-corner-cases.sh    | 2 +-\n t/t6422-merge-rename-corner-cases.sh | 4 ++--\n 2 files changed, 3 insertions(+), 3 deletions(-)\n\ndiff --git a/t/t6416-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh\nindex b3bf462617..d272b418e4 100755\n--- a/t/t6416-recursive-corner-cases.sh\n+++ b/t/t6416-recursive-corner-cases.sh\n@@ -1144,7 +1144,7 @@ test_expect_failure 'check symlink add/add' '\n \t\ttest_must_fail git merge -s recursive E^0 &&\n \n \t\tgit ls-files -s >out &&\n-\t\ttest_line_count = 2 out &&\n+\t\ttest_line_count = 3 out &&\n \t\tgit ls-files -u >out &&\n \t\ttest_line_count = 2 out &&\n \t\tgit ls-files -o >out &&\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex 7da75c1736..c8ee033ad9 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -899,7 +899,7 @@ test_expect_failure 'rad-check: rename/add/delete conflict' '\n \t\tgit ls-files -u >file_count &&\n \t\ttest_line_count = 2 file_count &&\n \t\tgit ls-files -o >file_count &&\n-\t\ttest_line_count = 2 file_count &&\n+\t\ttest_line_count = 3 file_count &&\n \n \t\tgit rev-parse >actual \\\n \t\t\t:2:bar :3:bar &&\n@@ -967,7 +967,7 @@ test_expect_failure 'rrdd-check: rename/rename(2to1)/delete/delete conflict' '\n \t\tgit ls-files -u >file_count &&\n \t\ttest_line_count = 2 file_count &&\n \t\tgit ls-files -o >file_count &&\n-\t\ttest_line_count = 2 file_count &&\n+\t\ttest_line_count = 3 file_count &&\n \n \t\tgit rev-parse >actual \\\n \t\t\t:2:baz :3:baz &&\n-- \ngitgitgadget\n\n"},{"id":"403201","messageId":"382d65649dc1d8abdd1c3f0f4a4af67f42f43731.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 05/11] t6423: fix test setup for a couple tests","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:14Z","receivedAt":"2020-08-08T17:01:42Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nCommit da1e295e00 (\"t604[236]: do not run setup in separate tests\",\n2019-10-22) removed approximately half the tests (which were setup-only\ntests) in t6043 by turning them into functions that the subsequent test\nwould call as their first step.  This ensured that any test from this\nfile could be run entirely independently of all the other tests in the\nfile.  Unfortunately, the call to the new setup function was missed in\ntwo of the test_expect_failure cases.  Add them in.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6423-merge-rename-directories.sh | 2 ++\n 1 file changed, 2 insertions(+)\n\ndiff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nindex 83792c5ef1..d227e15944 100755\n--- a/t/t6423-merge-rename-directories.sh\n+++ b/t/t6423-merge-rename-directories.sh\n@@ -2880,6 +2880,7 @@ test_setup_9g () {\n }\n \n test_expect_failure '9g: Renamed directory that only contained immediate subdirs, immediate subdirs renamed' '\n+\ttest_setup_9g &&\n \t(\n \t\tcd 9g &&\n \n@@ -3362,6 +3363,7 @@ test_setup_10e () {\n }\n \n test_expect_failure '10e: Does git complain about untracked file that is not really in the way?' '\n+\ttest_setup_10e &&\n \t(\n \t\tcd 10e &&\n \n-- \ngitgitgadget\n\n"},{"id":"403202","messageId":"b4e165eca4f6db4d876bfde31d410250c21aab6f.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 09/11] t6422, t6426: be more flexible for add/add conflicts involving renames","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:18Z","receivedAt":"2020-08-08T17:01:42Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nmerge-recursive treats an add/add conflict where one of the adds came\nfrom a rename as a separate 'rename/add' type of conflict.  However, if\nthere is not content conflict after the content merge(s), then the file\nis not considered to be conflicted.  That suggests the conflict type is\nreally just add/add.  Other merge engines might choose to print messages\nto the console that just refer to these as add/add conflicts; accept\nboth types of output.\n\nNote: it could help to notify users if the three-way content merge of\nthe rename had content conflicts, because when we then go to two-way\nmerge THAT with the conflicting add we can get nested conflict markers.\nmerge-recursive, unfortunately, doesn't do that, but other merge engines\ncould.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6422-merge-rename-corner-cases.sh   | 21 +++++++++++++--------\n t/t6426-merge-skip-unneeded-updates.sh |  2 +-\n 2 files changed, 14 insertions(+), 9 deletions(-)\n\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex 2413f517e7..f3929b65c0 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -457,7 +457,7 @@ test_expect_success 'handle rename-with-content-merge vs. add' '\n \t\tgit checkout A^0 &&\n \n \t\ttest_must_fail git merge -s recursive B^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/add)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (.*/add)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 2 out &&\n@@ -503,7 +503,7 @@ test_expect_success 'handle rename-with-content-merge vs. add, merge other way'\n \t\tgit checkout B^0 &&\n \n \t\ttest_must_fail git merge -s recursive A^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/add)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (.*/add)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 2 out &&\n@@ -886,12 +886,17 @@ test_expect_failure 'rad-check: rename/add/delete conflict' '\n \t\tgit checkout B^0 &&\n \t\ttest_must_fail git merge -s recursive A^0 >out 2>err &&\n \n-\t\t# Not sure whether the output should contain just one\n-\t\t# \"CONFLICT (rename/add/delete)\" line, or if it should break\n-\t\t# it into a pair of \"CONFLICT (rename/delete)\" and\n-\t\t# \"CONFLICT (rename/add)\"; allow for either.\n-\t\ttest_i18ngrep \"CONFLICT (rename.*add)\" out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename.*delete)\" out &&\n+\t\t# Instead of requiring the output to contain one combined line\n+\t\t#   CONFLICT (rename/add/delete)\n+\t\t# or perhaps two lines:\n+\t\t#   CONFLICT (rename/add): new file collides with rename target\n+\t\t#   CONFLICT (rename/delete): rename source removed on other side\n+\t\t# and instead of requiring \"rename/add\" instead of \"add/add\",\n+\t\t# be flexible in the type of console output message(s) reported\n+\t\t# for this particular case; we will be more stringent about the\n+\t\t# contents of the index and working directory.\n+\t\ttest_i18ngrep \"CONFLICT (.*/add)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (rename.*/delete)\" out &&\n \t\ttest_must_be_empty err &&\n \n \t\tgit ls-files -s >file_count &&\ndiff --git a/t/t6426-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh\nindex 5a2d07e516..699813671c 100755\n--- a/t/t6426-merge-skip-unneeded-updates.sh\n+++ b/t/t6426-merge-skip-unneeded-updates.sh\n@@ -374,7 +374,7 @@ test_expect_success '2c: Modify b & add c VS rename b->c' '\n \t\texport GIT_MERGE_VERBOSITY &&\n \t\ttest_must_fail git merge -s recursive B^0 >out 2>err &&\n \n-\t\ttest_i18ngrep \"CONFLICT (rename/add): Rename b->c\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (.*/add):\" out &&\n \t\ttest_must_be_empty err &&\n \n \t\t# Make sure c WAS updated\n-- \ngitgitgadget\n\n"},{"id":"403203","messageId":"a9a02a0ca51f16b07fe0b28d16f5a3c2888227ca.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 10/11] t642[23]: be more flexible for add/add conflicts involving pair renames","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:19Z","receivedAt":"2020-08-08T17:01:43Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nMuch like the last commit accepted 'add/add' and 'rename/add'\ninterchangably, we also want to do the same for 'add/add' and\n'rename/rename'.  This also allows us to avoid the ambiguity in meaning\nwith 'rename/rename' (is it two separate files renamed to the same\nlocation, or one file renamed on both sides but differently)?\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6422-merge-rename-corner-cases.sh | 18 ++++++++++++------\n t/t6423-merge-rename-directories.sh  |  4 ++--\n 2 files changed, 14 insertions(+), 8 deletions(-)\n\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex f3929b65c0..3375eaf4e7 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -583,7 +583,7 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '\n \t\tgit checkout B^0 &&\n \n \t\ttest_must_fail git merge -s recursive C^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (\\(.*\\)/\\1)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 2 out &&\n@@ -959,11 +959,17 @@ test_expect_failure 'rrdd-check: rename/rename(2to1)/delete/delete conflict' '\n \t\tgit checkout A^0 &&\n \t\ttest_must_fail git merge -s recursive B^0 >out 2>err &&\n \n-\t\t# Not sure whether the output should contain just one\n-\t\t# \"CONFLICT (rename/rename/delete/delete)\" line, or if it\n-\t\t# should break it into three: \"CONFLICT (rename/rename)\" and\n-\t\t# two \"CONFLICT (rename/delete)\" lines; allow for either.\n-\t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n+\t\t# Instead of requiring the output to contain one combined line\n+\t\t#   CONFLICT (rename/rename/delete/delete)\n+\t\t# or perhaps two lines:\n+\t\t#   CONFLICT (rename/rename): ...\n+\t\t#   CONFLICT (rename/delete): info about pair 1\n+\t\t#   CONFLICT (rename/delete): info about pair 2\n+\t\t# and instead of requiring \"rename/rename\" instead of \"add/add\",\n+\t\t# be flexible in the type of console output message(s) reported\n+\t\t# for this particular case; we will be more stringent about the\n+\t\t# contents of the index and working directory.\n+\t\ttest_i18ngrep \"CONFLICT (\\(.*\\)/\\1)\" out &&\n \t\ttest_i18ngrep \"CONFLICT (rename.*delete)\" out &&\n \t\ttest_must_be_empty err &&\n \ndiff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nindex 2b4a482277..f7ecbb886d 100755\n--- a/t/t6423-merge-rename-directories.sh\n+++ b/t/t6423-merge-rename-directories.sh\n@@ -275,7 +275,7 @@ test_expect_success '1d: Directory renames cause a rename/rename(2to1) conflict'\n \t\tgit checkout A^0 &&\n \n \t\ttest_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (\\(.*\\)/\\1)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 8 out &&\n@@ -1686,7 +1686,7 @@ test_expect_success '7b: rename/rename(2to1), but only due to transitive rename'\n \t\tgit checkout A^0 &&\n \n \t\ttest_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (\\(.*\\)/\\1)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 4 out &&\n-- \ngitgitgadget\n\n"},{"id":"403204","messageId":"f2d7e744fcd6ef24b8cfdbd837e61c420b0712f7.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 08/11] t6423: add an explanation about why one of the tests does not pass","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:17Z","receivedAt":"2020-08-08T17:01:46Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nWhile we're at it, document why one of the two tests doesn't pass (since\nI had long since forgotten it)...though the reasoning makes me question\nwhy it's considered a failure at all.  Maybe I had a good reason when I\nintroduced it, or maybe I just wasn't looking at it clearly?  Either\nway, the explanation may help a future reader.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6423-merge-rename-directories.sh | 8 ++++++++\n 1 file changed, 8 insertions(+)\n\ndiff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nindex bd0f17a3be..2b4a482277 100755\n--- a/t/t6423-merge-rename-directories.sh\n+++ b/t/t6423-merge-rename-directories.sh\n@@ -2843,6 +2843,14 @@ test_expect_success '9f: Renamed directory that only contained immediate subdirs\n #   Commit A: priority/{alpha,bravo}/$more_files\n #   Commit B: goal/{a,b}/$more_files, goal/c\n #   Expected: priority/{alpha,bravo}/$more_files, priority/c\n+# We currently fail this test because the directory renames we detect are\n+#   goal/a/ -> priority/alpha/\n+#   goal/b/ -> priority/bravo/\n+# We do not detect\n+#   goal/   -> priority/\n+# because of no files found within goal/, and the fact that \"a\" != \"alpha\"\n+# and \"b\" != \"bravo\".  But I'm not sure it's really a failure given that\n+# viewpoint...\n \n test_setup_9g () {\n \ttest_create_repo 9g &&\n-- \ngitgitgadget\n\n"},{"id":"403205","messageId":"38f65735118955e56af2a7b0a786e167b5f7263d.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 11/11] t6425: be more flexible with rename/delete conflict messages","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:20Z","receivedAt":"2020-08-08T17:01:48Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nt6425 was very picky about the exact output message produced by a\nrename/delete conflict, in a way that just scratches the surface of the\nmess that was built into merge-recursive.  The idea was that it would\ntry to find the possible combinations of different conflict types, and\nwhen more than one was present for one path, it would try to provide a\ncombined message that covered all the cases.\n\nThere's a lot to unravel here...\n\nFirst, there's a basic conflict type known as modify/delete, which is a\ncontent conflict.  It occurs when one side deletes a file, but the other\nmodifies it.\n\nThere is also a path conflict known as a rename/delete.  This occurs\nwhen one side deletes a path, and the other renames it.  This is not a\ncontent conflict, it is a path conflict.  It will often occur in\ncombination with a content conflict, though, namely a modify/delete.  As\nsuch, these two were often combined.\n\nAnother type of conflict that can exist is a directory/file conflict.\nFor example, one side adds a new file at some path, and the other side\nof history adds a directory at the same path.  The path that was \"added\"\ncould have been put there by a rename, though.  Thus, we have the\npossibility of a single path being affected by a modify/delete, a\nrename/delete, and a directory/file conflict.\n\nIn part, this was a natural by-product of merge-recursive's design.\nSince it was doing a four way merge with the contents of the working\ntree being the fourth factor it had to consider, it had working tree\nhandling spread all over the code.  It also had directory/file conflict\nhandling spread everywhere through all the other types of conflicts.\nAnd our testsuite has a huge number of directory/file conflict tests\nbecause trying to get them right required modifying so many different\ncodepaths.  A natural outgrowth of this kind of structure is conflict\nmessages that combine all the different types that the current codepath\nis considering.\n\nHowever, if we want to make the different conflict types orthogonal and\navoid repeating ourselves and getting very brittle code, then we need to\nsplit the messages from these different conflict types apart.  Besides,\ntrying to determine all possible permutations is a _royal_ mess.  The\ncode to handle the rename/delete/directory/file conflict output is\nalready somewhat hard to parse, and is somewhat brittle.  But if we\nreally wanted to go that route, then we'd have to have special handling\nfor the following types of combinations:\n  * rename/add/delete:\n      on side of history that didn't rename the given file, remove the file\n      instead and place an unrelated file in the way of the rename\n  * rename/rename(2to1)/mode conflict/delete/delete:\n      two different files, one executable and the other not, are renamed\n      to the same location, each side deletes the source file that the\n      other side renames\n  * rename/rename(1to2)/add/add:\n      file renamed differently on each side of history, with each side\n      placing an unrelated file in the way of the other\n  * rename/rename(1to2)/content conflict/file location/(D/F)/(D/F)/:\n      both sides modify a file in conflicting way, both rename that file\n      but to different paths, one side renames the directory which the\n      other side had renamed that file into causing it to possibly need a\n      transitive rename, and each side puts a directory in the way of the\n      other's path.\n\nLet's back away from this path of insanity, and allow the different\ntypes of conflicts to be handled by separate pieces of non-repeated code\nby allowing the conflict messages to be split into their separate types.\n(If multiple conflict types affect a single path, the conflict messages\ncan be printed sequentially.)  Start this path with a simple change:\nmodify this test to be more flexible and accept the output either merge\nbackend (recursive or the new ort) will produce.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6425-merge-rename-delete.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t6425-merge-rename-delete.sh b/t/t6425-merge-rename-delete.sh\nindex 5d33577d2f..f79d021590 100755\n--- a/t/t6425-merge-rename-delete.sh\n+++ b/t/t6425-merge-rename-delete.sh\n@@ -17,7 +17,8 @@ test_expect_success 'rename/delete' '\n \tgit commit -m \"delete\" &&\n \n \ttest_must_fail git merge --strategy=recursive rename >output &&\n-\ttest_i18ngrep \"CONFLICT (rename/delete): A deleted in HEAD and renamed to B in rename. Version rename of B left in tree.\" output\n+\ttest_i18ngrep \"CONFLICT (rename/delete): A.* renamed .*to B.* in rename\" output &&\n+\ttest_i18ngrep \"CONFLICT (rename/delete): A.*deleted in HEAD.\" output\n '\n \n test_done\n-- \ngitgitgadget\n"},{"id":"403206","messageId":"7b534d123ad77dd4905c0fc9cd5f583f3eb647a7.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 07/11] t6416, t6423: clarify some comments and fix some typos","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:16Z","receivedAt":"2020-08-08T17:01:50Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6416-recursive-corner-cases.sh   |  2 +-\n t/t6423-merge-rename-directories.sh | 25 ++++++++++++-------------\n 2 files changed, 13 insertions(+), 14 deletions(-)\n\ndiff --git a/t/t6416-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh\nindex d272b418e4..fd98989b14 100755\n--- a/t/t6416-recursive-corner-cases.sh\n+++ b/t/t6416-recursive-corner-cases.sh\n@@ -452,7 +452,7 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev\n #\n # So choice 5 at least provides some kind of conflict for the original case,\n # and can merge cleanly as expected with D1 and E3.  It also made things just\n-# slightly funny for merging D1 and e$, where E4 is defined as:\n+# slightly funny for merging D1 and E4, where E4 is defined as:\n #   Commit E4: Merge B & C, modifying 'a' and renaming to 'a2', and deleting 'a/'\n # in this case, we'll get a rename/rename(1to2) conflict because a~$UNIQUE\n # gets renamed to 'a' in D1 and to 'a2' in E4.  But that's better than having\ndiff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nindex d227e15944..bd0f17a3be 100755\n--- a/t/t6423-merge-rename-directories.sh\n+++ b/t/t6423-merge-rename-directories.sh\n@@ -2260,24 +2260,23 @@ test_expect_success '8d: rename/delete...or not?' '\n #   Commit B: w/{b,c}, z/d\n #\n # Possible Resolutions:\n-#   w/o dir-rename detection: z/d, CONFLICT(z/b -> y/b vs. w/b),\n-#                                  CONFLICT(z/c -> y/c vs. w/c)\n-#   Currently expected:       y/d, CONFLICT(z/b -> y/b vs. w/b),\n-#                                  CONFLICT(z/c -> y/c vs. w/c)\n-#   Optimal:                  ??\n+#   if z not considered renamed: z/d, CONFLICT(z/b -> y/b vs. w/b),\n+#                                     CONFLICT(z/c -> y/c vs. w/c)\n+#   if z->y rename considered:   y/d, CONFLICT(z/b -> y/b vs. w/b),\n+#                                     CONFLICT(z/c -> y/c vs. w/c)\n+#   Optimal:                     ??\n #\n # Notes: In commit A, directory z got renamed to y.  In commit B, directory z\n #        did NOT get renamed; the directory is still present; instead it is\n #        considered to have just renamed a subset of paths in directory z\n-#        elsewhere.  Therefore, the directory rename done in commit A to z/\n-#        applies to z/d and maps it to y/d.\n+#        elsewhere.  However, this is much like testcase 6b (where commit B\n+#        moves all the original paths out of z/ but opted to keep d\n+#        within z/).  This makes it hard to judge where d should end up.\n #\n #        It's possible that users would get confused about this, but what\n-#        should we do instead?  Silently leaving at z/d seems just as bad or\n-#        maybe even worse.  Perhaps we could print a big warning about z/d\n-#        and how we're moving to y/d in this case, but when I started thinking\n-#        about the ramifications of doing that, I didn't know how to rule out\n-#        that opening other weird edge and corner cases so I just punted.\n+#        should we do instead?  It's not at all clear to me whether z/d or\n+#        y/d or something else is a better resolution here, and other cases\n+#        start getting really tricky, so I just picked one.\n \n test_setup_8e () {\n \ttest_create_repo 8e &&\n@@ -4405,7 +4404,7 @@ test_expect_success '13b(info): messages for transitive rename with conflicted c\n #   Commit O: z/{b,c},   x/{d,e}\n #   Commit A: y/{b,c,d}, x/e\n #   Commit B: z/{b,c,d}, x/e\n-#   Expected: y/{b,c,d}, with info or conflict messages for d (\n+#   Expected: y/{b,c,d}, x/e, with info or conflict messages for d\n #             A: renamed x/d -> z/d; B: renamed z/ -> y/ AND renamed x/d to y/d\n #             One could argue A had partial knowledge of what was done with\n #             d and B had full knowledge, but that's a slippery slope as\n-- \ngitgitgadget\n\n"},{"id":"403207","messageId":"56e169b1d8e8b24c89f826c3efe7a4d3ca6ade05.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 06/11] t6422: fix multiple errors with the mod6 test expectations","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:15Z","receivedAt":"2020-08-08T17:01:50Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nThis test had multiple issues causing it to fail for the wrong\nreason(s):\n\n  * rename/rename(1to2) conflicts have always left the original source\n    path present in the working directory and index (at stage 1).  Thus,\n    the triple rename/rename(1to2) should result in 9 unstaged files,\n    not 6.\n  * It messed up the three-way content merge for checking the results of\n    merging for one of the renames, accidentally turning it into a\n    two-way merge.\n  * It got the contents of the base files it was using to compare\n    against wrong, due to an off-by-one error, and overwrite-redirection\n    ('>') instead of append-redirection ('>>').\n  * It used slightly too-long conflict markers\n  * It didn't include filenames in the conflict marker hunks (granted,\n    that was a shortcoming of the merge-recursive backend for rename/add\n    and rename/rename(2to1) conflicts, but since it's\n    test_expect_failure anyway we might as well make it expect our\n    preferred behavior rather than some compromise that we can't yet\n    reach anyway).\n\nFix these issues so that a merge backend which correctly handles these\nkinds of nested conflicts will pass the test.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6422-merge-rename-corner-cases.sh | 19 ++++++++++---------\n 1 file changed, 10 insertions(+), 9 deletions(-)\n\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex c8ee033ad9..2413f517e7 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -1042,25 +1042,25 @@ test_expect_failure 'mod6-check: chains of rename/rename(1to2) and rename/rename\n \t\ttest_must_be_empty err &&\n \n \t\tgit ls-files -s >file_count &&\n-\t\ttest_line_count = 6 file_count &&\n+\t\ttest_line_count = 9 file_count &&\n \t\tgit ls-files -u >file_count &&\n-\t\ttest_line_count = 6 file_count &&\n+\t\ttest_line_count = 9 file_count &&\n \t\tgit ls-files -o >file_count &&\n \t\ttest_line_count = 3 file_count &&\n \n \t\ttest_seq 10 20 >merged-one &&\n \t\ttest_seq 51 60 >merged-five &&\n \t\t# Determine what the merge of three would give us.\n-\t\ttest_seq 30 40 >three-side-A &&\n+\t\ttest_seq 31 39 >three-base &&\n+\t\ttest_seq 31 40 >three-side-A &&\n \t\ttest_seq 31 39 >three-side-B &&\n-\t\techo forty >three-side-B &&\n-\t\t>empty &&\n+\t\techo forty >>three-side-B &&\n \t\ttest_must_fail git merge-file \\\n-\t\t\t-L \"HEAD\" \\\n+\t\t\t-L \"HEAD:four\" \\\n \t\t\t-L \"\" \\\n-\t\t\t-L \"B^0\" \\\n-\t\t\tthree-side-A empty three-side-B &&\n-\t\tsed -e \"s/^\\([<=>]\\)/\\1\\1\\1/\" three-side-A >merged-three &&\n+\t\t\t-L \"B^0:two\" \\\n+\t\t\tthree-side-A three-base three-side-B &&\n+\t\tsed -e \"s/^\\([<=>]\\)/\\1\\1/\" three-side-A >merged-three &&\n \n \t\t# Verify the index is as expected\n \t\tgit rev-parse >actual         \\\n@@ -1075,6 +1075,7 @@ test_expect_failure 'mod6-check: chains of rename/rename(1to2) and rename/rename\n \n \t\tgit cat-file -p :2:two >expect &&\n \t\tgit cat-file -p :3:two >other &&\n+\t\t>empty &&\n \t\ttest_must_fail git merge-file    \\\n \t\t\t-L \"HEAD\"  -L \"\"  -L \"B^0\" \\\n \t\t\texpect     empty  other &&\n-- \ngitgitgadget\n\n"},{"id":"403208","messageId":"7f408b7d4069403b969d334f4940ebf87f1dc797.1596906081.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v2 03/11] t6422: fix bad check against missing file","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-08T17:01:12Z","receivedAt":"2020-08-08T17:01:53Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6422-merge-rename-corner-cases.sh | 6 +++---\n 1 file changed, 3 insertions(+), 3 deletions(-)\n\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex f163893ff9..7da75c1736 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -906,7 +906,7 @@ test_expect_failure 'rad-check: rename/add/delete conflict' '\n \t\tgit rev-parse >expect \\\n \t\t\tB:bar  A:bar  &&\n \n-\t\ttest_cmp file_is_missing foo &&\n+\t\ttest_path_is_missing foo &&\n \t\t# bar should have two-way merged contents of the different\n \t\t# versions of bar; check that content from both sides is\n \t\t# present.\n@@ -974,8 +974,8 @@ test_expect_failure 'rrdd-check: rename/rename(2to1)/delete/delete conflict' '\n \t\tgit rev-parse >expect \\\n \t\t\tO:foo  O:bar  &&\n \n-\t\ttest_cmp file_is_missing foo &&\n-\t\ttest_cmp file_is_missing bar &&\n+\t\ttest_path_is_missing foo &&\n+\t\ttest_path_is_missing bar &&\n \t\t# baz should have two-way merged contents of the original\n \t\t# contents of foo and bar; check that content from both sides\n \t\t# is present.\n-- \ngitgitgadget\n\n"},{"id":"403216","messageId":"CAPig+cQ0ikSOdmohSkE8o+ZmyuXMXPEvSaz7MtWwCUxFghqrHQ@mail.gmail.com","threadId":"53992","inReplyTo":"7f408b7d4069403b969d334f4940ebf87f1dc797.1596906081.git.gitgitgadget@gmail.com","subject":"Re: [PATCH v2 03/11] t6422: fix bad check against missing file","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2020-08-09T02:30:38Z","receivedAt":"2020-08-09T02:30:53Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Sat, Aug 8, 2020 at 1:02 PM Elijah Newren via GitGitGadget\n<gitgitgadget@gmail.com> wrote:\n> Signed-off-by: Elijah Newren <newren@gmail.com>\n> ---\n> diff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\n> @@ -974,8 +974,8 @@ test_expect_failure 'rrdd-check: rename/rename(2to1)/delete/delete conflict' '\n> -               test_cmp file_is_missing foo &&\n> -               test_cmp file_is_missing bar &&\n> +               test_path_is_missing foo &&\n> +               test_path_is_missing bar &&\n\nThese errors in the tests went unnoticed because they are inside\ntest_expect_failure(), which makes one wonder if test_cmp() should be\nupdated to throw a hard error to help diagnose this sort of problem\nsooner. (Then again, that might be overkill since there are relatively\nfew test_expect_failures() around, so it may not buy us much. On the\nother hand, every little bit helps.)\n"},{"id":"403228","messageId":"CAPig+cTgYv+UJauyL_o5AeYeCS=aKi_PS4VZ0Q6yH7bZk+Vg=w@mail.gmail.com","threadId":"53992","inReplyTo":"9ce80f2f943278fcb8ef46fd1a9507d832657246.1596906081.git.gitgitgadget@gmail.com","subject":"Re: [PATCH v2 04/11] t6416, t6422: fix incorrect untracked file count","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2020-08-09T03:12:02Z","receivedAt":"2020-08-09T03:12:17Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Sat, Aug 8, 2020 at 1:01 PM Elijah Newren via GitGitGadget\n<gitgitgadget@gmail.com> wrote:\n> Apparently I don't know how to count untracked files, and since the tests\n> in question were marked as test_expect_failure, no one every noticed it\n> until know.  Correct the count, as these tests clearly creates three\n> untracked files ('out', 'err', and 'file_count').\n\ns/every/ever/\ns/know/now/\ns/creates/create/\n\n> (I believe this problem arose because earlier incarnations counted lines\n> via a pipe to 'wc -l'.  Reviewers asked that it be replaced by writing\n> the output to a file and using test_line_count, but when the temporary\n> output was added to a separate file, the count of untracked files should\n> have increased.)\n>\n> Signed-off-by: Elijah Newren <newren@gmail.com>\n"},{"id":"403229","messageId":"CABPp-BGJwFKKrmVG_oV3Q7nNY_7mcqC9BZBsPSGosNiW+0mkTA@mail.gmail.com","threadId":"53992","inReplyTo":"CAPig+cTgYv+UJauyL_o5AeYeCS=aKi_PS4VZ0Q6yH7bZk+Vg=w@mail.gmail.com","subject":"Re: [PATCH v2 04/11] t6416, t6422: fix incorrect untracked file count","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2020-08-09T05:34:36Z","receivedAt":"2020-08-09T05:34:50Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"On Sat, Aug 8, 2020 at 8:12 PM Eric Sunshine <sunshine@sunshineco.com> wrote:\n>\n> On Sat, Aug 8, 2020 at 1:01 PM Elijah Newren via GitGitGadget\n> <gitgitgadget@gmail.com> wrote:\n> > Apparently I don't know how to count untracked files, and since the tests\n> > in question were marked as test_expect_failure, no one every noticed it\n> > until know.  Correct the count, as these tests clearly creates three\n> > untracked files ('out', 'err', and 'file_count').\n>\n> s/every/ever/\n> s/know/now/\n> s/creates/create/\n\nWow, that's a pretty high typo density; how embarrassing.  Thanks for\npointing out the fixes; I'll include them in the next reroll.\n"},{"id":"403310","messageId":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v2.git.git.1596906081.gitgitgadget@gmail.com","subject":"[PATCH v3 00/11] Start preparing merge-related tests to work with multiple merge backends","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:08Z","receivedAt":"2020-08-10T22:29:25Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"This series starts preparing the merge related tests to work with multiple\nbackends: merge-recursive or merge-ort. Further work will be coming.\n\nChanges since v2:\n\n * fix typos pointed out by Eric\n * reworded another commit message for clarify\n\nThe greater flexibility patches at the end of the series also previews some\nof the design changes being brought by merge-ort.\n\nMerges cleanly with next and seen, despite the pile of testcase renames.\n\nElijah Newren (11):\n  Collect merge-related tests to t64xx\n  t6418: tighten delete/normalize conflict testcase\n  t6422: fix bad check against missing file\n  t6416, t6422: fix incorrect untracked file count\n  t6423: fix test setup for a couple tests\n  t6422: fix multiple errors with the mod6 test expectations\n  t6416, t6423: clarify some comments and fix some typos\n  t6423: add an explanation about why one of the tests does not pass\n  t6422, t6426: be more flexible for add/add conflicts involving renames\n  t642[23]: be more flexible for add/add conflicts involving pair\n    renames\n  t6425: be more flexible with rename/delete conflict messages\n\n t/{t6020-merge-df.sh => t6400-merge-df.sh}    |  0\n ...ss-cross.sh => t6401-merge-criss-cross.sh} |  0\n ...-merge-rename.sh => t6402-merge-rename.sh} |  0\n ...6023-merge-file.sh => t6403-merge-file.sh} |  0\n ...sive-merge.sh => t6404-recursive-merge.sh} |  0\n ...ge-symlinks.sh => t6405-merge-symlinks.sh} |  0\n ...6026-merge-attr.sh => t6406-merge-attr.sh} |  0\n ...-merge-binary.sh => t6407-merge-binary.sh} |  0\n ...p-to-date.sh => t6408-merge-up-to-date.sh} |  0\n ...erge-subtree.sh => t6409-merge-subtree.sh} |  0\n ...ge-filemode.sh => t6411-merge-filemode.sh} |  0\n ...-rename.sh => t6412-merge-large-rename.sh} |  0\n ...6033-merge-crlf.sh => t6413-merge-crlf.sh} |  0\n ...cruft.sh => t6414-merge-rename-nocruft.sh} |  0\n ...mlink.sh => t6415-merge-dir-to-symlink.sh} |  0\n ...ses.sh => t6416-recursive-corner-cases.sh} |  4 +-\n ...s-theirs.sh => t6417-merge-ours-theirs.sh} |  0\n ...-text-auto.sh => t6418-merge-text-auto.sh} |  3 +-\n ...gnorecase.sh => t6419-merge-ignorecase.sh} |  0\n ....sh => t6422-merge-rename-corner-cases.sh} | 68 +++++++++++--------\n ...s.sh => t6423-merge-rename-directories.sh} | 39 +++++++----\n ...=> t6424-merge-unrelated-index-changes.sh} |  0\n ...delete.sh => t6425-merge-rename-delete.sh} |  3 +-\n ...h => t6426-merge-skip-unneeded-updates.sh} |  2 +-\n ...ers.sh => t6427-diff3-conflict-markers.sh} |  0\n ...-recursive.sh => t6430-merge-recursive.sh} |  0\n ...-criscross.sh => t6431-merge-criscross.sh} |  0\n ...=> t6432-merge-recursive-space-options.sh} |  0\n ...ge-toplevel.sh => t6433-merge-toplevel.sh} |  0\n ...> t6434-merge-recursive-rename-options.sh} |  0\n ...-merge-sparse.sh => t6435-merge-sparse.sh} |  0\n ...-overwrite.sh => t6436-merge-overwrite.sh} |  0\n ...dule-merge.sh => t6437-submodule-merge.sh} |  0\n ...438-submodule-directory-file-conflicts.sh} |  0\n ...r-msgs.sh => t6439-merge-co-error-msgs.sh} |  0\n 35 files changed, 71 insertions(+), 48 deletions(-)\n rename t/{t6020-merge-df.sh => t6400-merge-df.sh} (100%)\n rename t/{t6021-merge-criss-cross.sh => t6401-merge-criss-cross.sh} (100%)\n rename t/{t6022-merge-rename.sh => t6402-merge-rename.sh} (100%)\n rename t/{t6023-merge-file.sh => t6403-merge-file.sh} (100%)\n rename t/{t6024-recursive-merge.sh => t6404-recursive-merge.sh} (100%)\n rename t/{t6025-merge-symlinks.sh => t6405-merge-symlinks.sh} (100%)\n rename t/{t6026-merge-attr.sh => t6406-merge-attr.sh} (100%)\n rename t/{t6027-merge-binary.sh => t6407-merge-binary.sh} (100%)\n rename t/{t6028-merge-up-to-date.sh => t6408-merge-up-to-date.sh} (100%)\n rename t/{t6029-merge-subtree.sh => t6409-merge-subtree.sh} (100%)\n rename t/{t6031-merge-filemode.sh => t6411-merge-filemode.sh} (100%)\n rename t/{t6032-merge-large-rename.sh => t6412-merge-large-rename.sh} (100%)\n rename t/{t6033-merge-crlf.sh => t6413-merge-crlf.sh} (100%)\n rename t/{t6034-merge-rename-nocruft.sh => t6414-merge-rename-nocruft.sh} (100%)\n rename t/{t6035-merge-dir-to-symlink.sh => t6415-merge-dir-to-symlink.sh} (100%)\n rename t/{t6036-recursive-corner-cases.sh => t6416-recursive-corner-cases.sh} (99%)\n rename t/{t6037-merge-ours-theirs.sh => t6417-merge-ours-theirs.sh} (100%)\n rename t/{t6038-merge-text-auto.sh => t6418-merge-text-auto.sh} (99%)\n rename t/{t6039-merge-ignorecase.sh => t6419-merge-ignorecase.sh} (100%)\n rename t/{t6042-merge-rename-corner-cases.sh => t6422-merge-rename-corner-cases.sh} (94%)\n rename t/{t6043-merge-rename-directories.sh => t6423-merge-rename-directories.sh} (98%)\n rename t/{t6044-merge-unrelated-index-changes.sh => t6424-merge-unrelated-index-changes.sh} (100%)\n rename t/{t6045-merge-rename-delete.sh => t6425-merge-rename-delete.sh} (72%)\n rename t/{t6046-merge-skip-unneeded-updates.sh => t6426-merge-skip-unneeded-updates.sh} (99%)\n rename t/{t6047-diff3-conflict-markers.sh => t6427-diff3-conflict-markers.sh} (100%)\n rename t/{t3030-merge-recursive.sh => t6430-merge-recursive.sh} (100%)\n rename t/{t3031-merge-criscross.sh => t6431-merge-criscross.sh} (100%)\n rename t/{t3032-merge-recursive-space-options.sh => t6432-merge-recursive-space-options.sh} (100%)\n rename t/{t3033-merge-toplevel.sh => t6433-merge-toplevel.sh} (100%)\n rename t/{t3034-merge-recursive-rename-options.sh => t6434-merge-recursive-rename-options.sh} (100%)\n rename t/{t3035-merge-sparse.sh => t6435-merge-sparse.sh} (100%)\n rename t/{t7607-merge-overwrite.sh => t6436-merge-overwrite.sh} (100%)\n rename t/{t7405-submodule-merge.sh => t6437-submodule-merge.sh} (100%)\n rename t/{t7613-merge-submodule.sh => t6438-submodule-directory-file-conflicts.sh} (100%)\n rename t/{t7609-merge-co-error-msgs.sh => t6439-merge-co-error-msgs.sh} (100%)\n\n\nbase-commit: 4f0a8be78499454eac3985b6e7e144b8376ab0a5\nPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-827%2Fnewren%2Fmerge-test-rename-v3\nFetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-827/newren/merge-test-rename-v3\nPull-Request: https://github.com/git/git/pull/827\n\nRange-diff vs v2:\n\n  1:  3a2b7e9743 =  1:  8fec657942 Collect merge-related tests to t64xx\n  2:  621c9a159e =  2:  b35b61007e t6418: tighten delete/normalize conflict testcase\n  3:  7f408b7d40 =  3:  d35d4b1922 t6422: fix bad check against missing file\n  4:  9ce80f2f94 !  4:  78df85aee5 t6416, t6422: fix incorrect untracked file count\n     @@ Metadata\n       ## Commit message ##\n          t6416, t6422: fix incorrect untracked file count\n      \n     -    Apparently I don't know how to count untracked files, and since the tests\n     -    in question were marked as test_expect_failure, no one every noticed it\n     -    until know.  Correct the count, as these tests clearly creates three\n     -    untracked files ('out', 'err', and 'file_count').\n     +    Apparently I don't know how to count untracked files, and since the\n     +    tests in question were marked as test_expect_failure, no one ever\n     +    noticed it until now.  Correct the count, as these tests clearly create\n     +    three untracked files ('out', 'err', and 'file_count').\n      \n          (I believe this problem arose because earlier incarnations counted lines\n          via a pipe to 'wc -l'.  Reviewers asked that it be replaced by writing\n  5:  382d65649d =  5:  8ac78dc71b t6423: fix test setup for a couple tests\n  6:  56e169b1d8 =  6:  6674ae9de4 t6422: fix multiple errors with the mod6 test expectations\n  7:  7b534d123a =  7:  783ebb6576 t6416, t6423: clarify some comments and fix some typos\n  8:  f2d7e744fc !  8:  82e1b0e696 t6423: add an explanation about why one of the tests does not pass\n     @@ Metadata\n       ## Commit message ##\n          t6423: add an explanation about why one of the tests does not pass\n      \n     -    While we're at it, document why one of the two tests doesn't pass (since\n     -    I had long since forgotten it)...though the reasoning makes me question\n     -    why it's considered a failure at all.  Maybe I had a good reason when I\n     -    introduced it, or maybe I just wasn't looking at it clearly?  Either\n     -    way, the explanation may help a future reader.\n     +    I had long since forgotten the idea behind this test and why it failed,\n     +    and took a little while to figure it out.  To prevent others from having\n     +    to spend a similar time on it, add an explanation in the comments.\n     +    However, the reasoning in the explanation makes me question why I\n     +    considered it a failure at all.  I'm not sure if I had a better reason\n     +    when I originally wrote it, but for now just add commentary about the\n     +    possible expectations and why it behaves the way it does right now.\n      \n          Signed-off-by: Elijah Newren <newren@gmail.com>\n      \n  9:  b4e165eca4 =  9:  42e3f699f1 t6422, t6426: be more flexible for add/add conflicts involving renames\n 10:  a9a02a0ca5 = 10:  456160f3a7 t642[23]: be more flexible for add/add conflicts involving pair renames\n 11:  38f6573511 = 11:  0c8dcbf01c t6425: be more flexible with rename/delete conflict messages\n\n-- \ngitgitgadget\n"},{"id":"403311","messageId":"8fec657942267c0423c05de59e1867db88ebbc9b.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 01/11] Collect merge-related tests to t64xx","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:09Z","receivedAt":"2020-08-10T22:29:25Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nThe tests for the merge machinery are spread over several places.\nCollect them into t64xx for simplicity.  Some notes:\n\nt60[234]*.sh:\n  Merge tests started in t602*, overgrew bisect and remote tracking\n  tests in t6030, t6040, and t6041, and nearly overtook replace tests\n  in t6050.  This made picking out relevant tests that I wanted to run\n  in a tighter loop slightly more annoying for years.\n\nt303*.sh:\n  These started out as tests for the 'merge-recursive' toplevel command,\n  but did not restrict to that and had lots of overlap with the\n  underlying merge machinery.\nt7405, t7613:\n  submodule-specific merge logic started out in submodule.c but was\n  moved to merge-recursive.c in commit 18cfc08866 (\"submodule.c: move\n  submodule merging to merge-recursive.c\", 2018-05-15).  Since these\n  tests are about the logic found in the merge machinery, moving these\n  tests to be with the merge tests makes sense.\n\nt7607, t7609:\n  Having tests spread all over the place makes it more likely that\n  additional tests related to a certain piece of logic grow in all those\n  other places.  Much like t303*.sh, these two tests were about the\n  underlying merge machinery rather than outer levels.\n\nTests that were NOT moved:\n\nt76[01]*.sh:\n  Other than the four tests mentioned above, the remaining tests in\n  t76[01]*.sh are related to non-recursive merge strategies, parameter\n  parsing, and other stuff associated with the highlevel builtin/merge.c\n  rather than the recursive merge machinery.\n\nt3[45]*.sh:\n  The rebase testcases in t34*.sh also test the merge logic pretty\n  heavily; sometimes changes I make only trigger failures in the rebase\n  tests.  The rebase tests are already nicely coupled together, though,\n  and I didn't want to mess that up.  Similar comments apply for the\n  cherry-pick tests in t35*.sh.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/{t6020-merge-df.sh => t6400-merge-df.sh}                        | 0\n t/{t6021-merge-criss-cross.sh => t6401-merge-criss-cross.sh}      | 0\n t/{t6022-merge-rename.sh => t6402-merge-rename.sh}                | 0\n t/{t6023-merge-file.sh => t6403-merge-file.sh}                    | 0\n t/{t6024-recursive-merge.sh => t6404-recursive-merge.sh}          | 0\n t/{t6025-merge-symlinks.sh => t6405-merge-symlinks.sh}            | 0\n t/{t6026-merge-attr.sh => t6406-merge-attr.sh}                    | 0\n t/{t6027-merge-binary.sh => t6407-merge-binary.sh}                | 0\n t/{t6028-merge-up-to-date.sh => t6408-merge-up-to-date.sh}        | 0\n t/{t6029-merge-subtree.sh => t6409-merge-subtree.sh}              | 0\n t/{t6031-merge-filemode.sh => t6411-merge-filemode.sh}            | 0\n t/{t6032-merge-large-rename.sh => t6412-merge-large-rename.sh}    | 0\n t/{t6033-merge-crlf.sh => t6413-merge-crlf.sh}                    | 0\n ...6034-merge-rename-nocruft.sh => t6414-merge-rename-nocruft.sh} | 0\n ...6035-merge-dir-to-symlink.sh => t6415-merge-dir-to-symlink.sh} | 0\n ...-recursive-corner-cases.sh => t6416-recursive-corner-cases.sh} | 0\n t/{t6037-merge-ours-theirs.sh => t6417-merge-ours-theirs.sh}      | 0\n t/{t6038-merge-text-auto.sh => t6418-merge-text-auto.sh}          | 0\n t/{t6039-merge-ignorecase.sh => t6419-merge-ignorecase.sh}        | 0\n ...-rename-corner-cases.sh => t6422-merge-rename-corner-cases.sh} | 0\n ...ge-rename-directories.sh => t6423-merge-rename-directories.sh} | 0\n ...ed-index-changes.sh => t6424-merge-unrelated-index-changes.sh} | 0\n t/{t6045-merge-rename-delete.sh => t6425-merge-rename-delete.sh}  | 0\n ...p-unneeded-updates.sh => t6426-merge-skip-unneeded-updates.sh} | 0\n ...-diff3-conflict-markers.sh => t6427-diff3-conflict-markers.sh} | 0\n t/{t3030-merge-recursive.sh => t6430-merge-recursive.sh}          | 0\n t/{t3031-merge-criscross.sh => t6431-merge-criscross.sh}          | 0\n ...ve-space-options.sh => t6432-merge-recursive-space-options.sh} | 0\n t/{t3033-merge-toplevel.sh => t6433-merge-toplevel.sh}            | 0\n ...-rename-options.sh => t6434-merge-recursive-rename-options.sh} | 0\n t/{t3035-merge-sparse.sh => t6435-merge-sparse.sh}                | 0\n t/{t7607-merge-overwrite.sh => t6436-merge-overwrite.sh}          | 0\n t/{t7405-submodule-merge.sh => t6437-submodule-merge.sh}          | 0\n ...e-submodule.sh => t6438-submodule-directory-file-conflicts.sh} | 0\n t/{t7609-merge-co-error-msgs.sh => t6439-merge-co-error-msgs.sh}  | 0\n 35 files changed, 0 insertions(+), 0 deletions(-)\n rename t/{t6020-merge-df.sh => t6400-merge-df.sh} (100%)\n rename t/{t6021-merge-criss-cross.sh => t6401-merge-criss-cross.sh} (100%)\n rename t/{t6022-merge-rename.sh => t6402-merge-rename.sh} (100%)\n rename t/{t6023-merge-file.sh => t6403-merge-file.sh} (100%)\n rename t/{t6024-recursive-merge.sh => t6404-recursive-merge.sh} (100%)\n rename t/{t6025-merge-symlinks.sh => t6405-merge-symlinks.sh} (100%)\n rename t/{t6026-merge-attr.sh => t6406-merge-attr.sh} (100%)\n rename t/{t6027-merge-binary.sh => t6407-merge-binary.sh} (100%)\n rename t/{t6028-merge-up-to-date.sh => t6408-merge-up-to-date.sh} (100%)\n rename t/{t6029-merge-subtree.sh => t6409-merge-subtree.sh} (100%)\n rename t/{t6031-merge-filemode.sh => t6411-merge-filemode.sh} (100%)\n rename t/{t6032-merge-large-rename.sh => t6412-merge-large-rename.sh} (100%)\n rename t/{t6033-merge-crlf.sh => t6413-merge-crlf.sh} (100%)\n rename t/{t6034-merge-rename-nocruft.sh => t6414-merge-rename-nocruft.sh} (100%)\n rename t/{t6035-merge-dir-to-symlink.sh => t6415-merge-dir-to-symlink.sh} (100%)\n rename t/{t6036-recursive-corner-cases.sh => t6416-recursive-corner-cases.sh} (100%)\n rename t/{t6037-merge-ours-theirs.sh => t6417-merge-ours-theirs.sh} (100%)\n rename t/{t6038-merge-text-auto.sh => t6418-merge-text-auto.sh} (100%)\n rename t/{t6039-merge-ignorecase.sh => t6419-merge-ignorecase.sh} (100%)\n rename t/{t6042-merge-rename-corner-cases.sh => t6422-merge-rename-corner-cases.sh} (100%)\n rename t/{t6043-merge-rename-directories.sh => t6423-merge-rename-directories.sh} (100%)\n rename t/{t6044-merge-unrelated-index-changes.sh => t6424-merge-unrelated-index-changes.sh} (100%)\n rename t/{t6045-merge-rename-delete.sh => t6425-merge-rename-delete.sh} (100%)\n rename t/{t6046-merge-skip-unneeded-updates.sh => t6426-merge-skip-unneeded-updates.sh} (100%)\n rename t/{t6047-diff3-conflict-markers.sh => t6427-diff3-conflict-markers.sh} (100%)\n rename t/{t3030-merge-recursive.sh => t6430-merge-recursive.sh} (100%)\n rename t/{t3031-merge-criscross.sh => t6431-merge-criscross.sh} (100%)\n rename t/{t3032-merge-recursive-space-options.sh => t6432-merge-recursive-space-options.sh} (100%)\n rename t/{t3033-merge-toplevel.sh => t6433-merge-toplevel.sh} (100%)\n rename t/{t3034-merge-recursive-rename-options.sh => t6434-merge-recursive-rename-options.sh} (100%)\n rename t/{t3035-merge-sparse.sh => t6435-merge-sparse.sh} (100%)\n rename t/{t7607-merge-overwrite.sh => t6436-merge-overwrite.sh} (100%)\n rename t/{t7405-submodule-merge.sh => t6437-submodule-merge.sh} (100%)\n rename t/{t7613-merge-submodule.sh => t6438-submodule-directory-file-conflicts.sh} (100%)\n rename t/{t7609-merge-co-error-msgs.sh => t6439-merge-co-error-msgs.sh} (100%)\n\ndiff --git a/t/t6020-merge-df.sh b/t/t6400-merge-df.sh\nsimilarity index 100%\nrename from t/t6020-merge-df.sh\nrename to t/t6400-merge-df.sh\ndiff --git a/t/t6021-merge-criss-cross.sh b/t/t6401-merge-criss-cross.sh\nsimilarity index 100%\nrename from t/t6021-merge-criss-cross.sh\nrename to t/t6401-merge-criss-cross.sh\ndiff --git a/t/t6022-merge-rename.sh b/t/t6402-merge-rename.sh\nsimilarity index 100%\nrename from t/t6022-merge-rename.sh\nrename to t/t6402-merge-rename.sh\ndiff --git a/t/t6023-merge-file.sh b/t/t6403-merge-file.sh\nsimilarity index 100%\nrename from t/t6023-merge-file.sh\nrename to t/t6403-merge-file.sh\ndiff --git a/t/t6024-recursive-merge.sh b/t/t6404-recursive-merge.sh\nsimilarity index 100%\nrename from t/t6024-recursive-merge.sh\nrename to t/t6404-recursive-merge.sh\ndiff --git a/t/t6025-merge-symlinks.sh b/t/t6405-merge-symlinks.sh\nsimilarity index 100%\nrename from t/t6025-merge-symlinks.sh\nrename to t/t6405-merge-symlinks.sh\ndiff --git a/t/t6026-merge-attr.sh b/t/t6406-merge-attr.sh\nsimilarity index 100%\nrename from t/t6026-merge-attr.sh\nrename to t/t6406-merge-attr.sh\ndiff --git a/t/t6027-merge-binary.sh b/t/t6407-merge-binary.sh\nsimilarity index 100%\nrename from t/t6027-merge-binary.sh\nrename to t/t6407-merge-binary.sh\ndiff --git a/t/t6028-merge-up-to-date.sh b/t/t6408-merge-up-to-date.sh\nsimilarity index 100%\nrename from t/t6028-merge-up-to-date.sh\nrename to t/t6408-merge-up-to-date.sh\ndiff --git a/t/t6029-merge-subtree.sh b/t/t6409-merge-subtree.sh\nsimilarity index 100%\nrename from t/t6029-merge-subtree.sh\nrename to t/t6409-merge-subtree.sh\ndiff --git a/t/t6031-merge-filemode.sh b/t/t6411-merge-filemode.sh\nsimilarity index 100%\nrename from t/t6031-merge-filemode.sh\nrename to t/t6411-merge-filemode.sh\ndiff --git a/t/t6032-merge-large-rename.sh b/t/t6412-merge-large-rename.sh\nsimilarity index 100%\nrename from t/t6032-merge-large-rename.sh\nrename to t/t6412-merge-large-rename.sh\ndiff --git a/t/t6033-merge-crlf.sh b/t/t6413-merge-crlf.sh\nsimilarity index 100%\nrename from t/t6033-merge-crlf.sh\nrename to t/t6413-merge-crlf.sh\ndiff --git a/t/t6034-merge-rename-nocruft.sh b/t/t6414-merge-rename-nocruft.sh\nsimilarity index 100%\nrename from t/t6034-merge-rename-nocruft.sh\nrename to t/t6414-merge-rename-nocruft.sh\ndiff --git a/t/t6035-merge-dir-to-symlink.sh b/t/t6415-merge-dir-to-symlink.sh\nsimilarity index 100%\nrename from t/t6035-merge-dir-to-symlink.sh\nrename to t/t6415-merge-dir-to-symlink.sh\ndiff --git a/t/t6036-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh\nsimilarity index 100%\nrename from t/t6036-recursive-corner-cases.sh\nrename to t/t6416-recursive-corner-cases.sh\ndiff --git a/t/t6037-merge-ours-theirs.sh b/t/t6417-merge-ours-theirs.sh\nsimilarity index 100%\nrename from t/t6037-merge-ours-theirs.sh\nrename to t/t6417-merge-ours-theirs.sh\ndiff --git a/t/t6038-merge-text-auto.sh b/t/t6418-merge-text-auto.sh\nsimilarity index 100%\nrename from t/t6038-merge-text-auto.sh\nrename to t/t6418-merge-text-auto.sh\ndiff --git a/t/t6039-merge-ignorecase.sh b/t/t6419-merge-ignorecase.sh\nsimilarity index 100%\nrename from t/t6039-merge-ignorecase.sh\nrename to t/t6419-merge-ignorecase.sh\ndiff --git a/t/t6042-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nsimilarity index 100%\nrename from t/t6042-merge-rename-corner-cases.sh\nrename to t/t6422-merge-rename-corner-cases.sh\ndiff --git a/t/t6043-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nsimilarity index 100%\nrename from t/t6043-merge-rename-directories.sh\nrename to t/t6423-merge-rename-directories.sh\ndiff --git a/t/t6044-merge-unrelated-index-changes.sh b/t/t6424-merge-unrelated-index-changes.sh\nsimilarity index 100%\nrename from t/t6044-merge-unrelated-index-changes.sh\nrename to t/t6424-merge-unrelated-index-changes.sh\ndiff --git a/t/t6045-merge-rename-delete.sh b/t/t6425-merge-rename-delete.sh\nsimilarity index 100%\nrename from t/t6045-merge-rename-delete.sh\nrename to t/t6425-merge-rename-delete.sh\ndiff --git a/t/t6046-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh\nsimilarity index 100%\nrename from t/t6046-merge-skip-unneeded-updates.sh\nrename to t/t6426-merge-skip-unneeded-updates.sh\ndiff --git a/t/t6047-diff3-conflict-markers.sh b/t/t6427-diff3-conflict-markers.sh\nsimilarity index 100%\nrename from t/t6047-diff3-conflict-markers.sh\nrename to t/t6427-diff3-conflict-markers.sh\ndiff --git a/t/t3030-merge-recursive.sh b/t/t6430-merge-recursive.sh\nsimilarity index 100%\nrename from t/t3030-merge-recursive.sh\nrename to t/t6430-merge-recursive.sh\ndiff --git a/t/t3031-merge-criscross.sh b/t/t6431-merge-criscross.sh\nsimilarity index 100%\nrename from t/t3031-merge-criscross.sh\nrename to t/t6431-merge-criscross.sh\ndiff --git a/t/t3032-merge-recursive-space-options.sh b/t/t6432-merge-recursive-space-options.sh\nsimilarity index 100%\nrename from t/t3032-merge-recursive-space-options.sh\nrename to t/t6432-merge-recursive-space-options.sh\ndiff --git a/t/t3033-merge-toplevel.sh b/t/t6433-merge-toplevel.sh\nsimilarity index 100%\nrename from t/t3033-merge-toplevel.sh\nrename to t/t6433-merge-toplevel.sh\ndiff --git a/t/t3034-merge-recursive-rename-options.sh b/t/t6434-merge-recursive-rename-options.sh\nsimilarity index 100%\nrename from t/t3034-merge-recursive-rename-options.sh\nrename to t/t6434-merge-recursive-rename-options.sh\ndiff --git a/t/t3035-merge-sparse.sh b/t/t6435-merge-sparse.sh\nsimilarity index 100%\nrename from t/t3035-merge-sparse.sh\nrename to t/t6435-merge-sparse.sh\ndiff --git a/t/t7607-merge-overwrite.sh b/t/t6436-merge-overwrite.sh\nsimilarity index 100%\nrename from t/t7607-merge-overwrite.sh\nrename to t/t6436-merge-overwrite.sh\ndiff --git a/t/t7405-submodule-merge.sh b/t/t6437-submodule-merge.sh\nsimilarity index 100%\nrename from t/t7405-submodule-merge.sh\nrename to t/t6437-submodule-merge.sh\ndiff --git a/t/t7613-merge-submodule.sh b/t/t6438-submodule-directory-file-conflicts.sh\nsimilarity index 100%\nrename from t/t7613-merge-submodule.sh\nrename to t/t6438-submodule-directory-file-conflicts.sh\ndiff --git a/t/t7609-merge-co-error-msgs.sh b/t/t6439-merge-co-error-msgs.sh\nsimilarity index 100%\nrename from t/t7609-merge-co-error-msgs.sh\nrename to t/t6439-merge-co-error-msgs.sh\n-- \ngitgitgadget\n\n"},{"id":"403312","messageId":"8ac78dc71be0bc25c61e3bef929872354684648a.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 05/11] t6423: fix test setup for a couple tests","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:13Z","receivedAt":"2020-08-10T22:29:29Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nCommit da1e295e00 (\"t604[236]: do not run setup in separate tests\",\n2019-10-22) removed approximately half the tests (which were setup-only\ntests) in t6043 by turning them into functions that the subsequent test\nwould call as their first step.  This ensured that any test from this\nfile could be run entirely independently of all the other tests in the\nfile.  Unfortunately, the call to the new setup function was missed in\ntwo of the test_expect_failure cases.  Add them in.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6423-merge-rename-directories.sh | 2 ++\n 1 file changed, 2 insertions(+)\n\ndiff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nindex 83792c5ef1..d227e15944 100755\n--- a/t/t6423-merge-rename-directories.sh\n+++ b/t/t6423-merge-rename-directories.sh\n@@ -2880,6 +2880,7 @@ test_setup_9g () {\n }\n \n test_expect_failure '9g: Renamed directory that only contained immediate subdirs, immediate subdirs renamed' '\n+\ttest_setup_9g &&\n \t(\n \t\tcd 9g &&\n \n@@ -3362,6 +3363,7 @@ test_setup_10e () {\n }\n \n test_expect_failure '10e: Does git complain about untracked file that is not really in the way?' '\n+\ttest_setup_10e &&\n \t(\n \t\tcd 10e &&\n \n-- \ngitgitgadget\n\n"},{"id":"403313","messageId":"6674ae9de48fe2014eb69b3fe31fddfe4b0414d8.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 06/11] t6422: fix multiple errors with the mod6 test expectations","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:14Z","receivedAt":"2020-08-10T22:29:30Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nThis test had multiple issues causing it to fail for the wrong\nreason(s):\n\n  * rename/rename(1to2) conflicts have always left the original source\n    path present in the working directory and index (at stage 1).  Thus,\n    the triple rename/rename(1to2) should result in 9 unstaged files,\n    not 6.\n  * It messed up the three-way content merge for checking the results of\n    merging for one of the renames, accidentally turning it into a\n    two-way merge.\n  * It got the contents of the base files it was using to compare\n    against wrong, due to an off-by-one error, and overwrite-redirection\n    ('>') instead of append-redirection ('>>').\n  * It used slightly too-long conflict markers\n  * It didn't include filenames in the conflict marker hunks (granted,\n    that was a shortcoming of the merge-recursive backend for rename/add\n    and rename/rename(2to1) conflicts, but since it's\n    test_expect_failure anyway we might as well make it expect our\n    preferred behavior rather than some compromise that we can't yet\n    reach anyway).\n\nFix these issues so that a merge backend which correctly handles these\nkinds of nested conflicts will pass the test.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6422-merge-rename-corner-cases.sh | 19 ++++++++++---------\n 1 file changed, 10 insertions(+), 9 deletions(-)\n\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex c8ee033ad9..2413f517e7 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -1042,25 +1042,25 @@ test_expect_failure 'mod6-check: chains of rename/rename(1to2) and rename/rename\n \t\ttest_must_be_empty err &&\n \n \t\tgit ls-files -s >file_count &&\n-\t\ttest_line_count = 6 file_count &&\n+\t\ttest_line_count = 9 file_count &&\n \t\tgit ls-files -u >file_count &&\n-\t\ttest_line_count = 6 file_count &&\n+\t\ttest_line_count = 9 file_count &&\n \t\tgit ls-files -o >file_count &&\n \t\ttest_line_count = 3 file_count &&\n \n \t\ttest_seq 10 20 >merged-one &&\n \t\ttest_seq 51 60 >merged-five &&\n \t\t# Determine what the merge of three would give us.\n-\t\ttest_seq 30 40 >three-side-A &&\n+\t\ttest_seq 31 39 >three-base &&\n+\t\ttest_seq 31 40 >three-side-A &&\n \t\ttest_seq 31 39 >three-side-B &&\n-\t\techo forty >three-side-B &&\n-\t\t>empty &&\n+\t\techo forty >>three-side-B &&\n \t\ttest_must_fail git merge-file \\\n-\t\t\t-L \"HEAD\" \\\n+\t\t\t-L \"HEAD:four\" \\\n \t\t\t-L \"\" \\\n-\t\t\t-L \"B^0\" \\\n-\t\t\tthree-side-A empty three-side-B &&\n-\t\tsed -e \"s/^\\([<=>]\\)/\\1\\1\\1/\" three-side-A >merged-three &&\n+\t\t\t-L \"B^0:two\" \\\n+\t\t\tthree-side-A three-base three-side-B &&\n+\t\tsed -e \"s/^\\([<=>]\\)/\\1\\1/\" three-side-A >merged-three &&\n \n \t\t# Verify the index is as expected\n \t\tgit rev-parse >actual         \\\n@@ -1075,6 +1075,7 @@ test_expect_failure 'mod6-check: chains of rename/rename(1to2) and rename/rename\n \n \t\tgit cat-file -p :2:two >expect &&\n \t\tgit cat-file -p :3:two >other &&\n+\t\t>empty &&\n \t\ttest_must_fail git merge-file    \\\n \t\t\t-L \"HEAD\"  -L \"\"  -L \"B^0\" \\\n \t\t\texpect     empty  other &&\n-- \ngitgitgadget\n\n"},{"id":"403314","messageId":"783ebb65768b2ca810bb11ae1845d1e1db346ff8.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 07/11] t6416, t6423: clarify some comments and fix some typos","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:15Z","receivedAt":"2020-08-10T22:29:32Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6416-recursive-corner-cases.sh   |  2 +-\n t/t6423-merge-rename-directories.sh | 25 ++++++++++++-------------\n 2 files changed, 13 insertions(+), 14 deletions(-)\n\ndiff --git a/t/t6416-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh\nindex d272b418e4..fd98989b14 100755\n--- a/t/t6416-recursive-corner-cases.sh\n+++ b/t/t6416-recursive-corner-cases.sh\n@@ -452,7 +452,7 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev\n #\n # So choice 5 at least provides some kind of conflict for the original case,\n # and can merge cleanly as expected with D1 and E3.  It also made things just\n-# slightly funny for merging D1 and e$, where E4 is defined as:\n+# slightly funny for merging D1 and E4, where E4 is defined as:\n #   Commit E4: Merge B & C, modifying 'a' and renaming to 'a2', and deleting 'a/'\n # in this case, we'll get a rename/rename(1to2) conflict because a~$UNIQUE\n # gets renamed to 'a' in D1 and to 'a2' in E4.  But that's better than having\ndiff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nindex d227e15944..bd0f17a3be 100755\n--- a/t/t6423-merge-rename-directories.sh\n+++ b/t/t6423-merge-rename-directories.sh\n@@ -2260,24 +2260,23 @@ test_expect_success '8d: rename/delete...or not?' '\n #   Commit B: w/{b,c}, z/d\n #\n # Possible Resolutions:\n-#   w/o dir-rename detection: z/d, CONFLICT(z/b -> y/b vs. w/b),\n-#                                  CONFLICT(z/c -> y/c vs. w/c)\n-#   Currently expected:       y/d, CONFLICT(z/b -> y/b vs. w/b),\n-#                                  CONFLICT(z/c -> y/c vs. w/c)\n-#   Optimal:                  ??\n+#   if z not considered renamed: z/d, CONFLICT(z/b -> y/b vs. w/b),\n+#                                     CONFLICT(z/c -> y/c vs. w/c)\n+#   if z->y rename considered:   y/d, CONFLICT(z/b -> y/b vs. w/b),\n+#                                     CONFLICT(z/c -> y/c vs. w/c)\n+#   Optimal:                     ??\n #\n # Notes: In commit A, directory z got renamed to y.  In commit B, directory z\n #        did NOT get renamed; the directory is still present; instead it is\n #        considered to have just renamed a subset of paths in directory z\n-#        elsewhere.  Therefore, the directory rename done in commit A to z/\n-#        applies to z/d and maps it to y/d.\n+#        elsewhere.  However, this is much like testcase 6b (where commit B\n+#        moves all the original paths out of z/ but opted to keep d\n+#        within z/).  This makes it hard to judge where d should end up.\n #\n #        It's possible that users would get confused about this, but what\n-#        should we do instead?  Silently leaving at z/d seems just as bad or\n-#        maybe even worse.  Perhaps we could print a big warning about z/d\n-#        and how we're moving to y/d in this case, but when I started thinking\n-#        about the ramifications of doing that, I didn't know how to rule out\n-#        that opening other weird edge and corner cases so I just punted.\n+#        should we do instead?  It's not at all clear to me whether z/d or\n+#        y/d or something else is a better resolution here, and other cases\n+#        start getting really tricky, so I just picked one.\n \n test_setup_8e () {\n \ttest_create_repo 8e &&\n@@ -4405,7 +4404,7 @@ test_expect_success '13b(info): messages for transitive rename with conflicted c\n #   Commit O: z/{b,c},   x/{d,e}\n #   Commit A: y/{b,c,d}, x/e\n #   Commit B: z/{b,c,d}, x/e\n-#   Expected: y/{b,c,d}, with info or conflict messages for d (\n+#   Expected: y/{b,c,d}, x/e, with info or conflict messages for d\n #             A: renamed x/d -> z/d; B: renamed z/ -> y/ AND renamed x/d to y/d\n #             One could argue A had partial knowledge of what was done with\n #             d and B had full knowledge, but that's a slippery slope as\n-- \ngitgitgadget\n\n"},{"id":"403315","messageId":"82e1b0e69671f16e21208b5931c54266f2f743f3.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 08/11] t6423: add an explanation about why one of the tests does not pass","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:16Z","receivedAt":"2020-08-10T22:29:33Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nI had long since forgotten the idea behind this test and why it failed,\nand took a little while to figure it out.  To prevent others from having\nto spend a similar time on it, add an explanation in the comments.\nHowever, the reasoning in the explanation makes me question why I\nconsidered it a failure at all.  I'm not sure if I had a better reason\nwhen I originally wrote it, but for now just add commentary about the\npossible expectations and why it behaves the way it does right now.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6423-merge-rename-directories.sh | 8 ++++++++\n 1 file changed, 8 insertions(+)\n\ndiff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nindex bd0f17a3be..2b4a482277 100755\n--- a/t/t6423-merge-rename-directories.sh\n+++ b/t/t6423-merge-rename-directories.sh\n@@ -2843,6 +2843,14 @@ test_expect_success '9f: Renamed directory that only contained immediate subdirs\n #   Commit A: priority/{alpha,bravo}/$more_files\n #   Commit B: goal/{a,b}/$more_files, goal/c\n #   Expected: priority/{alpha,bravo}/$more_files, priority/c\n+# We currently fail this test because the directory renames we detect are\n+#   goal/a/ -> priority/alpha/\n+#   goal/b/ -> priority/bravo/\n+# We do not detect\n+#   goal/   -> priority/\n+# because of no files found within goal/, and the fact that \"a\" != \"alpha\"\n+# and \"b\" != \"bravo\".  But I'm not sure it's really a failure given that\n+# viewpoint...\n \n test_setup_9g () {\n \ttest_create_repo 9g &&\n-- \ngitgitgadget\n\n"},{"id":"403316","messageId":"42e3f699f1c67a8c3d9dbfbf3c79342811d9e9fa.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 09/11] t6422, t6426: be more flexible for add/add conflicts involving renames","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:17Z","receivedAt":"2020-08-10T22:29:34Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nmerge-recursive treats an add/add conflict where one of the adds came\nfrom a rename as a separate 'rename/add' type of conflict.  However, if\nthere is not content conflict after the content merge(s), then the file\nis not considered to be conflicted.  That suggests the conflict type is\nreally just add/add.  Other merge engines might choose to print messages\nto the console that just refer to these as add/add conflicts; accept\nboth types of output.\n\nNote: it could help to notify users if the three-way content merge of\nthe rename had content conflicts, because when we then go to two-way\nmerge THAT with the conflicting add we can get nested conflict markers.\nmerge-recursive, unfortunately, doesn't do that, but other merge engines\ncould.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6422-merge-rename-corner-cases.sh   | 21 +++++++++++++--------\n t/t6426-merge-skip-unneeded-updates.sh |  2 +-\n 2 files changed, 14 insertions(+), 9 deletions(-)\n\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex 2413f517e7..f3929b65c0 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -457,7 +457,7 @@ test_expect_success 'handle rename-with-content-merge vs. add' '\n \t\tgit checkout A^0 &&\n \n \t\ttest_must_fail git merge -s recursive B^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/add)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (.*/add)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 2 out &&\n@@ -503,7 +503,7 @@ test_expect_success 'handle rename-with-content-merge vs. add, merge other way'\n \t\tgit checkout B^0 &&\n \n \t\ttest_must_fail git merge -s recursive A^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/add)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (.*/add)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 2 out &&\n@@ -886,12 +886,17 @@ test_expect_failure 'rad-check: rename/add/delete conflict' '\n \t\tgit checkout B^0 &&\n \t\ttest_must_fail git merge -s recursive A^0 >out 2>err &&\n \n-\t\t# Not sure whether the output should contain just one\n-\t\t# \"CONFLICT (rename/add/delete)\" line, or if it should break\n-\t\t# it into a pair of \"CONFLICT (rename/delete)\" and\n-\t\t# \"CONFLICT (rename/add)\"; allow for either.\n-\t\ttest_i18ngrep \"CONFLICT (rename.*add)\" out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename.*delete)\" out &&\n+\t\t# Instead of requiring the output to contain one combined line\n+\t\t#   CONFLICT (rename/add/delete)\n+\t\t# or perhaps two lines:\n+\t\t#   CONFLICT (rename/add): new file collides with rename target\n+\t\t#   CONFLICT (rename/delete): rename source removed on other side\n+\t\t# and instead of requiring \"rename/add\" instead of \"add/add\",\n+\t\t# be flexible in the type of console output message(s) reported\n+\t\t# for this particular case; we will be more stringent about the\n+\t\t# contents of the index and working directory.\n+\t\ttest_i18ngrep \"CONFLICT (.*/add)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (rename.*/delete)\" out &&\n \t\ttest_must_be_empty err &&\n \n \t\tgit ls-files -s >file_count &&\ndiff --git a/t/t6426-merge-skip-unneeded-updates.sh b/t/t6426-merge-skip-unneeded-updates.sh\nindex 5a2d07e516..699813671c 100755\n--- a/t/t6426-merge-skip-unneeded-updates.sh\n+++ b/t/t6426-merge-skip-unneeded-updates.sh\n@@ -374,7 +374,7 @@ test_expect_success '2c: Modify b & add c VS rename b->c' '\n \t\texport GIT_MERGE_VERBOSITY &&\n \t\ttest_must_fail git merge -s recursive B^0 >out 2>err &&\n \n-\t\ttest_i18ngrep \"CONFLICT (rename/add): Rename b->c\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (.*/add):\" out &&\n \t\ttest_must_be_empty err &&\n \n \t\t# Make sure c WAS updated\n-- \ngitgitgadget\n\n"},{"id":"403317","messageId":"78df85aee5ff84293912632f48951718cff3dee8.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 04/11] t6416, t6422: fix incorrect untracked file count","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:12Z","receivedAt":"2020-08-10T22:29:35Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nApparently I don't know how to count untracked files, and since the\ntests in question were marked as test_expect_failure, no one ever\nnoticed it until now.  Correct the count, as these tests clearly create\nthree untracked files ('out', 'err', and 'file_count').\n\n(I believe this problem arose because earlier incarnations counted lines\nvia a pipe to 'wc -l'.  Reviewers asked that it be replaced by writing\nthe output to a file and using test_line_count, but when the temporary\noutput was added to a separate file, the count of untracked files should\nhave increased.)\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6416-recursive-corner-cases.sh    | 2 +-\n t/t6422-merge-rename-corner-cases.sh | 4 ++--\n 2 files changed, 3 insertions(+), 3 deletions(-)\n\ndiff --git a/t/t6416-recursive-corner-cases.sh b/t/t6416-recursive-corner-cases.sh\nindex b3bf462617..d272b418e4 100755\n--- a/t/t6416-recursive-corner-cases.sh\n+++ b/t/t6416-recursive-corner-cases.sh\n@@ -1144,7 +1144,7 @@ test_expect_failure 'check symlink add/add' '\n \t\ttest_must_fail git merge -s recursive E^0 &&\n \n \t\tgit ls-files -s >out &&\n-\t\ttest_line_count = 2 out &&\n+\t\ttest_line_count = 3 out &&\n \t\tgit ls-files -u >out &&\n \t\ttest_line_count = 2 out &&\n \t\tgit ls-files -o >out &&\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex 7da75c1736..c8ee033ad9 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -899,7 +899,7 @@ test_expect_failure 'rad-check: rename/add/delete conflict' '\n \t\tgit ls-files -u >file_count &&\n \t\ttest_line_count = 2 file_count &&\n \t\tgit ls-files -o >file_count &&\n-\t\ttest_line_count = 2 file_count &&\n+\t\ttest_line_count = 3 file_count &&\n \n \t\tgit rev-parse >actual \\\n \t\t\t:2:bar :3:bar &&\n@@ -967,7 +967,7 @@ test_expect_failure 'rrdd-check: rename/rename(2to1)/delete/delete conflict' '\n \t\tgit ls-files -u >file_count &&\n \t\ttest_line_count = 2 file_count &&\n \t\tgit ls-files -o >file_count &&\n-\t\ttest_line_count = 2 file_count &&\n+\t\ttest_line_count = 3 file_count &&\n \n \t\tgit rev-parse >actual \\\n \t\t\t:2:baz :3:baz &&\n-- \ngitgitgadget\n\n"},{"id":"403318","messageId":"456160f3a73bf33e3e696405019996efa99ae379.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 10/11] t642[23]: be more flexible for add/add conflicts involving pair renames","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:18Z","receivedAt":"2020-08-10T22:29:36Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nMuch like the last commit accepted 'add/add' and 'rename/add'\ninterchangably, we also want to do the same for 'add/add' and\n'rename/rename'.  This also allows us to avoid the ambiguity in meaning\nwith 'rename/rename' (is it two separate files renamed to the same\nlocation, or one file renamed on both sides but differently)?\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6422-merge-rename-corner-cases.sh | 18 ++++++++++++------\n t/t6423-merge-rename-directories.sh  |  4 ++--\n 2 files changed, 14 insertions(+), 8 deletions(-)\n\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex f3929b65c0..3375eaf4e7 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -583,7 +583,7 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '\n \t\tgit checkout B^0 &&\n \n \t\ttest_must_fail git merge -s recursive C^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (\\(.*\\)/\\1)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 2 out &&\n@@ -959,11 +959,17 @@ test_expect_failure 'rrdd-check: rename/rename(2to1)/delete/delete conflict' '\n \t\tgit checkout A^0 &&\n \t\ttest_must_fail git merge -s recursive B^0 >out 2>err &&\n \n-\t\t# Not sure whether the output should contain just one\n-\t\t# \"CONFLICT (rename/rename/delete/delete)\" line, or if it\n-\t\t# should break it into three: \"CONFLICT (rename/rename)\" and\n-\t\t# two \"CONFLICT (rename/delete)\" lines; allow for either.\n-\t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n+\t\t# Instead of requiring the output to contain one combined line\n+\t\t#   CONFLICT (rename/rename/delete/delete)\n+\t\t# or perhaps two lines:\n+\t\t#   CONFLICT (rename/rename): ...\n+\t\t#   CONFLICT (rename/delete): info about pair 1\n+\t\t#   CONFLICT (rename/delete): info about pair 2\n+\t\t# and instead of requiring \"rename/rename\" instead of \"add/add\",\n+\t\t# be flexible in the type of console output message(s) reported\n+\t\t# for this particular case; we will be more stringent about the\n+\t\t# contents of the index and working directory.\n+\t\ttest_i18ngrep \"CONFLICT (\\(.*\\)/\\1)\" out &&\n \t\ttest_i18ngrep \"CONFLICT (rename.*delete)\" out &&\n \t\ttest_must_be_empty err &&\n \ndiff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nindex 2b4a482277..f7ecbb886d 100755\n--- a/t/t6423-merge-rename-directories.sh\n+++ b/t/t6423-merge-rename-directories.sh\n@@ -275,7 +275,7 @@ test_expect_success '1d: Directory renames cause a rename/rename(2to1) conflict'\n \t\tgit checkout A^0 &&\n \n \t\ttest_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (\\(.*\\)/\\1)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 8 out &&\n@@ -1686,7 +1686,7 @@ test_expect_success '7b: rename/rename(2to1), but only due to transitive rename'\n \t\tgit checkout A^0 &&\n \n \t\ttest_must_fail git -c merge.directoryRenames=true merge -s recursive B^0 >out &&\n-\t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n+\t\ttest_i18ngrep \"CONFLICT (\\(.*\\)/\\1)\" out &&\n \n \t\tgit ls-files -s >out &&\n \t\ttest_line_count = 4 out &&\n-- \ngitgitgadget\n\n"},{"id":"403319","messageId":"b35b61007e0184b8579c79bcc55ccf7a3964260a.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 02/11] t6418: tighten delete/normalize conflict testcase","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:10Z","receivedAt":"2020-08-10T22:29:36Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nThe testcase only required that the merge complete without conflict,\nwithout specifying what the correct resolution was.  Since normalization\nchanged this from a modify/delete to a not-modified/delete, the correct\nresolution is to have the file be removed at the end.  Add a check for\nthis resolution.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6418-merge-text-auto.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t6418-merge-text-auto.sh b/t/t6418-merge-text-auto.sh\nindex 89c86d4e56..30983d18b1 100755\n--- a/t/t6418-merge-text-auto.sh\n+++ b/t/t6418-merge-text-auto.sh\n@@ -197,7 +197,8 @@ test_expect_success 'Test delete/normalize conflict' '\n \tgit commit -m \"remove file\" &&\n \tgit checkout master &&\n \tgit reset --hard a^ &&\n-\tgit merge side\n+\tgit merge side &&\n+\ttest_path_is_missing file\n '\n \n test_done\n-- \ngitgitgadget\n\n"},{"id":"403320","messageId":"0c8dcbf01cc7bb78f62291b645d56d344b24e5fd.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 11/11] t6425: be more flexible with rename/delete conflict messages","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:19Z","receivedAt":"2020-08-10T22:29:37Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nt6425 was very picky about the exact output message produced by a\nrename/delete conflict, in a way that just scratches the surface of the\nmess that was built into merge-recursive.  The idea was that it would\ntry to find the possible combinations of different conflict types, and\nwhen more than one was present for one path, it would try to provide a\ncombined message that covered all the cases.\n\nThere's a lot to unravel here...\n\nFirst, there's a basic conflict type known as modify/delete, which is a\ncontent conflict.  It occurs when one side deletes a file, but the other\nmodifies it.\n\nThere is also a path conflict known as a rename/delete.  This occurs\nwhen one side deletes a path, and the other renames it.  This is not a\ncontent conflict, it is a path conflict.  It will often occur in\ncombination with a content conflict, though, namely a modify/delete.  As\nsuch, these two were often combined.\n\nAnother type of conflict that can exist is a directory/file conflict.\nFor example, one side adds a new file at some path, and the other side\nof history adds a directory at the same path.  The path that was \"added\"\ncould have been put there by a rename, though.  Thus, we have the\npossibility of a single path being affected by a modify/delete, a\nrename/delete, and a directory/file conflict.\n\nIn part, this was a natural by-product of merge-recursive's design.\nSince it was doing a four way merge with the contents of the working\ntree being the fourth factor it had to consider, it had working tree\nhandling spread all over the code.  It also had directory/file conflict\nhandling spread everywhere through all the other types of conflicts.\nAnd our testsuite has a huge number of directory/file conflict tests\nbecause trying to get them right required modifying so many different\ncodepaths.  A natural outgrowth of this kind of structure is conflict\nmessages that combine all the different types that the current codepath\nis considering.\n\nHowever, if we want to make the different conflict types orthogonal and\navoid repeating ourselves and getting very brittle code, then we need to\nsplit the messages from these different conflict types apart.  Besides,\ntrying to determine all possible permutations is a _royal_ mess.  The\ncode to handle the rename/delete/directory/file conflict output is\nalready somewhat hard to parse, and is somewhat brittle.  But if we\nreally wanted to go that route, then we'd have to have special handling\nfor the following types of combinations:\n  * rename/add/delete:\n      on side of history that didn't rename the given file, remove the file\n      instead and place an unrelated file in the way of the rename\n  * rename/rename(2to1)/mode conflict/delete/delete:\n      two different files, one executable and the other not, are renamed\n      to the same location, each side deletes the source file that the\n      other side renames\n  * rename/rename(1to2)/add/add:\n      file renamed differently on each side of history, with each side\n      placing an unrelated file in the way of the other\n  * rename/rename(1to2)/content conflict/file location/(D/F)/(D/F)/:\n      both sides modify a file in conflicting way, both rename that file\n      but to different paths, one side renames the directory which the\n      other side had renamed that file into causing it to possibly need a\n      transitive rename, and each side puts a directory in the way of the\n      other's path.\n\nLet's back away from this path of insanity, and allow the different\ntypes of conflicts to be handled by separate pieces of non-repeated code\nby allowing the conflict messages to be split into their separate types.\n(If multiple conflict types affect a single path, the conflict messages\ncan be printed sequentially.)  Start this path with a simple change:\nmodify this test to be more flexible and accept the output either merge\nbackend (recursive or the new ort) will produce.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6425-merge-rename-delete.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t6425-merge-rename-delete.sh b/t/t6425-merge-rename-delete.sh\nindex 5d33577d2f..f79d021590 100755\n--- a/t/t6425-merge-rename-delete.sh\n+++ b/t/t6425-merge-rename-delete.sh\n@@ -17,7 +17,8 @@ test_expect_success 'rename/delete' '\n \tgit commit -m \"delete\" &&\n \n \ttest_must_fail git merge --strategy=recursive rename >output &&\n-\ttest_i18ngrep \"CONFLICT (rename/delete): A deleted in HEAD and renamed to B in rename. Version rename of B left in tree.\" output\n+\ttest_i18ngrep \"CONFLICT (rename/delete): A.* renamed .*to B.* in rename\" output &&\n+\ttest_i18ngrep \"CONFLICT (rename/delete): A.*deleted in HEAD.\" output\n '\n \n test_done\n-- \ngitgitgadget\n"},{"id":"403321","messageId":"d35d4b192245e30b96a08f6ce970ee1f4cff5ddf.1597098559.git.gitgitgadget@gmail.com","threadId":"53992","inReplyTo":"pull.827.v3.git.git.1597098559.gitgitgadget@gmail.com","subject":"[PATCH v3 03/11] t6422: fix bad check against missing file","fromName":"Elijah Newren via GitGitGadget","fromEmail":"gitgitgadget@gmail.com","sentAt":"2020-08-10T22:29:11Z","receivedAt":"2020-08-10T22:29:38Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6422-merge-rename-corner-cases.sh | 6 +++---\n 1 file changed, 3 insertions(+), 3 deletions(-)\n\ndiff --git a/t/t6422-merge-rename-corner-cases.sh b/t/t6422-merge-rename-corner-cases.sh\nindex f163893ff9..7da75c1736 100755\n--- a/t/t6422-merge-rename-corner-cases.sh\n+++ b/t/t6422-merge-rename-corner-cases.sh\n@@ -906,7 +906,7 @@ test_expect_failure 'rad-check: rename/add/delete conflict' '\n \t\tgit rev-parse >expect \\\n \t\t\tB:bar  A:bar  &&\n \n-\t\ttest_cmp file_is_missing foo &&\n+\t\ttest_path_is_missing foo &&\n \t\t# bar should have two-way merged contents of the different\n \t\t# versions of bar; check that content from both sides is\n \t\t# present.\n@@ -974,8 +974,8 @@ test_expect_failure 'rrdd-check: rename/rename(2to1)/delete/delete conflict' '\n \t\tgit rev-parse >expect \\\n \t\t\tO:foo  O:bar  &&\n \n-\t\ttest_cmp file_is_missing foo &&\n-\t\ttest_cmp file_is_missing bar &&\n+\t\ttest_path_is_missing foo &&\n+\t\ttest_path_is_missing bar &&\n \t\t# baz should have two-way merged contents of the original\n \t\t# contents of foo and bar; check that content from both sides\n \t\t# is present.\n-- \ngitgitgadget\n\n"}]}