1
+#!/bin/sh
2
+
3
+test_description='git fast-import --signed-commits=<mode>'
4
+
5
+GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6
+
7
+. ./test-lib.sh
8
+. "$TEST_DIRECTORY/lib-gpg.sh"
9
+
10
+test_expect_success 'set up unsigned initial commit and import repo' '
11
+ test_commit first &&
12
+ git init new
13
+'
14
+
15
+test_expect_success GPG 'set up OpenPGP signed commit' '
16
+ git checkout -b openpgp-signing main &&
17
+ echo "Content for OpenPGP signing." >file-sign &&
18
+ git add file-sign &&
19
+ git commit -S -m "OpenPGP signed commit" &&
20
+ OPENPGP_SIGNING=$(git rev-parse --verify openpgp-signing)
21
+'
22
+
23
+test_expect_success GPG 'import OpenPGP signature with --signed-commits=verbatim' '
24
+ git fast-export --signed-commits=verbatim openpgp-signing >output &&
25
+ git -C new fast-import --quiet --signed-commits=verbatim <output >log 2>&1 &&
26
+ IMPORTED=$(git -C new rev-parse --verify refs/heads/openpgp-signing) &&
27
+ test $OPENPGP_SIGNING = $IMPORTED &&
28
+ test_must_be_empty log
29
+'
30
+
31
+test_expect_success GPGSM 'set up X.509 signed commit' '
32
+ git checkout -b x509-signing main &&
33
+ test_config gpg.format x509 &&
34
+ test_config user.signingkey $GIT_COMMITTER_EMAIL &&
35
+ echo "Content for X.509 signing." >file-sign &&
36
+ git add file-sign &&
37
+ git commit -S -m "X.509 signed commit" &&
38
+ X509_SIGNING=$(git rev-parse HEAD)
39
+'
40
+
41
+test_expect_success GPGSM 'import X.509 signature fails with --signed-commits=abort' '
42
+ git fast-export --signed-commits=verbatim x509-signing >output &&
43
+ test_must_fail git -C new fast-import --quiet --signed-commits=abort <output
44
+'
45
+
46
+test_expect_success GPGSM 'import X.509 signature with --signed-commits=warn-verbatim' '
47
+ git -C new fast-import --quiet --signed-commits=warn-verbatim <output >log 2>&1 &&
48
+ IMPORTED=$(git -C new rev-parse --verify refs/heads/x509-signing) &&
49
+ test $X509_SIGNING = $IMPORTED &&
50
+ test_grep "importing a commit signature" log
51
+'
52
+
53
+test_expect_success GPGSSH 'set up SSH signed commit' '
54
+ git checkout -b ssh-signing main &&
55
+ test_config gpg.format ssh &&
56
+ test_config user.signingkey "${GPGSSH_KEY_PRIMARY}" &&
57
+ echo "Content for SSH signing." >file-sign &&
58
+ git add file-sign &&
59
+ git commit -S -m "SSH signed commit" &&
60
+ SSH_SIGNING=$(git rev-parse HEAD)
61
+'
62
+
63
+test_expect_success GPGSSH 'strip SSH signature with --signed-commits=strip' '
64
+ git fast-export --signed-commits=verbatim ssh-signing >output &&
65
+ git -C new fast-import --quiet --signed-commits=strip <output >log 2>&1 &&
66
+ IMPORTED=$(git -C new rev-parse --verify refs/heads/ssh-signing) &&
67
+ test $SSH_SIGNING != $IMPORTED &&
68
+ git -C new cat-file commit "$IMPORTED" >actual &&
69
+ test_grep ! -E "^gpgsig" actual &&
70
+ test_must_be_empty log
71
+'
72
+
73
+test_expect_success GPG 'setup a commit with dual OpenPGP signatures on its SHA-1 and SHA-256 formats' '
74
+ # Create a signed SHA-256 commit
75
+ git init --object-format=sha256 explicit-sha256 &&
76
+ git -C explicit-sha256 config extensions.compatObjectFormat sha1 &&
77
+ git -C explicit-sha256 checkout -b dual-signed &&
78
+ test_commit -C explicit-sha256 A &&
79
+ echo B >explicit-sha256/B &&
80
+ git -C explicit-sha256 add B &&
81
+ test_tick &&
82
+ git -C explicit-sha256 commit -S -m "signed" B &&
83
+ SHA256_B=$(git -C explicit-sha256 rev-parse dual-signed) &&
84
+
85
+ # Create the corresponding SHA-1 commit
86
+ SHA1_B=$(git -C explicit-sha256 rev-parse --output-object-format=sha1 dual-signed) &&
87
+
88
+ # Check that the resulting SHA-1 commit has both signatures
89
+ git -C explicit-sha256 cat-file -p $SHA1_B >out &&
90
+ test_grep -E "^gpgsig " out &&
91
+ test_grep -E "^gpgsig-sha256 " out
92
+'
93
+
94
+test_expect_success GPG 'strip both OpenPGP signatures with --signed-commits=warn-strip' '
95
+ git -C explicit-sha256 fast-export --signed-commits=verbatim dual-signed >output &&
96
+ test_grep -E "^gpgsig sha1 openpgp" output &&
97
+ test_grep -E "^gpgsig sha256 openpgp" output &&
98
+ git -C new fast-import --quiet --signed-commits=warn-strip <output >log 2>&1 &&
99
+ git -C new cat-file commit refs/heads/dual-signed >actual &&
100
+ test_grep ! -E "^gpgsig " actual &&
101
+ test_grep ! -E "^gpgsig-sha256 " actual &&
102
+ test_grep "stripping a commit signature" log >out &&
103
+ test_line_count = 2 out
104
+'
105
+
106
+test_done