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