Merge branch 'maint'
[git] / t / t3511-cherry-pick-x.sh
1 #!/bin/sh
2
3 test_description='Test cherry-pick -x and -s'
4
5 . ./test-lib.sh
6
7 pristine_detach () {
8         git cherry-pick --quit &&
9         git checkout -f "$1^0" &&
10         git read-tree -u --reset HEAD &&
11         git clean -d -f -f -q -x
12 }
13
14 mesg_one_line='base: commit message'
15
16 mesg_no_footer="$mesg_one_line
17
18 OneWordBodyThatsNotA-S-o-B"
19
20 mesg_with_footer="$mesg_no_footer
21
22 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
23 Signed-off-by: A.U. Thor <author@example.com>
24 Signed-off-by: B.U. Thor <buthor@example.com>"
25
26 mesg_broken_footer="$mesg_no_footer
27
28 The signed-off-by string should begin with the words Signed-off-by followed
29 by a colon and space, and then the signers name and email address. e.g.
30 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
31
32 mesg_with_footer_sob="$mesg_with_footer
33 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
34
35 mesg_with_cherry_footer="$mesg_with_footer_sob
36 (cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709)
37 Tested-by: C.U. Thor <cuthor@example.com>"
38
39
40 test_expect_success setup '
41         git config advice.detachedhead false &&
42         echo unrelated >unrelated &&
43         git add unrelated &&
44         test_commit initial foo a &&
45         test_commit "$mesg_one_line" foo b mesg-one-line &&
46         git reset --hard initial &&
47         test_commit "$mesg_no_footer" foo b mesg-no-footer &&
48         git reset --hard initial &&
49         test_commit "$mesg_broken_footer" foo b mesg-broken-footer &&
50         git reset --hard initial &&
51         test_commit "$mesg_with_footer" foo b mesg-with-footer &&
52         git reset --hard initial &&
53         test_commit "$mesg_with_footer_sob" foo b mesg-with-footer-sob &&
54         git reset --hard initial &&
55         test_commit "$mesg_with_cherry_footer" foo b mesg-with-cherry-footer &&
56         pristine_detach initial &&
57         test_commit conflicting unrelated
58 '
59
60 test_expect_success 'cherry-pick -x inserts blank line after one line subject' '
61         pristine_detach initial &&
62         sha1=`git rev-parse mesg-one-line^0` &&
63         git cherry-pick -x mesg-one-line &&
64         cat <<-EOF >expect &&
65                 $mesg_one_line
66
67                 (cherry picked from commit $sha1)
68         EOF
69         git log -1 --pretty=format:%B >actual &&
70         test_cmp expect actual
71 '
72
73 test_expect_success 'cherry-pick -s inserts blank line after one line subject' '
74         pristine_detach initial &&
75         git cherry-pick -s mesg-one-line &&
76         cat <<-EOF >expect &&
77                 $mesg_one_line
78
79                 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
80         EOF
81         git log -1 --pretty=format:%B >actual &&
82         test_cmp expect actual
83 '
84
85 test_expect_success 'cherry-pick -s inserts blank line after non-conforming footer' '
86         pristine_detach initial &&
87         git cherry-pick -s mesg-broken-footer &&
88         cat <<-EOF >expect &&
89                 $mesg_broken_footer
90
91                 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
92         EOF
93         git log -1 --pretty=format:%B >actual &&
94         test_cmp expect actual
95 '
96
97 test_expect_success 'cherry-pick -x inserts blank line when conforming footer not found' '
98         pristine_detach initial &&
99         sha1=`git rev-parse mesg-no-footer^0` &&
100         git cherry-pick -x mesg-no-footer &&
101         cat <<-EOF >expect &&
102                 $mesg_no_footer
103
104                 (cherry picked from commit $sha1)
105         EOF
106         git log -1 --pretty=format:%B >actual &&
107         test_cmp expect actual
108 '
109
110 test_expect_success 'cherry-pick -s inserts blank line when conforming footer not found' '
111         pristine_detach initial &&
112         git cherry-pick -s mesg-no-footer &&
113         cat <<-EOF >expect &&
114                 $mesg_no_footer
115
116                 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
117         EOF
118         git log -1 --pretty=format:%B >actual &&
119         test_cmp expect actual
120 '
121
122 test_expect_success 'cherry-pick -x -s inserts blank line when conforming footer not found' '
123         pristine_detach initial &&
124         sha1=`git rev-parse mesg-no-footer^0` &&
125         git cherry-pick -x -s mesg-no-footer &&
126         cat <<-EOF >expect &&
127                 $mesg_no_footer
128
129                 (cherry picked from commit $sha1)
130                 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
131         EOF
132         git log -1 --pretty=format:%B >actual &&
133         test_cmp expect actual
134 '
135
136 test_expect_success 'cherry-pick -s adds sob when last sob doesnt match committer' '
137         pristine_detach initial &&
138         git cherry-pick -s mesg-with-footer &&
139         cat <<-EOF >expect &&
140                 $mesg_with_footer
141                 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
142         EOF
143         git log -1 --pretty=format:%B >actual &&
144         test_cmp expect actual
145 '
146
147 test_expect_success 'cherry-pick -x -s adds sob when last sob doesnt match committer' '
148         pristine_detach initial &&
149         sha1=`git rev-parse mesg-with-footer^0` &&
150         git cherry-pick -x -s mesg-with-footer &&
151         cat <<-EOF >expect &&
152                 $mesg_with_footer
153                 (cherry picked from commit $sha1)
154                 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
155         EOF
156         git log -1 --pretty=format:%B >actual &&
157         test_cmp expect actual
158 '
159
160 test_expect_success 'cherry-pick -s refrains from adding duplicate trailing sob' '
161         pristine_detach initial &&
162         git cherry-pick -s mesg-with-footer-sob &&
163         cat <<-EOF >expect &&
164                 $mesg_with_footer_sob
165         EOF
166         git log -1 --pretty=format:%B >actual &&
167         test_cmp expect actual
168 '
169
170 test_expect_success 'cherry-pick -x -s adds sob even when trailing sob exists for committer' '
171         pristine_detach initial &&
172         sha1=`git rev-parse mesg-with-footer-sob^0` &&
173         git cherry-pick -x -s mesg-with-footer-sob &&
174         cat <<-EOF >expect &&
175                 $mesg_with_footer_sob
176                 (cherry picked from commit $sha1)
177                 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
178         EOF
179         git log -1 --pretty=format:%B >actual &&
180         test_cmp expect actual
181 '
182
183 test_expect_success 'cherry-pick -x treats "(cherry picked from..." line as part of footer' '
184         pristine_detach initial &&
185         sha1=`git rev-parse mesg-with-cherry-footer^0` &&
186         git cherry-pick -x mesg-with-cherry-footer &&
187         cat <<-EOF >expect &&
188                 $mesg_with_cherry_footer
189                 (cherry picked from commit $sha1)
190         EOF
191         git log -1 --pretty=format:%B >actual &&
192         test_cmp expect actual
193 '
194
195 test_expect_success 'cherry-pick -s treats "(cherry picked from..." line as part of footer' '
196         pristine_detach initial &&
197         git cherry-pick -s mesg-with-cherry-footer &&
198         cat <<-EOF >expect &&
199                 $mesg_with_cherry_footer
200                 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
201         EOF
202         git log -1 --pretty=format:%B >actual &&
203         test_cmp expect actual
204 '
205
206 test_expect_success 'cherry-pick -x -s treats "(cherry picked from..." line as part of footer' '
207         pristine_detach initial &&
208         sha1=`git rev-parse mesg-with-cherry-footer^0` &&
209         git cherry-pick -x -s mesg-with-cherry-footer &&
210         cat <<-EOF >expect &&
211                 $mesg_with_cherry_footer
212                 (cherry picked from commit $sha1)
213                 Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
214         EOF
215         git log -1 --pretty=format:%B >actual &&
216         test_cmp expect actual
217 '
218
219 test_done