(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'Test workflows involving pull request.' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:18))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:22) (Token id:Id.Lit_Chars val:'\n' span_id:23) (Token id:Id.Lit_Chars val:'\tgit init --bare upstream.git &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\tgit init --bare downstream.git &&\n' span_id:25) (Token id: Id.Lit_Chars val: '\tgit clone upstream.git upstream-private &&\n' span_id: 26 ) (Token id:Id.Lit_Chars val:'\tgit clone downstream.git local &&\n' span_id:27) (Token id:Id.Lit_Chars val:'\n' span_id:28) (Token id:Id.Lit_Chars val:'\ttrash_url="file://$TRASH_DIRECTORY" &&\n' span_id:29) (Token id: Id.Lit_Chars val: '\tdownstream_url="$trash_url/downstream.git/" &&\n' span_id: 30 ) (Token id:Id.Lit_Chars val:'\tupstream_url="$trash_url/upstream.git/" &&\n' span_id:31) (Token id:Id.Lit_Chars val:'\n' span_id:32) (Token id:Id.Lit_Chars val:'\t(\n' span_id:33) (Token id:Id.Lit_Chars val:'\t\tcd upstream-private &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\t\tcat <<-\\EOT >mnemonic.txt &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\t\tThirtey days hath November,\n' span_id:36) (Token id:Id.Lit_Chars val:'\t\tAprile, June, and September:\n' span_id:37) (Token id:Id.Lit_Chars val:'\t\tEOT\n' span_id:38) (Token id:Id.Lit_Chars val:'\t\tgit add mnemonic.txt &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:40) (Token id: Id.Lit_Chars val: '\t\tgit commit -m "\\"Thirty days\\", a reminder of month lengths" &&\n' span_id: 41 ) (Token id:Id.Lit_Chars val:'\t\tgit tag -m "version 1" -a initial &&\n' span_id:42) (Token id:Id.Lit_Chars val:'\t\tgit push --tags origin master\n' span_id:43) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:44) (Token id:Id.Lit_Chars val:'\t(\n' span_id:45) (Token id:Id.Lit_Chars val:'\t\tcd local &&\n' span_id:46) (Token id:Id.Lit_Chars val:'\t\tgit remote add upstream "$trash_url/upstream.git" &&\n' span_id:47) (Token id:Id.Lit_Chars val:'\t\tgit fetch upstream &&\n' span_id:48) (Token id:Id.Lit_Chars val:'\t\tgit pull upstream master &&\n' span_id:49) (Token id:Id.Lit_Chars val:'\t\tcat <<-\\EOT >>mnemonic.txt &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\t\tOf twyecescore-eightt is but eine,\n' span_id:51) (Token id: Id.Lit_Chars val: '\t\tAnd all the remnante be thrycescore-eine.\n' span_id: 52 ) (Token id: Id.Lit_Chars val: '\t\tO\xe2\x80\x99course Leap yare comes an\xe2\x80\x99pynes,\n' span_id: 53 ) (Token id:Id.Lit_Chars val:'\t\tEv\xe2\x80\x99rie foure yares, gote it ryghth.\n' span_id:54) (Token id: Id.Lit_Chars val: '\t\tAn\xe2\x80\x99twyecescore-eight is but twyecescore-nyne.\n' span_id: 55 ) (Token id:Id.Lit_Chars val:'\t\tEOT\n' span_id:56) (Token id:Id.Lit_Chars val:'\t\tgit add mnemonic.txt &&\n' span_id:57) (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:58) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "More detail" &&\n' span_id:59) (Token id:Id.Lit_Chars val:'\t\tgit tag -m "version 2" -a full &&\n' span_id:60) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b simplify HEAD^ &&\n' span_id:61) (Token id:Id.Lit_Chars val:'\t\tmv mnemonic.txt mnemonic.standard &&\n' span_id:62) (Token id: Id.Lit_Chars val: '\t\tcat <<-\\EOT >mnemonic.clarified &&\n' span_id: 63 ) (Token id:Id.Lit_Chars val:'\t\tThirty days has September,\n' span_id:64) (Token id: Id.Lit_Chars val: '\t\tAll the rest I can\xe2\x80\x99t remember.\n' span_id: 65 ) (Token id:Id.Lit_Chars val:'\t\tEOT\n' span_id:66) (Token id: Id.Lit_Chars val: '\t\tgit add -N mnemonic.standard mnemonic.clarified &&\n' span_id: 67 ) (Token id:Id.Lit_Chars val:'\t\tgit commit -a -m "Adapt to use modern, simpler English\n' span_id:68) (Token id:Id.Lit_Chars val:'\n' span_id:69) (Token id: Id.Lit_Chars val: 'But keep the old version, too, in case some people prefer it." &&\n' span_id: 70 ) (Token id:Id.Lit_Chars val:'\t\tgit checkout master\n' span_id:71) (Token id:Id.Lit_Chars val:'\t)\n' span_id:72) (Token id:Id.Lit_Chars val:'\n' span_id:73) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup: two scripts for reading pull requests' span_id:80))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:84) (Token id:Id.Lit_Chars val:'\n' span_id:85) (Token id:Id.Lit_Chars val:'\tdownstream_url_for_sed=$(\n' span_id:86) (Token id:Id.Lit_Chars val:'\t\tprintf "%s\\n" "$downstream_url" |\n' span_id:87) (Token id:Id.Lit_Chars val:'\t\tsed -e ' span_id:88) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:90)) (SQ (Token id:Id.Lit_Chars val:'s/\\\\/\\\\\\\\/g' span_id:92)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:94)) (SQ (Token id:Id.Lit_Chars val:' -e ' span_id:96)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:98)) (SQ (Token id:Id.Lit_Chars val:'s/[[/.*^$]/\\\\&/g' span_id:100)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:102)) (SQ (Token id:Id.Lit_Chars val:'\n' span_id:104) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:105) (Token id:Id.Lit_Chars val:'\n' span_id:106) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOT >read-request.sed &&\n' span_id:107) (Token id:Id.Lit_Chars val:'\t#!/bin/sed -nf\n' span_id:108) (Token id: Id.Lit_Chars val: '\t# Note that a request could ask for "tag $tagname"\n' span_id: 109 ) (Token id:Id.Lit_Chars val:'\t/ in the git repository at:$/!d\n' span_id:110) (Token id:Id.Lit_Chars val:'\tn\n' span_id:111) (Token id:Id.Lit_Chars val:'\t/^$/ n\n' span_id:112) (Token id:Id.Lit_Chars val:'\ts/ tag \\([^ ]*\\)$/ tag--\\1/\n' span_id:113) (Token id:Id.Lit_Chars val:'\ts/^[ \t]*\\(.*\\) \\([^ ]*\\)/please pull\\\n' span_id:114) (Token id:Id.Lit_Chars val:'\t\\1\\\n' span_id:115) (Token id:Id.Lit_Chars val:'\t\\2/p\n' span_id:116) (Token id:Id.Lit_Chars val:'\tq\n' span_id:117) (Token id:Id.Lit_Chars val:'\tEOT\n' span_id:118) (Token id:Id.Lit_Chars val:'\n' span_id:119) (Token id:Id.Lit_Chars val:'\tcat <<-EOT >fuzz.sed\n' span_id:120) (Token id:Id.Lit_Chars val:'\t#!/bin/sed -nf\n' span_id:121) (Token id:Id.Lit_Chars val:'\ts/$downstream_url_for_sed/URL/g\n' span_id:122) (Token id:Id.Lit_Chars val:'\ts/$_x40/OBJECT_NAME/g\n' span_id:123) (Token id:Id.Lit_Chars val:'\ts/A U Thor/AUTHOR/g\n' span_id:124) (Token id:Id.Lit_Chars val:'\ts/[-0-9]\\{10\\} [:0-9]\\{8\\} [-+][0-9]\\{4\\}/DATE/g\n' span_id:125) (Token id:Id.Lit_Chars val:'\ts/ [^ ].*/ SUBJECT/g\n' span_id:126) (Token id:Id.Lit_Chars val:'\ts/ [^ ].* (DATE)/ SUBJECT (DATE)/g\n' span_id:127) (Token id:Id.Lit_Chars val:'\ts|tags/full|BRANCH|g\n' span_id:128) (Token id:Id.Lit_Chars val:'\ts/mnemonic.txt/FILENAME/g\n' span_id:129) (Token id:Id.Lit_Chars val:'\ts/^version [0-9]/VERSION/\n' span_id:130) (Token id:Id.Lit_Chars val:'\t/^ FILENAME | *[0-9]* [-+]*\\$/ b diffstat\n' span_id:131) (Token id:Id.Lit_Chars val:'\t/^AUTHOR ([0-9]*):\\$/ b shortlog\n' span_id:132) (Token id:Id.Lit_Chars val:'\tp\n' span_id:133) (Token id:Id.Lit_Chars val:'\tb\n' span_id:134) (Token id:Id.Lit_Chars val:'\t: diffstat\n' span_id:135) (Token id:Id.Lit_Chars val:'\tn\n' span_id:136) (Token id:Id.Lit_Chars val:'\t/ [0-9]* files* changed/ {\n' span_id:137) (Token id:Id.Lit_Chars val:'\t\ta\\\\\n' span_id:138) (Token id:Id.Lit_Chars val:'\tDIFFSTAT\n' span_id:139) (Token id:Id.Lit_Chars val:'\t\tb\n' span_id:140) (Token id:Id.Lit_Chars val:'\t}\n' span_id:141) (Token id:Id.Lit_Chars val:'\tb diffstat\n' span_id:142) (Token id:Id.Lit_Chars val:'\t: shortlog\n' span_id:143) (Token id:Id.Lit_Chars val:'\t/^ [a-zA-Z]/ n\n' span_id:144) (Token id:Id.Lit_Chars val:'\t/^[a-zA-Z]* ([0-9]*):\\$/ n\n' span_id:145) (Token id:Id.Lit_Chars val:'\t/^\\$/ N\n' span_id:146) (Token id:Id.Lit_Chars val:'\t/^\\n[a-zA-Z]* ([0-9]*):\\$/!{\n' span_id:147) (Token id:Id.Lit_Chars val:'\t\ta\\\\\n' span_id:148) (Token id:Id.Lit_Chars val:'\tSHORTLOG\n' span_id:149) (Token id:Id.Lit_Chars val:'\t\tD\n' span_id:150) (Token id:Id.Lit_Chars val:'\t}\n' span_id:151) (Token id:Id.Lit_Chars val:'\tn\n' span_id:152) (Token id:Id.Lit_Chars val:'\tb shortlog\n' span_id:153) (Token id:Id.Lit_Chars val:'\tEOT\n' span_id:154) (Token id:Id.Lit_Chars val:'\n' span_id:155) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pull request when forgot to push' span_id:162))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:166) (Token id:Id.Lit_Chars val:'\n' span_id:167) (Token id:Id.Lit_Chars val:'\trm -fr downstream.git &&\n' span_id:168) (Token id:Id.Lit_Chars val:'\tgit init --bare downstream.git &&\n' span_id:169) (Token id:Id.Lit_Chars val:'\t(\n' span_id:170) (Token id:Id.Lit_Chars val:'\t\tcd local &&\n' span_id:171) (Token id:Id.Lit_Chars val:'\t\tgit checkout initial &&\n' span_id:172) (Token id:Id.Lit_Chars val:'\t\tgit merge --ff-only master &&\n' span_id:173) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git request-pull initial "$downstream_url" \\\n' span_id: 174 ) (Token id:Id.Lit_Chars val:'\t\t\t2>../err\n' span_id:175) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:176) (Token id:Id.Lit_Chars val:'\tgrep "No match for commit .*" err &&\n' span_id:177) (Token id:Id.Lit_Chars val:'\tgrep "Are you sure you pushed" err\n' span_id:178) (Token id:Id.Lit_Chars val:'\n' span_id:179) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pull request after push' span_id:186))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:190) (Token id:Id.Lit_Chars val:'\n' span_id:191) (Token id:Id.Lit_Chars val:'\trm -fr downstream.git &&\n' span_id:192) (Token id:Id.Lit_Chars val:'\tgit init --bare downstream.git &&\n' span_id:193) (Token id:Id.Lit_Chars val:'\t(\n' span_id:194) (Token id:Id.Lit_Chars val:'\t\tcd local &&\n' span_id:195) (Token id:Id.Lit_Chars val:'\t\tgit checkout initial &&\n' span_id:196) (Token id:Id.Lit_Chars val:'\t\tgit merge --ff-only master &&\n' span_id:197) (Token id: Id.Lit_Chars val: '\t\tgit push origin master:for-upstream &&\n' span_id: 198 ) (Token id: Id.Lit_Chars val: '\t\tgit request-pull initial origin master:for-upstream >../request\n' span_id: 199 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:200) (Token id: Id.Lit_Chars val: '\tsed -nf read-request.sed <request >digest &&\n' span_id: 201 ) (Token id:Id.Lit_Chars val:'\tcat digest &&\n' span_id:202) (Token id:Id.Lit_Chars val:'\t{\n' span_id:203) (Token id:Id.Lit_Chars val:'\t\tread task &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\t\tread repository &&\n' span_id:205) (Token id:Id.Lit_Chars val:'\t\tread branch\n' span_id:206) (Token id:Id.Lit_Chars val:'\t} <digest &&\n' span_id:207) (Token id:Id.Lit_Chars val:'\t(\n' span_id:208) (Token id:Id.Lit_Chars val:'\t\tcd upstream-private &&\n' span_id:209) (Token id:Id.Lit_Chars val:'\t\tgit checkout initial &&\n' span_id:210) (Token id: Id.Lit_Chars val: '\t\tgit pull --ff-only "$repository" "$branch"\n' span_id: 211 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:212) (Token id:Id.Lit_Chars val:'\ttest "$branch" = for-upstream &&\n' span_id:213) (Token id: Id.Lit_Chars val: '\ttest_cmp local/mnemonic.txt upstream-private/mnemonic.txt\n' span_id: 214 ) (Token id:Id.Lit_Chars val:'\n' span_id:215) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'request asks HEAD to be pulled' span_id:222))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:226) (Token id:Id.Lit_Chars val:'\n' span_id:227) (Token id:Id.Lit_Chars val:'\trm -fr downstream.git &&\n' span_id:228) (Token id:Id.Lit_Chars val:'\tgit init --bare downstream.git &&\n' span_id:229) (Token id:Id.Lit_Chars val:'\t(\n' span_id:230) (Token id:Id.Lit_Chars val:'\t\tcd local &&\n' span_id:231) (Token id:Id.Lit_Chars val:'\t\tgit checkout initial &&\n' span_id:232) (Token id:Id.Lit_Chars val:'\t\tgit merge --ff-only master &&\n' span_id:233) (Token id: Id.Lit_Chars val: '\t\tgit push --tags origin master simplify &&\n' span_id: 234 ) (Token id:Id.Lit_Chars val:'\t\tgit push origin master:for-upstream &&\n' span_id:235) (Token id: Id.Lit_Chars val: '\t\tgit request-pull initial "$downstream_url" >../request\n' span_id: 236 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:237) (Token id: Id.Lit_Chars val: '\tsed -nf read-request.sed <request >digest &&\n' span_id: 238 ) (Token id:Id.Lit_Chars val:'\tcat digest &&\n' span_id:239) (Token id:Id.Lit_Chars val:'\t{\n' span_id:240) (Token id:Id.Lit_Chars val:'\t\tread task &&\n' span_id:241) (Token id:Id.Lit_Chars val:'\t\tread repository &&\n' span_id:242) (Token id:Id.Lit_Chars val:'\t\tread branch\n' span_id:243) (Token id:Id.Lit_Chars val:'\t} <digest &&\n' span_id:244) (Token id:Id.Lit_Chars val:'\ttest -z "$branch"\n' span_id:245) (Token id:Id.Lit_Chars val:'\n' span_id:246) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pull request format' span_id:253))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:257) (Token id:Id.Lit_Chars val:'\n' span_id:258) (Token id:Id.Lit_Chars val:'\trm -fr downstream.git &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\tgit init --bare downstream.git &&\n' span_id:260) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOT >expect &&\n' span_id:261) (Token id:Id.Lit_Chars val:'\tThe following changes since commit OBJECT_NAME:\n' span_id:262) (Token id:Id.Lit_Chars val:'\n' span_id:263) (Token id:Id.Lit_Chars val:'\t SUBJECT (DATE)\n' span_id:264) (Token id:Id.Lit_Chars val:'\n' span_id:265) (Token id:Id.Lit_Chars val:'\tare available in the git repository at:\n' span_id:266) (Token id:Id.Lit_Chars val:'\n' span_id:267) (Token id:Id.Lit_Chars val:'\t URL BRANCH\n' span_id:268) (Token id:Id.Lit_Chars val:'\n' span_id:269) (Token id:Id.Lit_Chars val:'\tfor you to fetch changes up to OBJECT_NAME:\n' span_id:270) (Token id:Id.Lit_Chars val:'\n' span_id:271) (Token id:Id.Lit_Chars val:'\t SUBJECT (DATE)\n' span_id:272) (Token id:Id.Lit_Chars val:'\n' span_id:273) (Token id: Id.Lit_Chars val: '\t----------------------------------------------------------------\n' span_id: 274 ) (Token id:Id.Lit_Chars val:'\tVERSION\n' span_id:275) (Token id:Id.Lit_Chars val:'\n' span_id:276) (Token id: Id.Lit_Chars val: '\t----------------------------------------------------------------\n' span_id: 277 ) (Token id:Id.Lit_Chars val:'\tSHORTLOG\n' span_id:278) (Token id:Id.Lit_Chars val:'\n' span_id:279) (Token id:Id.Lit_Chars val:'\tDIFFSTAT\n' span_id:280) (Token id:Id.Lit_Chars val:'\tEOT\n' span_id:281) (Token id:Id.Lit_Chars val:'\t(\n' span_id:282) (Token id:Id.Lit_Chars val:'\t\tcd local &&\n' span_id:283) (Token id:Id.Lit_Chars val:'\t\tgit checkout initial &&\n' span_id:284) (Token id:Id.Lit_Chars val:'\t\tgit merge --ff-only master &&\n' span_id:285) (Token id:Id.Lit_Chars val:'\t\tgit push origin tags/full &&\n' span_id:286) (Token id: Id.Lit_Chars val: '\t\tgit request-pull initial "$downstream_url" tags/full >../request\n' span_id: 287 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:288) (Token id: Id.Lit_Chars val: '\t<request sed -nf fuzz.sed >request.fuzzy &&\n' span_id: 289 ) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect request.fuzzy &&\n' span_id:290) (Token id:Id.Lit_Chars val:'\n' span_id:291) (Token id:Id.Lit_Chars val:'\t(\n' span_id:292) (Token id:Id.Lit_Chars val:'\t\tcd local &&\n' span_id:293) (Token id: Id.Lit_Chars val: '\t\tgit request-pull initial "$downstream_url" tags/full:refs/tags/full\n' span_id: 294 ) (Token id:Id.Lit_Chars val:'\t) >request &&\n' span_id:295) (Token id: Id.Lit_Chars val: '\tsed -nf fuzz.sed <request >request.fuzzy &&\n' span_id: 296 ) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect request.fuzzy &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\n' span_id:298) (Token id:Id.Lit_Chars val:'\t(\n' span_id:299) (Token id:Id.Lit_Chars val:'\t\tcd local &&\n' span_id:300) (Token id:Id.Lit_Chars val:'\t\tgit request-pull initial "$downstream_url" full\n' span_id:301) (Token id:Id.Lit_Chars val:'\t) >request &&\n' span_id:302) (Token id:Id.Lit_Chars val:'\tgrep " tags/full\\$" request\n' span_id:303) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'request-pull ignores OPTIONS_KEEPDASHDASH poison' span_id: 310 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:314) (Token id:Id.Lit_Chars val:'\n' span_id:315) (Token id:Id.Lit_Chars val:'\t(\n' span_id:316) (Token id:Id.Lit_Chars val:'\t\tcd local &&\n' span_id:317) (Token id:Id.Lit_Chars val:'\t\tOPTIONS_KEEPDASHDASH=Yes &&\n' span_id:318) (Token id:Id.Lit_Chars val:'\t\texport OPTIONS_KEEPDASHDASH &&\n' span_id:319) (Token id:Id.Lit_Chars val:'\t\tgit checkout initial &&\n' span_id:320) (Token id:Id.Lit_Chars val:'\t\tgit merge --ff-only master &&\n' span_id:321) (Token id: Id.Lit_Chars val: '\t\tgit push origin master:for-upstream &&\n' span_id: 322 ) (Token id: Id.Lit_Chars val: '\t\tgit request-pull -- initial "$downstream_url" master:for-upstream >../request\n' span_id: 323 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:324) (Token id:Id.Lit_Chars val:'\n' span_id:325) ) } ) (C {(test_done)}) ] )