git-am: add am.threeWay config variable
authorRemi Lespinet <remi.lespinet@ensimag.grenoble-inp.fr>
Thu, 4 Jun 2015 15:04:55 +0000 (17:04 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 4 Jun 2015 17:42:41 +0000 (10:42 -0700)
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>
Documentation/config.txt
Documentation/git-am.txt
git-am.sh
t/t4150-am.sh
index 2e5ceaf71974b1e5404de79103648da1829eaf42..77ada666f7e1f32259b717f1b230ed626edec877 100644 (file)
@@ -761,6 +761,14 @@ am.keepcr::
        by giving '--no-keep-cr' from the command line.
        See linkgit:git-am[1], linkgit:git-mailsplit[1].
 
+am.threeWay::
+       By default, `git am` will fail if the patch does not apply cleanly. When
+       set to true, this setting tells `git am` to fall back on 3-way merge if
+       the patch records the identity of blobs it is supposed to apply to and
+       we have those blobs available locally (equivalent to giving the `--3way`
+       option from the command line). Defaults to `false`.
+       See linkgit:git-am[1].
+
 apply.ignoreWhitespace::
        When set to 'change', tells 'git apply' to ignore changes in
        whitespace, in the same way as the '--ignore-space-change'
index 0d8ba48f792ae82237a56aa0dd2aca03f4e16020..dbea6e7ae9131a1e5c51dec460d58cc6deda701b 100644 (file)
@@ -10,7 +10,7 @@ SYNOPSIS
 --------
 [verse]
 'git am' [--signoff] [--keep] [--[no-]keep-cr] [--[no-]utf8]
-        [--3way] [--interactive] [--committer-date-is-author-date]
+        [--[no-]3way] [--interactive] [--committer-date-is-author-date]
         [--ignore-date] [--ignore-space-change | --ignore-whitespace]
         [--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>]
         [--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet]
@@ -90,10 +90,13 @@ default.   You can use `--no-utf8` to override this.
 
 -3::
 --3way::
+--no-3way::
        When the patch does not apply cleanly, fall back on
        3-way merge if the patch records the identity of blobs
        it is supposed to apply to and we have those blobs
-       available locally.
+       available locally. `--no-3way` can be used to override
+       am.threeWay configuration variable. For more information,
+       see am.threeWay in linkgit:git-config[1].
 
 --ignore-space-change::
 --ignore-whitespace::
index 4696998d4e4bd8f2355008cd35cf85600521d60b..ab8479eb45a692855a04c2fffb81bac2b2f8e60d 100755 (executable)
--- a/git-am.sh
+++ b/git-am.sh
@@ -390,6 +390,11 @@ then
     keepcr=t
 fi
 
+if test "$(git config --bool --get am.threeWay)" = true
+then
+    threeway=t
+fi
+
 while test $# != 0
 do
        case "$1" in
@@ -401,6 +406,8 @@ it will be removed. Please do not use it anymore."
                ;;
        -3|--3way)
                threeway=t ;;
+       --no-3way)
+               threeway=f ;;
        -s|--signoff)
                sign=t ;;
        -u|--utf8)
@@ -658,6 +665,8 @@ fi
 if test "$(cat "$dotest/threeway")" = t
 then
        threeway=t
+else
+       threeway=f
 fi
 git_apply_opt=$(cat "$dotest/apply-opt")
 if test "$(cat "$dotest/sign")" = t
index 6ced98cfb4a71553d66a828118a585e0f7fc84c7..b822a3918d32ca57afb7d6585ac927b55b22bde9 100755 (executable)
@@ -303,6 +303,25 @@ test_expect_success 'am -3 -p0 can read --no-prefix patch' '
        git diff --exit-code lorem
 '
 
+test_expect_success 'am with config am.threeWay falls back to 3-way merge' '
+       rm -fr .git/rebase-apply &&
+       git reset --hard &&
+       git checkout -b lorem4 base3way &&
+       test_config am.threeWay 1 &&
+       git am lorem-move.patch &&
+       test_path_is_missing .git/rebase-apply &&
+       git diff --exit-code lorem
+'
+
+test_expect_success 'am with config am.threeWay overridden by --no-3way' '
+       rm -fr .git/rebase-apply &&
+       git reset --hard &&
+       git checkout -b lorem5 base3way &&
+       test_config am.threeWay 1 &&
+       test_must_fail git am --no-3way lorem-move.patch &&
+       test_path_is_dir .git/rebase-apply
+'
+
 test_expect_success 'am can rename a file' '
        grep "^rename from" rename.patch &&
        rm -fr .git/rebase-apply &&