1
0
Fork 0
mirror of https://code.forgejo.org/actions/cascading-pr synced 2025-03-14 22:36:58 +01:00

close-merge input

Fixes: https://code.forgejo.org/actions/cascading-pr/issues/7
This commit is contained in:
Earl Warren 2023-10-24 22:51:30 +02:00
parent f8a65b3d9f
commit 5caaedbc52
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
7 changed files with 80 additions and 9 deletions

View file

@ -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 |
<!-- action-docs-inputs -->

View file

@ -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

View file

@ -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}"

View file

@ -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

View file

@ -0,0 +1 @@
originrepo

View file

@ -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

View file

@ -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() {