From 5caaedbc525182264fdddffb6a5d2be0a244ed89 Mon Sep 17 00:00:00 2001 From: Earl Warren Date: Tue, 24 Oct 2023 22:51:30 +0200 Subject: [PATCH] close-merge input Fixes: https://code.forgejo.org/actions/cascading-pr/issues/7 --- README.md | 1 + action.yml | 4 +++ cascading-pr.sh | 22 ++++++++++++---- .../.forgejo/workflows/test.yml | 26 +++++++++++++++++++ tests/originrepo-close-merge/README | 1 + tests/originrepo-close-merge/upgraded | 12 +++++++++ tests/run.sh | 23 +++++++++++++--- 7 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 tests/originrepo-close-merge/.forgejo/workflows/test.yml create mode 100644 tests/originrepo-close-merge/README create mode 100755 tests/originrepo-close-merge/upgraded diff --git a/README.md b/README.md index d823cec..9ad51f8 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ pushed as a new commit in the PR. | destination-token | a token with write permission on destination-repo | `true` | | | update | path to the script to update the content of the cascading PR | `true` | | | prefix | prefix of the cascading PR created on destination-repo (default to {origin-repo}) | `false` | | +| close-merge | if true the cascading PR will be closed and the branch deleted when the PR is merged | `false` | false | | verbose | if true print verbose information | `false` | false | | debug | if true print debug information | `false` | false | diff --git a/action.yml b/action.yml index 33b6f63..80766c3 100644 --- a/action.yml +++ b/action.yml @@ -60,6 +60,9 @@ inputs: required: true prefix: description: 'prefix of the cascading PR created on destination-repo (default to {origin-repo})' + close-merge: + description: 'if true the cascading PR will be closed and the branch deleted when the PR is merged' + default: false verbose: description: 'if true print verbose information' default: false @@ -97,4 +100,5 @@ runs: --destination-branch "${{ inputs.destination-branch }}" \ --update "${{ inputs.update }}" \ --prefix "${{ inputs.prefix }}" \ + --close-merge "${{ inputs.close-merge }}" \ run diff --git a/cascading-pr.sh b/cascading-pr.sh index bb5a11b..92bf539 100755 --- a/cascading-pr.sh +++ b/cascading-pr.sh @@ -241,6 +241,7 @@ function finalize_options() { options[destination_base]=${options[destination_branch]} : ${options[prefix]:=${options[origin_repo]}} options[destination_head]=${options[prefix]}-${options[origin_pr]} + : ${options[close_merge]:=false} } function run() { @@ -262,11 +263,17 @@ function run() { ;; closed) if "$(pr_merged origin)"; then - log_info "PR was merged, update the cascade PR" - repo_login ${options[destination_repo]} - pr_get origin - pr_get destination - update + if "${options[close_merge]}" ; then + log_info "PR is merged, close the cascade PR and remove the branch" + repo_login ${options[destination_repo]} + close_pr + else + log_info "PR was merged, update the cascade PR" + repo_login ${options[destination_repo]} + pr_get origin + pr_get destination + update + fi else log_info "PR is closed, close the cascade PR and remove the branch" repo_login ${options[destination_repo]} @@ -340,6 +347,11 @@ function main() { options[prefix]=$1 shift ;; + --close-merge) + shift + options[close_merge]=$1 + shift + ;; *) finalize_options "${1:-run}" diff --git a/tests/originrepo-close-merge/.forgejo/workflows/test.yml b/tests/originrepo-close-merge/.forgejo/workflows/test.yml new file mode 100644 index 0000000..6d16a3b --- /dev/null +++ b/tests/originrepo-close-merge/.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/originrepo-close-merge + origin-token: ${{ secrets.ORIGIN_TOKEN }} + origin-pr: ${{ github.event.pull_request.number }} + destination-url: ${{ env.GITHUB_SERVER_URL }} + destination-repo: user2/destinationrepo + destination-branch: main + destination-token: ${{ secrets.DESTINATION_TOKEN }} + update: ./upgraded + close-merge: true + debug: true diff --git a/tests/originrepo-close-merge/README b/tests/originrepo-close-merge/README new file mode 100644 index 0000000..d2b2178 --- /dev/null +++ b/tests/originrepo-close-merge/README @@ -0,0 +1 @@ +originrepo diff --git a/tests/originrepo-close-merge/upgraded b/tests/originrepo-close-merge/upgraded new file mode 100755 index 0000000..f53c79f --- /dev/null +++ b/tests/originrepo-close-merge/upgraded @@ -0,0 +1,12 @@ +#!/bin/bash + +set -ex + +destination_checkout="$1" +destination_pr_json="$2" +origin_pr_json="$3" + +test -d $destination_checkout +test -f $origin_pr_json + +date +%s > $destination_checkout/last diff --git a/tests/run.sh b/tests/run.sh index 2791f48..a054f9d 100755 --- a/tests/run.sh +++ b/tests/run.sh @@ -64,13 +64,15 @@ function close_pull_request() { } function merge_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 --data '{"Do":"merge"}' ${options[url]}/api/v1/repos/user1/originrepo/pulls/$pr/merge + 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 --data '{"Do":"merge"}' ${options[url]}/api/v1/repos/user1/${repo}/pulls/$pr/merge done } function has_cascade_pull_request() { - pr_count=$(forgejo-curl.sh api_json ${options[url]}/api/v1/repos/user2/destinationrepo/pulls | jq '. | length') + pr_count=$(forgejo-curl.sh api_json ${options[url]}/api/v1/repos/user2/destinationrepo/pulls | jq '[ .[] | select(.state == "open") ] | length') test $pr_count -gt 0 } @@ -227,8 +229,20 @@ function create_and_merge() { create_pull_request user1 user1 originrepo wait_success ${options[url]}/api/v1/repos/user1/originrepo $(cat $TMPDIR/user1-originrepo.sha) has_cascade_pull_request - merge_pull_request + merge_pull_request originrepo wait_success ${options[url]}/api/v1/repos/user1/originrepo $(cat $TMPDIR/user1-originrepo.sha) + has_cascade_pull_request +} + +function create_and_merge_close() { + fixture originrepo-close-merge destinationrepo + + create_pull_request 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 + wait_success ${options[url]}/api/v1/repos/user1/originrepo-close-merge $(cat $TMPDIR/user1-originrepo-close-merge.sha) + ! has_cascade_pull_request } function integration() { @@ -236,6 +250,7 @@ function integration() { create_from_fork_and_close create_and_close create_and_merge + create_and_merge_close } function unit() {