#!/bin/sh test_description='pushing to a repository using push options' . ./test-lib.sh mk_repo_pair () { rm -rf workbench upstream && test_create_repo upstream && test_create_repo workbench && ( cd upstream && git config receive.denyCurrentBranch warn && mkdir -p .git/hooks && cat >.git/hooks/pre-receive <<-'EOF' && #!/bin/sh if test -n "$GIT_PUSH_OPTION_COUNT"; then i=0 >hooks/pre-receive.push_options while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"; do eval "value=\$GIT_PUSH_OPTION_$i" echo $value >>hooks/pre-receive.push_options i=$((i + 1)) done fi EOF chmod u+x .git/hooks/pre-receive cat >.git/hooks/post-receive <<-'EOF' && #!/bin/sh if test -n "$GIT_PUSH_OPTION_COUNT"; then i=0 >hooks/post-receive.push_options while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"; do eval "value=\$GIT_PUSH_OPTION_$i" echo $value >>hooks/post-receive.push_options i=$((i + 1)) done fi EOF chmod u+x .git/hooks/post-receive ) && ( cd workbench && git remote add up ../upstream ) } # Compare the ref ($1) in upstream with a ref value from workbench ($2) # i.e. test_refs second HEAD@{2} test_refs () { test $# = 2 && git -C upstream rev-parse --verify "$1" >expect && git -C workbench rev-parse --verify "$2" >actual && test_cmp expect actual } test_expect_success 'one push option works for a single branch' ' mk_repo_pair && git -C upstream config receive.advertisePushOptions true && ( cd workbench && test_commit one && git push --mirror up && test_commit two && git push --push-option=asdf up master ) && test_refs master master && echo "asdf" >expect && test_cmp expect upstream/.git/hooks/pre-receive.push_options && test_cmp expect upstream/.git/hooks/post-receive.push_options ' test_expect_success 'push option denied by remote' ' mk_repo_pair && git -C upstream config receive.advertisePushOptions false && ( cd workbench && test_commit one && git push --mirror up && test_commit two && test_must_fail git push --push-option=asdf up master ) && test_refs master HEAD@{1} ' test_expect_success 'two push options work' ' mk_repo_pair && git -C upstream config receive.advertisePushOptions true && ( cd workbench && test_commit one && git push --mirror up && test_commit two && git push --push-option=asdf --push-option="more structured text" up master ) && test_refs master master && printf "asdf\nmore structured text\n" >expect && test_cmp expect upstream/.git/hooks/pre-receive.push_options && test_cmp expect upstream/.git/hooks/post-receive.push_options ' test_done