Merge branch 'dl/apply-3way-diff3'

"git apply --3way" learned to honor merge.conflictStyle
configuration variable, like merges would.

* dl/apply-3way-diff3:
  apply: respect merge.conflictStyle in --3way
  t4108: demonstrate bug in apply
  t4108: use `test_config` instead of `git config`
  t4108: remove git command upstream of pipe
  t4108: replace create_file with test_write_lines
This commit is contained in:
Junio C Hamano 2019-11-10 18:02:15 +09:00
commit eff313f8a7
2 changed files with 30 additions and 27 deletions

View File

@ -32,7 +32,7 @@ static void git_apply_config(void)
{ {
git_config_get_string_const("apply.whitespace", &apply_default_whitespace); git_config_get_string_const("apply.whitespace", &apply_default_whitespace);
git_config_get_string_const("apply.ignorewhitespace", &apply_default_ignorewhitespace); git_config_get_string_const("apply.ignorewhitespace", &apply_default_ignorewhitespace);
git_config(git_default_config, NULL); git_config(git_xmerge_config, NULL);
} }
static int parse_whitespace_option(struct apply_state *state, const char *option) static int parse_whitespace_option(struct apply_state *state, const char *option)

View File

@ -4,23 +4,17 @@ test_description='git apply --3way'
. ./test-lib.sh . ./test-lib.sh
create_file () { print_sanitized_conflicted_diff () {
for i git diff HEAD >diff.raw &&
do
echo "$i"
done
}
sanitize_conflicted_diff () {
sed -e ' sed -e '
/^index /d /^index /d
s/^\(+[<>][<>][<>][<>]*\) .*/\1/ s/^\(+[<>|][<>|][<>|][<>|]*\) .*/\1/
' ' diff.raw
} }
test_expect_success setup ' test_expect_success setup '
test_tick && test_tick &&
create_file >one 1 2 3 4 5 6 7 && test_write_lines 1 2 3 4 5 6 7 >one &&
cat one >two && cat one >two &&
git add one two && git add one two &&
git commit -m initial && git commit -m initial &&
@ -28,13 +22,13 @@ test_expect_success setup '
git branch side && git branch side &&
test_tick && test_tick &&
create_file >one 1 two 3 4 5 six 7 && test_write_lines 1 two 3 4 5 six 7 >one &&
create_file >two 1 two 3 4 5 6 7 && test_write_lines 1 two 3 4 5 6 7 >two &&
git commit -a -m master && git commit -a -m master &&
git checkout side && git checkout side &&
create_file >one 1 2 3 4 five 6 7 && test_write_lines 1 2 3 4 five 6 7 >one &&
create_file >two 1 2 3 4 five 6 7 && test_write_lines 1 2 3 4 five 6 7 >two &&
git commit -a -m side && git commit -a -m side &&
git checkout master git checkout master
@ -52,7 +46,7 @@ test_expect_success 'apply without --3way' '
git diff-index --exit-code --cached HEAD git diff-index --exit-code --cached HEAD
' '
test_expect_success 'apply with --3way' ' test_apply_with_3way () {
# Merging side should be similar to applying this patch # Merging side should be similar to applying this patch
git diff ...side >P.diff && git diff ...side >P.diff &&
@ -61,22 +55,31 @@ test_expect_success 'apply with --3way' '
git checkout master^0 && git checkout master^0 &&
test_must_fail git merge --no-commit side && test_must_fail git merge --no-commit side &&
git ls-files -s >expect.ls && git ls-files -s >expect.ls &&
git diff HEAD | sanitize_conflicted_diff >expect.diff && print_sanitized_conflicted_diff >expect.diff &&
# should fail to apply # should fail to apply
git reset --hard && git reset --hard &&
git checkout master^0 && git checkout master^0 &&
test_must_fail git apply --index --3way P.diff && test_must_fail git apply --index --3way P.diff &&
git ls-files -s >actual.ls && git ls-files -s >actual.ls &&
git diff HEAD | sanitize_conflicted_diff >actual.diff && print_sanitized_conflicted_diff >actual.diff &&
# The result should resemble the corresponding merge # The result should resemble the corresponding merge
test_cmp expect.ls actual.ls && test_cmp expect.ls actual.ls &&
test_cmp expect.diff actual.diff test_cmp expect.diff actual.diff
}
test_expect_success 'apply with --3way' '
test_apply_with_3way
'
test_expect_success 'apply with --3way with merge.conflictStyle = diff3' '
test_config merge.conflictStyle diff3 &&
test_apply_with_3way
' '
test_expect_success 'apply with --3way with rerere enabled' ' test_expect_success 'apply with --3way with rerere enabled' '
git config rerere.enabled true && test_config rerere.enabled true &&
# Merging side should be similar to applying this patch # Merging side should be similar to applying this patch
git diff ...side >P.diff && git diff ...side >P.diff &&
@ -87,7 +90,7 @@ test_expect_success 'apply with --3way with rerere enabled' '
test_must_fail git merge --no-commit side && test_must_fail git merge --no-commit side &&
# Manually resolve and record the resolution # Manually resolve and record the resolution
create_file 1 two 3 4 five six 7 >one && test_write_lines 1 two 3 4 five six 7 >one &&
git rerere && git rerere &&
cat one >expect && cat one >expect &&
@ -104,14 +107,14 @@ test_expect_success 'apply -3 with add/add conflict setup' '
git reset --hard && git reset --hard &&
git checkout -b adder && git checkout -b adder &&
create_file 1 2 3 4 5 6 7 >three && test_write_lines 1 2 3 4 5 6 7 >three &&
create_file 1 2 3 4 5 6 7 >four && test_write_lines 1 2 3 4 5 6 7 >four &&
git add three four && git add three four &&
git commit -m "add three and four" && git commit -m "add three and four" &&
git checkout -b another adder^ && git checkout -b another adder^ &&
create_file 1 2 3 4 5 6 7 >three && test_write_lines 1 2 3 4 5 6 7 >three &&
create_file 1 2 3 four 5 6 7 >four && test_write_lines 1 2 3 four 5 6 7 >four &&
git add three four && git add three four &&
git commit -m "add three and four" && git commit -m "add three and four" &&
@ -121,7 +124,7 @@ test_expect_success 'apply -3 with add/add conflict setup' '
git checkout adder^0 && git checkout adder^0 &&
test_must_fail git merge --no-commit another && test_must_fail git merge --no-commit another &&
git ls-files -s >expect.ls && git ls-files -s >expect.ls &&
git diff HEAD | sanitize_conflicted_diff >expect.diff print_sanitized_conflicted_diff >expect.diff
' '
test_expect_success 'apply -3 with add/add conflict' ' test_expect_success 'apply -3 with add/add conflict' '
@ -131,7 +134,7 @@ test_expect_success 'apply -3 with add/add conflict' '
test_must_fail git apply --index --3way P.diff && test_must_fail git apply --index --3way P.diff &&
# ... and leave conflicts in the index and in the working tree # ... and leave conflicts in the index and in the working tree
git ls-files -s >actual.ls && git ls-files -s >actual.ls &&
git diff HEAD | sanitize_conflicted_diff >actual.diff && print_sanitized_conflicted_diff >actual.diff &&
# The result should resemble the corresponding merge # The result should resemble the corresponding merge
test_cmp expect.ls actual.ls && test_cmp expect.ls actual.ls &&