|  | #!/bin/sh | 
|  |  | 
|  | test_description='Test workflows involving pull request.' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success 'setup' ' | 
|  |  | 
|  | git init --bare upstream.git && | 
|  | git init --bare downstream.git && | 
|  | git clone upstream.git upstream-private && | 
|  | git clone downstream.git local && | 
|  |  | 
|  | trash_url="file://$TRASH_DIRECTORY" && | 
|  | downstream_url="$trash_url/downstream.git/" && | 
|  | upstream_url="$trash_url/upstream.git/" && | 
|  |  | 
|  | ( | 
|  | cd upstream-private && | 
|  | cat <<-\EOT >mnemonic.txt && | 
|  | Thirtey days hath November, | 
|  | Aprile, June, and September: | 
|  | EOT | 
|  | git add mnemonic.txt && | 
|  | test_tick && | 
|  | git commit -m "\"Thirty days\", a reminder of month lengths" && | 
|  | git tag -m "version 1" -a initial && | 
|  | git push --tags origin master | 
|  | ) && | 
|  | ( | 
|  | cd local && | 
|  | git remote add upstream "$trash_url/upstream.git" && | 
|  | git fetch upstream && | 
|  | git pull upstream master && | 
|  | cat <<-\EOT >>mnemonic.txt && | 
|  | Of twyecescore-eightt is but eine, | 
|  | And all the remnante be thrycescore-eine. | 
|  | O’course Leap yare comes an’pynes, | 
|  | Ev’rie foure yares, gote it ryghth. | 
|  | An’twyecescore-eight is but twyecescore-nyne. | 
|  | EOT | 
|  | git add mnemonic.txt && | 
|  | test_tick && | 
|  | git commit -m "More detail" && | 
|  | git tag -m "version 2" -a full && | 
|  | git checkout -b simplify HEAD^ && | 
|  | mv mnemonic.txt mnemonic.standard && | 
|  | cat <<-\EOT >mnemonic.clarified && | 
|  | Thirty days has September, | 
|  | All the rest I can’t remember. | 
|  | EOT | 
|  | git add -N mnemonic.standard mnemonic.clarified && | 
|  | git commit -a -m "Adapt to use modern, simpler English | 
|  |  | 
|  | But keep the old version, too, in case some people prefer it." && | 
|  | git checkout master | 
|  | ) | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'setup: two scripts for reading pull requests' ' | 
|  |  | 
|  | downstream_url_for_sed=$( | 
|  | printf "%s\n" "$downstream_url" | | 
|  | sed -e '\''s/\\/\\\\/g'\'' -e '\''s/[[/.*^$]/\\&/g'\'' | 
|  | ) && | 
|  |  | 
|  | cat <<-\EOT >read-request.sed && | 
|  | #!/bin/sed -nf | 
|  | # Note that a request could ask for "tag $tagname" | 
|  | / in the Git repository at:$/!d | 
|  | n | 
|  | /^$/ n | 
|  | s/ tag \([^ ]*\)$/ tag--\1/ | 
|  | s/^[ 	]*\(.*\) \([^ ]*\)/please pull\ | 
|  | \1\ | 
|  | \2/p | 
|  | q | 
|  | EOT | 
|  |  | 
|  | cat <<-EOT >fuzz.sed | 
|  | #!/bin/sed -nf | 
|  | s/$downstream_url_for_sed/URL/g | 
|  | s/$OID_REGEX/OBJECT_NAME/g | 
|  | s/A U Thor/AUTHOR/g | 
|  | s/[-0-9]\{10\} [:0-9]\{8\} [-+][0-9]\{4\}/DATE/g | 
|  | s/        [^ ].*/        SUBJECT/g | 
|  | s/  [^ ].* (DATE)/  SUBJECT (DATE)/g | 
|  | s|tags/full|BRANCH|g | 
|  | s/mnemonic.txt/FILENAME/g | 
|  | s/^version [0-9]/VERSION/ | 
|  | /^ FILENAME | *[0-9]* [-+]*\$/ b diffstat | 
|  | /^AUTHOR ([0-9]*):\$/ b shortlog | 
|  | p | 
|  | b | 
|  | : diffstat | 
|  | n | 
|  | / [0-9]* files* changed/ { | 
|  | a\\ | 
|  | DIFFSTAT | 
|  | b | 
|  | } | 
|  | b diffstat | 
|  | : shortlog | 
|  | /^        [a-zA-Z]/ n | 
|  | /^[a-zA-Z]* ([0-9]*):\$/ n | 
|  | /^\$/ N | 
|  | /^\n[a-zA-Z]* ([0-9]*):\$/!{ | 
|  | a\\ | 
|  | SHORTLOG | 
|  | D | 
|  | } | 
|  | n | 
|  | b shortlog | 
|  | EOT | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pull request when forgot to push' ' | 
|  |  | 
|  | rm -fr downstream.git && | 
|  | git init --bare downstream.git && | 
|  | ( | 
|  | cd local && | 
|  | git checkout initial && | 
|  | git merge --ff-only master && | 
|  | test_must_fail git request-pull initial "$downstream_url" \ | 
|  | 2>../err | 
|  | ) && | 
|  | grep "No match for commit .*" err && | 
|  | grep "Are you sure you pushed" err | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pull request after push' ' | 
|  |  | 
|  | rm -fr downstream.git && | 
|  | git init --bare downstream.git && | 
|  | ( | 
|  | cd local && | 
|  | git checkout initial && | 
|  | git merge --ff-only master && | 
|  | git push origin master:for-upstream && | 
|  | git request-pull initial origin master:for-upstream >../request | 
|  | ) && | 
|  | sed -nf read-request.sed <request >digest && | 
|  | cat digest && | 
|  | { | 
|  | read task && | 
|  | read repository && | 
|  | read branch | 
|  | } <digest && | 
|  | ( | 
|  | cd upstream-private && | 
|  | git checkout initial && | 
|  | git pull --ff-only "$repository" "$branch" | 
|  | ) && | 
|  | test "$branch" = for-upstream && | 
|  | test_cmp local/mnemonic.txt upstream-private/mnemonic.txt | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'request asks HEAD to be pulled' ' | 
|  |  | 
|  | rm -fr downstream.git && | 
|  | git init --bare downstream.git && | 
|  | ( | 
|  | cd local && | 
|  | git checkout initial && | 
|  | git merge --ff-only master && | 
|  | git push --tags origin master simplify && | 
|  | git push origin master:for-upstream && | 
|  | git request-pull initial "$downstream_url" >../request | 
|  | ) && | 
|  | sed -nf read-request.sed <request >digest && | 
|  | cat digest && | 
|  | { | 
|  | read task && | 
|  | read repository && | 
|  | read branch | 
|  | } <digest && | 
|  | test -z "$branch" | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'pull request format' ' | 
|  |  | 
|  | rm -fr downstream.git && | 
|  | git init --bare downstream.git && | 
|  | cat <<-\EOT >expect && | 
|  | The following changes since commit OBJECT_NAME: | 
|  |  | 
|  | SUBJECT (DATE) | 
|  |  | 
|  | are available in the Git repository at: | 
|  |  | 
|  | URL BRANCH | 
|  |  | 
|  | for you to fetch changes up to OBJECT_NAME: | 
|  |  | 
|  | SUBJECT (DATE) | 
|  |  | 
|  | ---------------------------------------------------------------- | 
|  | VERSION | 
|  |  | 
|  | ---------------------------------------------------------------- | 
|  | SHORTLOG | 
|  |  | 
|  | DIFFSTAT | 
|  | EOT | 
|  | ( | 
|  | cd local && | 
|  | git checkout initial && | 
|  | git merge --ff-only master && | 
|  | git push origin tags/full && | 
|  | git request-pull initial "$downstream_url" tags/full >../request | 
|  | ) && | 
|  | <request sed -nf fuzz.sed >request.fuzzy && | 
|  | test_i18ncmp expect request.fuzzy && | 
|  |  | 
|  | ( | 
|  | cd local && | 
|  | git request-pull initial "$downstream_url" tags/full:refs/tags/full | 
|  | ) >request && | 
|  | sed -nf fuzz.sed <request >request.fuzzy && | 
|  | test_i18ncmp expect request.fuzzy && | 
|  |  | 
|  | ( | 
|  | cd local && | 
|  | git request-pull initial "$downstream_url" full | 
|  | ) >request && | 
|  | grep " tags/full\$" request | 
|  | ' | 
|  |  | 
|  | test_expect_success 'request-pull ignores OPTIONS_KEEPDASHDASH poison' ' | 
|  |  | 
|  | ( | 
|  | cd local && | 
|  | OPTIONS_KEEPDASHDASH=Yes && | 
|  | export OPTIONS_KEEPDASHDASH && | 
|  | git checkout initial && | 
|  | git merge --ff-only master && | 
|  | git push origin master:for-upstream && | 
|  | git request-pull -- initial "$downstream_url" master:for-upstream >../request | 
|  | ) | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_done |