@matheusbsbs / matheus-bagliano / commits / 2a7c16c980
Fork 0

t6422, t6426: be more flexible for add/add conflicts involving renames

merge-recursive treats an add/add conflict where one of the adds came from a rename as a separate 'rename/add' type of conflict. However, if there is not content conflict after the content merge(s), then the file is not considered to be conflicted. That suggests the conflict type is really just add/add. Other merge engines might choose to print messages to the console that just refer to these as add/add conflicts; accept both types of output. Note: it could help to notify users if the three-way content merge of the rename had content conflicts, because when we then go to two-way merge THAT with the conflicting add we can get nested conflict markers. merge-recursive, unfortunately, doesn't do that, but other merge engines could. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Elijah Newren committed Aug 10, 2020 at 22:29 UTC 2a7c16c9802b25de3497f60b2f3776d1a02477bb
2 files changed +14 -9
t/t6422-merge-rename-corner-cases.sh
+13 -8
@@ -457,7 +457,7 @@ test_expect_success 'handle rename-with-content-merge vs. add' '
457 git checkout A^0 &&
458
459 test_must_fail git merge -s recursive B^0 >out &&
460 - test_i18ngrep "CONFLICT (rename/add)" out &&
460 + test_i18ngrep "CONFLICT (.*/add)" out &&
461
462 git ls-files -s >out &&
463 test_line_count = 2 out &&
@@ -503,7 +503,7 @@ test_expect_success 'handle rename-with-content-merge vs. add, merge other way'
503 git checkout B^0 &&
504
505 test_must_fail git merge -s recursive A^0 >out &&
506 - test_i18ngrep "CONFLICT (rename/add)" out &&
506 + test_i18ngrep "CONFLICT (.*/add)" out &&
507
508 git ls-files -s >out &&
509 test_line_count = 2 out &&
@@ -886,12 +886,17 @@ test_expect_failure 'rad-check: rename/add/delete conflict' '
886 git checkout B^0 &&
887 test_must_fail git merge -s recursive A^0 >out 2>err &&
888
889 - # Not sure whether the output should contain just one
890 - # "CONFLICT (rename/add/delete)" line, or if it should break
891 - # it into a pair of "CONFLICT (rename/delete)" and
892 - # "CONFLICT (rename/add)"; allow for either.
893 - test_i18ngrep "CONFLICT (rename.*add)" out &&
894 - test_i18ngrep "CONFLICT (rename.*delete)" out &&
889 + # Instead of requiring the output to contain one combined line
890 + # CONFLICT (rename/add/delete)
891 + # or perhaps two lines:
892 + # CONFLICT (rename/add): new file collides with rename target
893 + # CONFLICT (rename/delete): rename source removed on other side
894 + # and instead of requiring "rename/add" instead of "add/add",
895 + # be flexible in the type of console output message(s) reported
896 + # for this particular case; we will be more stringent about the
897 + # contents of the index and working directory.
898 + test_i18ngrep "CONFLICT (.*/add)" out &&
899 + test_i18ngrep "CONFLICT (rename.*/delete)" out &&
900 test_must_be_empty err &&
901
902 git ls-files -s >file_count &&
t/t6426-merge-skip-unneeded-updates.sh
+1 -1
@@ -374,7 +374,7 @@ test_expect_success '2c: Modify b & add c VS rename b->c' '
374 export GIT_MERGE_VERBOSITY &&
375 test_must_fail git merge -s recursive B^0 >out 2>err &&
376
377 - test_i18ngrep "CONFLICT (rename/add): Rename b->c" out &&
377 + test_i18ngrep "CONFLICT (.*/add):" out &&
378 test_must_be_empty err &&
379
380 # Make sure c WAS updated