From a98dc1dffc4eadc11c76e90bd8e27a8337724370 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Tue, 31 Oct 2023 23:23:30 +0100 Subject: [PATCH] add a test for forked destination --- cascading-pr.sh | 22 ++++---- .../.forgejo/workflows/test.yml | 2 +- .../.forgejo/workflows/test.yml | 26 ++++++++++ tests/origin-fork-destination/README | 1 + tests/origin-fork-destination/upgraded | 14 ++++++ tests/run.sh | 50 ++++++++++++++----- 6 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 tests/origin-fork-destination/.forgejo/workflows/test.yml create mode 100644 tests/origin-fork-destination/README create mode 100755 tests/origin-fork-destination/upgraded diff --git a/cascading-pr.sh b/cascading-pr.sh index 5f8fec7..a47fa4d 100755 --- a/cascading-pr.sh +++ b/cascading-pr.sh @@ -170,7 +170,7 @@ function git_clone() { } function git_checkout() { - local direction=$1 ref="$3" + local direction=$1 ref="$2" local remote=origin ( @@ -245,12 +245,12 @@ function upsert_fork() { return 1 fi else - local fork_owner=$(owner ${options[destination_fork]}) + local fork_owner=$(owner ${options[destination_fork_repo]}) local data="{}" if repo_curl ${options[destination_repo]} api_json ${options[destination_url]}/api/v1/orgs/${fork_owner} >& /dev/null ; then data='{"organization":"'$fork_owner'"}' fi - repo_curl ${options[destination_repo]} api_json --data "$data" ${options[destination_url]}/api/v1/${options[destination_repo]}/forks + repo_curl ${options[destination_repo]} api_json --data "$data" ${options[destination_url]}/api/v1/repos/${options[destination_repo]}/forks fi } @@ -304,8 +304,8 @@ function update() { push destination $remote_head ${options[destination_head]} } -function set_clone() { - local direction=$1 +function set_git_url() { + local direction=$1 name=$2 repo=$3 local token=${options[${direction}_token]} if [[ "$token" =~ ^@ ]] ; then @@ -313,12 +313,12 @@ function set_clone() { ( echo -n ${options[${direction}_scheme]}://any: cat $file - echo @${options[${direction}_host_port]}/${options[${direction}_repo]} + echo @${options[${direction}_host_port]}/$repo ) > $TMPDIR/$direction.git-credentials else - echo ${options[${direction}_scheme]}://any:${options[${direction}_token]}@${options[${direction}_host_port]}/${options[${direction}_repo]} > $TMPDIR/$direction.git-credentials + echo ${options[${direction}_scheme]}://any:${options[${direction}_token]}@${options[${direction}_host_port]}/$repo > $TMPDIR/$direction.git-credentials fi - options[${direction}_clone]=${options[${direction}_scheme]}://${options[${direction}_host_port]}/${options[${direction}_repo]} + options[$name]=${options[${direction}_scheme]}://${options[${direction}_host_port]}/$repo } function fork_sanity_check() { @@ -334,13 +334,13 @@ function finalize_options() { options[origin_api]=${options[origin_url]}/api/v1/repos/${options[origin_repo]} options[origin_scheme]=$(scheme ${options[origin_url]}) options[origin_host_port]=$(host_port ${options[origin_url]}) - set_clone origin + set_git_url origin origin_clone ${options[origin_repo]} options[origin_head]=refs/pull/${options[origin_pr]}/head options[destination_api]=${options[destination_url]}/api/v1/repos/${options[destination_repo]} options[destination_scheme]=$(scheme ${options[destination_url]}) options[destination_host_port]=$(host_port ${options[destination_url]}) - set_clone destination + set_git_url destination destination_clone ${options[destination_repo]} options[destination_base]=${options[destination_branch]} : ${options[prefix]:=${options[origin_repo]}} options[destination_head]=${options[prefix]}-${options[origin_pr]} @@ -348,7 +348,9 @@ function finalize_options() { if test "${options[destination_fork_repo]}"; then fork_sanity_check options[destination_is_fork]=true + set_git_url destination destination_fetch_fork ${options[destination_fork_repo]} options[destination_fork_api]=${options[destination_url]}/api/v1/repos/${options[destination_fork_repo]} + else options[destination_is_fork]=false fi diff --git a/tests/destinationrepo/.forgejo/workflows/test.yml b/tests/destinationrepo/.forgejo/workflows/test.yml index 21aa58a..980b8ea 100644 --- a/tests/destinationrepo/.forgejo/workflows/test.yml +++ b/tests/destinationrepo/.forgejo/workflows/test.yml @@ -1,6 +1,6 @@ # SPDX-License-Identifier: MIT name: test -on: [pull_request] +on: [pull_request_target] jobs: test: runs-on: docker diff --git a/tests/origin-fork-destination/.forgejo/workflows/test.yml b/tests/origin-fork-destination/.forgejo/workflows/test.yml new file mode 100644 index 0000000..4bd12b8 --- /dev/null +++ b/tests/origin-fork-destination/.forgejo/workflows/test.yml @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: MIT +name: test +on: + pull_request_target: + types: + - opened + - synchronize + - closed +jobs: + test: + runs-on: docker + steps: + - uses: actions/checkout@v4 + - uses: SELF@vTest + with: + origin-url: ${{ env.GITHUB_SERVER_URL }} + origin-repo: user1/origin-fork-destination + origin-token: ${{ secrets.ORIGIN_TOKEN }} + origin-pr: ${{ github.event.pull_request.number }} + destination-url: ${{ env.GITHUB_SERVER_URL }} + destination-repo: user2/destinationrepo + destination-fork-repo: user3/destinationrepo + destination-branch: main + destination-token: ${{ secrets.DESTINATION_TOKEN }} + update: ./upgraded + debug: true diff --git a/tests/origin-fork-destination/README b/tests/origin-fork-destination/README new file mode 100644 index 0000000..d2b2178 --- /dev/null +++ b/tests/origin-fork-destination/README @@ -0,0 +1 @@ +originrepo diff --git a/tests/origin-fork-destination/upgraded b/tests/origin-fork-destination/upgraded new file mode 100755 index 0000000..94bb293 --- /dev/null +++ b/tests/origin-fork-destination/upgraded @@ -0,0 +1,14 @@ +#!/bin/bash + +set -ex + +destination_checkout="$1" +destination_pr_json="$2" +origin_checkout="$3" +origin_pr_json="$4" + +test -d $destination_checkout +test -d $origin_checkout +test -f $origin_pr_json + +date +%s > $destination_checkout/last diff --git a/tests/run.sh b/tests/run.sh index 59cabd7..7e8773f 100755 --- a/tests/run.sh +++ b/tests/run.sh @@ -58,8 +58,10 @@ function user_create() { } function close_pull_request() { - forgejo-curl.sh api_json ${options[url]}/api/v1/repos/user1/originrepo/pulls | jq --raw-output '.[] | .number' | while read pr ; do - forgejo-curl.sh api_json -X PATCH --data '{"state":"closed"}' ${options[url]}/api/v1/repos/user1/originrepo/issues/$pr + local repo=$1 + + forgejo-curl.sh api_json ${options[url]}/api/v1/repos/user1/${repo}/pulls | jq --raw-output '.[] | .number' | while read pr ; do + forgejo-curl.sh api_json -X PATCH --data '{"state":"closed"}' ${options[url]}/api/v1/repos/user1/${repo}/issues/$pr done } @@ -194,21 +196,25 @@ function fixture() { local destination=$2 orgs_delete + + user_create user3 user3@example.com + user_curl user3 api_json --data '{"username":"destination-fork"}' ${options[url]}/api/v1/orgs + user_create user2 user2@example.com forgejo-test-helper.sh push tests/${destination} http://user2:admin1234@${options[host_port]} user2 ${destination} user_create user1 user1@example.com forgejo-test-helper.sh push tests/${origin} http://user1:admin1234@${options[host_port]} user1 ${origin} cascading-pr - user_curl user1 api_json --data '{"username":"fork-org"}' ${options[url]}/api/v1/orgs - user_curl user1 api_json --data '{"organization":"fork-org"}' ${options[url]}/api/v1/repos/user1/${origin}/forks + user_curl user1 api_json --data '{"username":"origin-fork"}' ${options[url]}/api/v1/orgs + user_curl user1 api_json --data '{"organization":"origin-fork"}' ${options[url]}/api/v1/repos/user1/${origin}/forks user_secret user1 ORIGIN_TOKEN $(user_token user1 ORIGIN_TOKEN) - user_secret user1 DESTINATION_TOKEN $(user_token user2 DESTINATION_TOKEN) push_self } function no_change_no_cascade_pr() { fixture originrepo-do-nothing destinationrepo + user_secret user1 DESTINATION_TOKEN $(user_token user2 DESTINATION_TOKEN) create_pull_request_case1 user1 user1 originrepo-do-nothing wait_success ${options[url]}/api/v1/repos/user1/originrepo-do-nothing $(cat $TMPDIR/user1-originrepo-do-nothing.sha) @@ -217,11 +223,12 @@ function no_change_no_cascade_pr() { function create_and_close() { fixture originrepo destinationrepo + user_secret user1 DESTINATION_TOKEN $(user_token user2 DESTINATION_TOKEN) create_pull_request_case1 user1 user1 originrepo wait_success ${options[url]}/api/v1/repos/user1/originrepo $(cat $TMPDIR/user1-originrepo.sha) has_cascade_pull_request - close_pull_request + close_pull_request originrepo wait_success ${options[url]}/api/v1/repos/user1/originrepo $(cat $TMPDIR/user1-originrepo.sha) } @@ -233,23 +240,26 @@ function taint_update() { echo 'TAINTED' > upgraded } -function create_from_fork_and_close() { +function create_from_origin_fork_and_close() { fixture originrepo destinationrepo + user_secret user1 DESTINATION_TOKEN $(user_token user2 DESTINATION_TOKEN) delete_pull_requests user1 originrepo - create_branch1 fork-org originrepo taint_update - create_pull_request user1 fork-org originrepo + create_branch1 origin-fork originrepo taint_update + create_pull_request user1 origin-fork originrepo - wait_success ${options[url]}/api/v1/repos/user1/originrepo $(cat $TMPDIR/fork-org-originrepo.sha) + wait_success ${options[url]}/api/v1/repos/user1/originrepo $(cat $TMPDIR/origin-fork-originrepo.sha) has_cascade_pull_request - close_pull_request - wait_success ${options[url]}/api/v1/repos/user1/originrepo $(cat $TMPDIR/fork-org-originrepo.sha) + close_pull_request originrepo + wait_success ${options[url]}/api/v1/repos/user1/originrepo $(cat $TMPDIR/origin-fork-originrepo.sha) } function create_and_merge() { fixture originrepo destinationrepo + user_secret user1 DESTINATION_TOKEN $(user_token user2 DESTINATION_TOKEN) create_pull_request_case1 user1 user1 originrepo + wait_success ${options[url]}/api/v1/repos/user1/originrepo $(cat $TMPDIR/user1-originrepo.sha) has_cascade_pull_request merge_pull_request originrepo @@ -257,10 +267,24 @@ function create_and_merge() { has_cascade_pull_request } +function create_in_destination_fork_and_close() { + fixture origin-fork-destination destinationrepo + user_secret user1 DESTINATION_TOKEN $(user_token user3 DESTINATION_TOKEN) + + create_pull_request_case1 user1 user1 origin-fork-destination + + wait_success ${options[url]}/api/v1/repos/user1/origin-fork-destination $(cat $TMPDIR/user1-origin-fork-destination.sha) + has_cascade_pull_request + close_pull_request origin-fork-destination + wait_success ${options[url]}/api/v1/repos/user1/origin-fork-destination $(cat $TMPDIR/user1-origin-fork-destination.sha) +} + function create_and_merge_close() { fixture originrepo-close-merge destinationrepo + user_secret user1 DESTINATION_TOKEN $(user_token user2 DESTINATION_TOKEN) create_pull_request_case1 user1 user1 originrepo-close-merge + wait_success ${options[url]}/api/v1/repos/user1/originrepo-close-merge $(cat $TMPDIR/user1-originrepo-close-merge.sha) has_cascade_pull_request merge_pull_request originrepo-close-merge @@ -269,7 +293,7 @@ function create_and_merge_close() { } function integration() { - for t in no_change_no_cascade_pr create_from_fork_and_close create_and_close create_and_merge create_and_merge_close; do + for t in create_in_destination_fork_and_close no_change_no_cascade_pr create_from_origin_fork_and_close create_and_close create_and_merge create_and_merge_close; do log_info "running $t" $t done