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