git-am: add am.threeWay config variable

Add the am.threeWay configuration variable to use the -3 or --3way option of git am by default. When am.threeway is set and not desired for a specific git am command, the --no-3way option can be used to override it. Signed-off-by: Remi Lespinet <remi.lespinet@ensimag.grenoble-inp.fr> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Remi Lespinet committed Jun 4, 2015 at 17:04 UTC d96a275b91bae1800cd43be0651e886e7e042a17
4 files changed +41 -2
Documentation/config.txt
+8
@@ -761,6 +761,14 @@ am.keepcr::
761 by giving '--no-keep-cr' from the command line.
762 See linkgit:git-am[1], linkgit:git-mailsplit[1].
763
764 +am.threeWay::
765 + By default, `git am` will fail if the patch does not apply cleanly. When
766 + set to true, this setting tells `git am` to fall back on 3-way merge if
767 + the patch records the identity of blobs it is supposed to apply to and
768 + we have those blobs available locally (equivalent to giving the `--3way`
769 + option from the command line). Defaults to `false`.
770 + See linkgit:git-am[1].
771 +
772 apply.ignoreWhitespace::
773 When set to 'change', tells 'git apply' to ignore changes in
774 whitespace, in the same way as the '--ignore-space-change'
Documentation/git-am.txt
+5 -2
@@ -10,7 +10,7 @@ SYNOPSIS
10 --------
11 [verse]
12 'git am' [--signoff] [--keep] [--[no-]keep-cr] [--[no-]utf8]
13 - [--3way] [--interactive] [--committer-date-is-author-date]
13 + [--[no-]3way] [--interactive] [--committer-date-is-author-date]
14 [--ignore-date] [--ignore-space-change | --ignore-whitespace]
15 [--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>]
16 [--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet]
@@ -90,10 +90,13 @@ default. You can use `--no-utf8` to override this.
90
91 -3::
92 --3way::
93 +--no-3way::
94 When the patch does not apply cleanly, fall back on
95 3-way merge if the patch records the identity of blobs
96 it is supposed to apply to and we have those blobs
96 - available locally.
97 + available locally. `--no-3way` can be used to override
98 + am.threeWay configuration variable. For more information,
99 + see am.threeWay in linkgit:git-config[1].
100
101 --ignore-space-change::
102 --ignore-whitespace::
git-am.sh
+9
@@ -390,6 +390,11 @@ then
390 keepcr=t
391 fi
392
393 +if test "$(git config --bool --get am.threeWay)" = true
394 +then
395 + threeway=t
396 +fi
397 +
398 while test $# != 0
399 do
400 case "$1" in
@@ -401,6 +406,8 @@ it will be removed. Please do not use it anymore."
406 ;;
407 -3|--3way)
408 threeway=t ;;
409 + --no-3way)
410 + threeway=f ;;
411 -s|--signoff)
412 sign=t ;;
413 -u|--utf8)
@@ -658,6 +665,8 @@ fi
665 if test "$(cat "$dotest/threeway")" = t
666 then
667 threeway=t
668 +else
669 + threeway=f
670 fi
671 git_apply_opt=$(cat "$dotest/apply-opt")
672 if test "$(cat "$dotest/sign")" = t
t/t4150-am.sh
+19
@@ -303,6 +303,25 @@ test_expect_success 'am -3 -p0 can read --no-prefix patch' '
303 git diff --exit-code lorem
304 '
305
306 +test_expect_success 'am with config am.threeWay falls back to 3-way merge' '
307 + rm -fr .git/rebase-apply &&
308 + git reset --hard &&
309 + git checkout -b lorem4 base3way &&
310 + test_config am.threeWay 1 &&
311 + git am lorem-move.patch &&
312 + test_path_is_missing .git/rebase-apply &&
313 + git diff --exit-code lorem
314 +'
315 +
316 +test_expect_success 'am with config am.threeWay overridden by --no-3way' '
317 + rm -fr .git/rebase-apply &&
318 + git reset --hard &&
319 + git checkout -b lorem5 base3way &&
320 + test_config am.threeWay 1 &&
321 + test_must_fail git am --no-3way lorem-move.patch &&
322 + test_path_is_dir .git/rebase-apply
323 +'
324 +
325 test_expect_success 'am can rename a file' '
326 grep "^rename from" rename.patch &&
327 rm -fr .git/rebase-apply &&