rebase.c: honour --no-gpg-sign
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Đoàn Trần Công Danh committed
Apr 3, 2020 at 17:28 UTC
c241371c0445cee7116e36bbacb5b35069a81e64
3 files changed
+79
-4
Documentation/git-rebase.txt
+4
-1
@@ -354,9 +354,12 @@ See also INCOMPATIBLE OPTIONS below.
354
355
-S[<keyid>]::
356
--gpg-sign[=<keyid>]::
357
+--no-gpg-sign::
358
GPG-sign commits. The `keyid` argument is optional and
359
defaults to the committer identity; if specified, it must be
359
- stuck to the option without a space.
360
+ stuck to the option without a space. `--no-gpg-sign` is useful to
361
+ countermand both `commit.gpgSign` configuration variable, and
362
+ earlier `--gpg-sign`.
363
364
-q::
365
--quiet::
builtin/rebase.c
+4
-3
@@ -1592,6 +1592,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
1592
1593
options.allow_empty_message = 1;
1594
git_config(rebase_config, &options);
1595
+ /* options.gpg_sign_opt will be either "-S" or NULL */
1596
+ gpg_sign = options.gpg_sign_opt ? "" : NULL;
1597
+ FREE_AND_NULL(options.gpg_sign_opt);
1598
1599
if (options.use_legacy_rebase ||
1600
!git_env_bool("GIT_TEST_REBASE_USE_BUILTIN", -1))
@@ -1822,10 +1825,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
1825
if (options.empty != EMPTY_UNSPECIFIED)
1826
imply_merge(&options, "--empty");
1827
1825
- if (gpg_sign) {
1826
- free(options.gpg_sign_opt);
1828
+ if (gpg_sign)
1829
options.gpg_sign_opt = xstrfmt("-S%s", gpg_sign);
1828
- }
1830
1831
if (exec.nr) {
1832
int i;
t/t3435-rebase-gpg-sign.sh
new
+71
@@ -0,0 +1,71 @@
1
+#!/bin/sh
2
+#
3
+# Copyright (c) 2020 Doan Tran Cong Danh
4
+#
5
+
6
+test_description='test rebase --[no-]gpg-sign'
7
+
8
+. ./test-lib.sh
9
+. "$TEST_DIRECTORY/lib-rebase.sh"
10
+. "$TEST_DIRECTORY/lib-gpg.sh"
11
+
12
+if ! test_have_prereq GPG
13
+then
14
+ skip_all='skip all test rebase --[no-]gpg-sign, gpg not available'
15
+ test_done
16
+fi
17
+
18
+test_rebase_gpg_sign () {
19
+ local must_fail= will=will fake_editor=
20
+ if test "x$1" = "x!"
21
+ then
22
+ must_fail=test_must_fail
23
+ will="won't"
24
+ shift
25
+ fi
26
+ conf=$1
27
+ shift
28
+ test_expect_success "rebase $* with commit.gpgsign=$conf $will sign commit" "
29
+ git reset two &&
30
+ git config commit.gpgsign $conf &&
31
+ set_fake_editor &&
32
+ FAKE_LINES='r 1 p 2' git rebase --force-rebase --root $* &&
33
+ $must_fail git verify-commit HEAD^ &&
34
+ $must_fail git verify-commit HEAD
35
+ "
36
+}
37
+
38
+test_expect_success 'setup' '
39
+ test_commit one &&
40
+ test_commit two &&
41
+ test_must_fail git verify-commit HEAD &&
42
+ test_must_fail git verify-commit HEAD^
43
+'
44
+
45
+test_expect_success 'setup: merge commit' '
46
+ test_commit fork-point &&
47
+ git switch -c side &&
48
+ test_commit three &&
49
+ git switch master &&
50
+ git merge --no-ff side &&
51
+ git tag merged
52
+'
53
+
54
+test_rebase_gpg_sign ! false
55
+test_rebase_gpg_sign true
56
+test_rebase_gpg_sign ! true --no-gpg-sign
57
+test_rebase_gpg_sign ! true --gpg-sign --no-gpg-sign
58
+test_rebase_gpg_sign false --no-gpg-sign --gpg-sign
59
+test_rebase_gpg_sign true -i
60
+test_rebase_gpg_sign ! true -i --no-gpg-sign
61
+test_rebase_gpg_sign ! true -i --gpg-sign --no-gpg-sign
62
+test_rebase_gpg_sign false -i --no-gpg-sign --gpg-sign
63
+
64
+test_expect_failure 'rebase -p --no-gpg-sign override commit.gpgsign' '
65
+ git reset --hard merged &&
66
+ git config commit.gpgsign true &&
67
+ git rebase -p --no-gpg-sign --onto=one fork-point master &&
68
+ test_must_fail git verify-commit HEAD
69
+'
70
+
71
+test_done