]> git.ipfire.org Git - thirdparty/git.git/commitdiff
rebase.c: honour --no-gpg-sign
authorĐoàn Trần Công Danh <congdanhqx@gmail.com>
Fri, 3 Apr 2020 10:28:02 +0000 (17:28 +0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 3 Apr 2020 18:37:22 +0000 (11:37 -0700)
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-rebase.txt
builtin/rebase.c
t/t3435-rebase-gpg-sign.sh [new file with mode: 0755]

index f7a6033607fa558dfd5a0437d7b4327ff1c44c78..19e280f93fd217b001ff3e7d9939f09e2a88bcb1 100644 (file)
@@ -354,9 +354,12 @@ See also INCOMPATIBLE OPTIONS below.
 
 -S[<keyid>]::
 --gpg-sign[=<keyid>]::
+--no-gpg-sign::
        GPG-sign commits. The `keyid` argument is optional and
        defaults to the committer identity; if specified, it must be
-       stuck to the option without a space.
+       stuck to the option without a space. `--no-gpg-sign` is useful to
+       countermand both `commit.gpgSign` configuration variable, and
+       earlier `--gpg-sign`.
 
 -q::
 --quiet::
index bff53d5d167e8501d7f501046ddb35daf0f2cd17..24b88936742c152a41c750bf827c167c9c64b2b1 100644 (file)
@@ -1592,6 +1592,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 
        options.allow_empty_message = 1;
        git_config(rebase_config, &options);
+       /* options.gpg_sign_opt will be either "-S" or NULL */
+       gpg_sign = options.gpg_sign_opt ? "" : NULL;
+       FREE_AND_NULL(options.gpg_sign_opt);
 
        if (options.use_legacy_rebase ||
            !git_env_bool("GIT_TEST_REBASE_USE_BUILTIN", -1))
@@ -1822,10 +1825,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
        if (options.empty != EMPTY_UNSPECIFIED)
                imply_merge(&options, "--empty");
 
-       if (gpg_sign) {
-               free(options.gpg_sign_opt);
+       if (gpg_sign)
                options.gpg_sign_opt = xstrfmt("-S%s", gpg_sign);
-       }
 
        if (exec.nr) {
                int i;
diff --git a/t/t3435-rebase-gpg-sign.sh b/t/t3435-rebase-gpg-sign.sh
new file mode 100755 (executable)
index 0000000..b47c59c
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh
+#
+# Copyright (c) 2020 Doan Tran Cong Danh
+#
+
+test_description='test rebase --[no-]gpg-sign'
+
+. ./test-lib.sh
+. "$TEST_DIRECTORY/lib-rebase.sh"
+. "$TEST_DIRECTORY/lib-gpg.sh"
+
+if ! test_have_prereq GPG
+then
+       skip_all='skip all test rebase --[no-]gpg-sign, gpg not available'
+       test_done
+fi
+
+test_rebase_gpg_sign () {
+       local must_fail= will=will fake_editor=
+       if test "x$1" = "x!"
+       then
+               must_fail=test_must_fail
+               will="won't"
+               shift
+       fi
+       conf=$1
+       shift
+       test_expect_success "rebase $* with commit.gpgsign=$conf $will sign commit" "
+               git reset two &&
+               git config commit.gpgsign $conf &&
+               set_fake_editor &&
+               FAKE_LINES='r 1 p 2' git rebase --force-rebase --root $* &&
+               $must_fail git verify-commit HEAD^ &&
+               $must_fail git verify-commit HEAD
+       "
+}
+
+test_expect_success 'setup' '
+       test_commit one &&
+       test_commit two &&
+       test_must_fail git verify-commit HEAD &&
+       test_must_fail git verify-commit HEAD^
+'
+
+test_expect_success 'setup: merge commit' '
+       test_commit fork-point &&
+       git switch -c side &&
+       test_commit three &&
+       git switch master &&
+       git merge --no-ff side &&
+       git tag merged
+'
+
+test_rebase_gpg_sign ! false
+test_rebase_gpg_sign   true
+test_rebase_gpg_sign ! true  --no-gpg-sign
+test_rebase_gpg_sign ! true  --gpg-sign --no-gpg-sign
+test_rebase_gpg_sign   false --no-gpg-sign --gpg-sign
+test_rebase_gpg_sign   true  -i
+test_rebase_gpg_sign ! true  -i --no-gpg-sign
+test_rebase_gpg_sign ! true  -i --gpg-sign --no-gpg-sign
+test_rebase_gpg_sign   false -i --no-gpg-sign --gpg-sign
+
+test_expect_failure 'rebase -p --no-gpg-sign override commit.gpgsign' '
+       git reset --hard merged &&
+       git config commit.gpgsign true &&
+       git rebase -p --no-gpg-sign --onto=one fork-point master &&
+       test_must_fail git verify-commit HEAD
+'
+
+test_done