]>
Commit | Line | Data |
---|---|---|
30c56eaa JN |
1 | #!/bin/sh |
2 | ||
3 | test_description='Test workflows involving pull request.' | |
4 | ||
5 | . ./test-lib.sh | |
6 | ||
13ca8fb7 RA |
7 | if ! test_have_prereq PERL |
8 | then | |
9 | skip_all='skipping request-pull tests, perl not available' | |
10 | test_done | |
11 | fi | |
12 | ||
30c56eaa JN |
13 | test_expect_success 'setup' ' |
14 | ||
15 | git init --bare upstream.git && | |
16 | git init --bare downstream.git && | |
17 | git clone upstream.git upstream-private && | |
18 | git clone downstream.git local && | |
19 | ||
20 | trash_url="file://$TRASH_DIRECTORY" && | |
21 | downstream_url="$trash_url/downstream.git/" && | |
22 | upstream_url="$trash_url/upstream.git/" && | |
23 | ||
24 | ( | |
25 | cd upstream-private && | |
26 | cat <<-\EOT >mnemonic.txt && | |
27 | Thirtey days hath November, | |
28 | Aprile, June, and September: | |
29 | EOT | |
30 | git add mnemonic.txt && | |
31 | test_tick && | |
32 | git commit -m "\"Thirty days\", a reminder of month lengths" && | |
33 | git tag -m "version 1" -a initial && | |
34 | git push --tags origin master | |
35 | ) && | |
36 | ( | |
37 | cd local && | |
38 | git remote add upstream "$trash_url/upstream.git" && | |
39 | git fetch upstream && | |
40 | git pull upstream master && | |
41 | cat <<-\EOT >>mnemonic.txt && | |
42 | Of twyecescore-eightt is but eine, | |
43 | And all the remnante be thrycescore-eine. | |
44 | O’course Leap yare comes an’pynes, | |
45 | Ev’rie foure yares, gote it ryghth. | |
46 | An’twyecescore-eight is but twyecescore-nyne. | |
47 | EOT | |
48 | git add mnemonic.txt && | |
49 | test_tick && | |
50 | git commit -m "More detail" && | |
51 | git tag -m "version 2" -a full && | |
52 | git checkout -b simplify HEAD^ && | |
53 | mv mnemonic.txt mnemonic.standard && | |
54 | cat <<-\EOT >mnemonic.clarified && | |
55 | Thirty days has September, | |
56 | All the rest I can’t remember. | |
57 | EOT | |
58 | git add -N mnemonic.standard mnemonic.clarified && | |
59 | git commit -a -m "Adapt to use modern, simpler English | |
60 | ||
61 | But keep the old version, too, in case some people prefer it." && | |
62 | git checkout master | |
63 | ) | |
64 | ||
65 | ' | |
66 | ||
67 | test_expect_success 'setup: two scripts for reading pull requests' ' | |
68 | ||
69 | downstream_url_for_sed=$( | |
70 | printf "%s\n" "$downstream_url" | | |
71 | sed -e '\''s/\\/\\\\/g'\'' -e '\''s/[[/.*^$]/\\&/g'\'' | |
72 | ) && | |
73 | ||
74 | cat <<-\EOT >read-request.sed && | |
75 | #!/bin/sed -nf | |
fe46fa9d | 76 | # Note that a request could ask for "tag $tagname" |
e66d7c37 | 77 | / in the Git repository at:$/!d |
30c56eaa | 78 | n |
f2cabf6a | 79 | /^$/ n |
fe46fa9d | 80 | s/ tag \([^ ]*\)$/ tag--\1/ |
30c56eaa JN |
81 | s/^[ ]*\(.*\) \([^ ]*\)/please pull\ |
82 | \1\ | |
83 | \2/p | |
84 | q | |
85 | EOT | |
86 | ||
87 | cat <<-EOT >fuzz.sed | |
88 | #!/bin/sed -nf | |
d77fd050 | 89 | s/$downstream_url_for_sed/URL/g |
2ece6ad2 | 90 | s/$OID_REGEX/OBJECT_NAME/g |
30c56eaa | 91 | s/A U Thor/AUTHOR/g |
f2cabf6a | 92 | s/[-0-9]\{10\} [:0-9]\{8\} [-+][0-9]\{4\}/DATE/g |
30c56eaa | 93 | s/ [^ ].*/ SUBJECT/g |
f2cabf6a | 94 | s/ [^ ].* (DATE)/ SUBJECT (DATE)/g |
28ad685f | 95 | s|tags/full|BRANCH|g |
30c56eaa | 96 | s/mnemonic.txt/FILENAME/g |
d0504645 | 97 | s/^version [0-9]/VERSION/ |
30c56eaa JN |
98 | /^ FILENAME | *[0-9]* [-+]*\$/ b diffstat |
99 | /^AUTHOR ([0-9]*):\$/ b shortlog | |
100 | p | |
101 | b | |
102 | : diffstat | |
103 | n | |
7f814632 | 104 | / [0-9]* files* changed/ { |
5bab6917 | 105 | a\\ |
30c56eaa JN |
106 | DIFFSTAT |
107 | b | |
108 | } | |
109 | b diffstat | |
110 | : shortlog | |
111 | /^ [a-zA-Z]/ n | |
112 | /^[a-zA-Z]* ([0-9]*):\$/ n | |
113 | /^\$/ N | |
6f89384f | 114 | /^\n[a-zA-Z]* ([0-9]*):\$/!{ |
5bab6917 | 115 | a\\ |
30c56eaa JN |
116 | SHORTLOG |
117 | D | |
118 | } | |
119 | n | |
120 | b shortlog | |
121 | EOT | |
122 | ||
123 | ' | |
124 | ||
125 | test_expect_success 'pull request when forgot to push' ' | |
126 | ||
127 | rm -fr downstream.git && | |
128 | git init --bare downstream.git && | |
129 | ( | |
130 | cd local && | |
131 | git checkout initial && | |
132 | git merge --ff-only master && | |
133 | test_must_fail git request-pull initial "$downstream_url" \ | |
134 | 2>../err | |
135 | ) && | |
28ad685f | 136 | grep "No match for commit .*" err && |
30c56eaa JN |
137 | grep "Are you sure you pushed" err |
138 | ||
139 | ' | |
140 | ||
141 | test_expect_success 'pull request after push' ' | |
142 | ||
143 | rm -fr downstream.git && | |
144 | git init --bare downstream.git && | |
145 | ( | |
146 | cd local && | |
147 | git checkout initial && | |
148 | git merge --ff-only master && | |
149 | git push origin master:for-upstream && | |
28ad685f | 150 | git request-pull initial origin master:for-upstream >../request |
30c56eaa JN |
151 | ) && |
152 | sed -nf read-request.sed <request >digest && | |
30c56eaa JN |
153 | { |
154 | read task && | |
155 | read repository && | |
156 | read branch | |
157 | } <digest && | |
158 | ( | |
159 | cd upstream-private && | |
160 | git checkout initial && | |
161 | git pull --ff-only "$repository" "$branch" | |
162 | ) && | |
163 | test "$branch" = for-upstream && | |
164 | test_cmp local/mnemonic.txt upstream-private/mnemonic.txt | |
165 | ||
166 | ' | |
167 | ||
28ad685f | 168 | test_expect_success 'request asks HEAD to be pulled' ' |
30c56eaa JN |
169 | |
170 | rm -fr downstream.git && | |
171 | git init --bare downstream.git && | |
172 | ( | |
173 | cd local && | |
174 | git checkout initial && | |
175 | git merge --ff-only master && | |
176 | git push --tags origin master simplify && | |
177 | git push origin master:for-upstream && | |
178 | git request-pull initial "$downstream_url" >../request | |
179 | ) && | |
180 | sed -nf read-request.sed <request >digest && | |
30c56eaa JN |
181 | { |
182 | read task && | |
183 | read repository && | |
184 | read branch | |
185 | } <digest && | |
28ad685f | 186 | test -z "$branch" |
30c56eaa JN |
187 | |
188 | ' | |
189 | ||
190 | test_expect_success 'pull request format' ' | |
191 | ||
192 | rm -fr downstream.git && | |
193 | git init --bare downstream.git && | |
194 | cat <<-\EOT >expect && | |
195 | The following changes since commit OBJECT_NAME: | |
30c56eaa | 196 | |
f2cabf6a | 197 | SUBJECT (DATE) |
30c56eaa | 198 | |
e66d7c37 | 199 | are available in the Git repository at: |
cf731666 | 200 | |
30c56eaa JN |
201 | URL BRANCH |
202 | ||
cf731666 JH |
203 | for you to fetch changes up to OBJECT_NAME: |
204 | ||
205 | SUBJECT (DATE) | |
206 | ||
d0504645 JH |
207 | ---------------------------------------------------------------- |
208 | VERSION | |
209 | ||
cf731666 | 210 | ---------------------------------------------------------------- |
30c56eaa JN |
211 | SHORTLOG |
212 | ||
213 | DIFFSTAT | |
214 | EOT | |
215 | ( | |
216 | cd local && | |
217 | git checkout initial && | |
218 | git merge --ff-only master && | |
28ad685f JH |
219 | git push origin tags/full && |
220 | git request-pull initial "$downstream_url" tags/full >../request | |
30c56eaa JN |
221 | ) && |
222 | <request sed -nf fuzz.sed >request.fuzzy && | |
5aae66bd | 223 | test_i18ncmp expect request.fuzzy && |
30c56eaa | 224 | |
5aae66bd JH |
225 | ( |
226 | cd local && | |
227 | git request-pull initial "$downstream_url" tags/full:refs/tags/full | |
228 | ) >request && | |
229 | sed -nf fuzz.sed <request >request.fuzzy && | |
d952cbb1 JH |
230 | test_i18ncmp expect request.fuzzy && |
231 | ||
232 | ( | |
233 | cd local && | |
234 | git request-pull initial "$downstream_url" full | |
235 | ) >request && | |
644edd02 | 236 | grep " tags/full\$" request |
30c56eaa JN |
237 | ' |
238 | ||
50ab6558 JN |
239 | test_expect_success 'request-pull ignores OPTIONS_KEEPDASHDASH poison' ' |
240 | ||
241 | ( | |
242 | cd local && | |
243 | OPTIONS_KEEPDASHDASH=Yes && | |
244 | export OPTIONS_KEEPDASHDASH && | |
245 | git checkout initial && | |
246 | git merge --ff-only master && | |
247 | git push origin master:for-upstream && | |
28ad685f | 248 | git request-pull -- initial "$downstream_url" master:for-upstream >../request |
50ab6558 JN |
249 | ) |
250 | ||
251 | ' | |
252 | ||
5731dfce PB |
253 | test_expect_success 'request-pull quotes regex metacharacters properly' ' |
254 | ||
255 | rm -fr downstream.git && | |
256 | git init --bare downstream.git && | |
257 | ( | |
258 | cd local && | |
259 | git checkout initial && | |
260 | git merge --ff-only master && | |
261 | git tag -mrelease v2.0 && | |
262 | git push origin refs/tags/v2.0:refs/tags/v2-0 && | |
263 | test_must_fail git request-pull initial "$downstream_url" tags/v2.0 \ | |
264 | 2>../err | |
265 | ) && | |
266 | grep "No match for commit .*" err && | |
267 | grep "Are you sure you pushed" err | |
268 | ||
269 | ' | |
270 | ||
0454220d PB |
271 | test_expect_success 'pull request with mismatched object' ' |
272 | ||
273 | rm -fr downstream.git && | |
274 | git init --bare downstream.git && | |
275 | ( | |
276 | cd local && | |
277 | git checkout initial && | |
278 | git merge --ff-only master && | |
279 | git push origin HEAD:refs/tags/full && | |
280 | test_must_fail git request-pull initial "$downstream_url" tags/full \ | |
281 | 2>../err | |
282 | ) && | |
283 | grep "points to a different object" err && | |
284 | grep "Are you sure you pushed" err | |
285 | ||
286 | ' | |
287 | ||
288 | test_expect_success 'pull request with stale object' ' | |
289 | ||
290 | rm -fr downstream.git && | |
291 | git init --bare downstream.git && | |
292 | ( | |
293 | cd local && | |
294 | git checkout initial && | |
295 | git merge --ff-only master && | |
296 | git push origin refs/tags/full && | |
297 | git tag -f -m"Thirty-one days" full && | |
298 | test_must_fail git request-pull initial "$downstream_url" tags/full \ | |
299 | 2>../err | |
300 | ) && | |
301 | grep "points to a different object" err && | |
302 | grep "Are you sure you pushed" err | |
303 | ||
304 | ' | |
305 | ||
30c56eaa | 306 | test_done |