From c470d8d8f430b5a300ed908e6c57ad84934b76a7 Mon Sep 17 00:00:00 2001 From: Andy Augustin Date: Wed, 13 Mar 2024 21:37:27 +0100 Subject: [PATCH] feat(#482): :sparkles: add option to force push and pr Signed-off-by: Andy Augustin --- README.md | 1 + action.yml | 4 +++ src/sync_template.sh | 58 ++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 58 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index cf438697..5d82b0ec 100644 --- a/README.md +++ b/README.md @@ -247,6 +247,7 @@ jobs: | is_dry_run | `[optional]` set to `true` if you do not want to push the changes and not want to create a PR | `false` | | | is_allow_hooks | `[optional]` set to `true` if you want to enable lifecycle hooks. Use this with caution! | `false` | `false` | | hooks | `[optional]` please check the lifecycle hooks section below | `false` | | +| is_force_push_pr | `[optional]` set to `true` if you want to force push and pr update | `false` | `false` | | is_pr_cleanup | `[optional]` set to `true` if you want to cleanup older PRs targeting the same branch. Use this with caution! | `false` | `false` | | is_not_source_github | `[optional]` set to `true` if the source git provider is not GitHub | `false` | `false` | | is_force_deletion | `[optional]` set to `true` if you want to force delete files which are deleted within the source repository even if they contain changes. You need to also adjust `git_remote_pull_params` (see below for details) | `false` | `false` | diff --git a/action.yml b/action.yml index 41f8b6b5..9483449f 100644 --- a/action.yml +++ b/action.yml @@ -42,6 +42,9 @@ inputs: default: "false" hooks: description: "[optional] define the hooks as yaml string input" + is_force_push_pr: + description: "[optional] set to true if you want to force push and pr update" + default: "false" is_pr_cleanup: description: "[optional] set to true if you want to cleanup older PRs targeting the same branch." default: "false" @@ -79,6 +82,7 @@ runs: IS_DRY_RUN: ${{ inputs.is_dry_run }} IS_ALLOW_HOOKS: ${{ inputs.is_allow_hooks }} HOOKS: ${{ inputs.hooks }} + IS_FORCE_PUSH_PR: ${{ inputs.is_force_push_pr }} IS_PR_CLEANUP: ${{ inputs.is_pr_cleanup}} IS_NOT_SOURCE_GITHUB: ${{ inputs.is_not_source_github }} IS_FORCE_DELETION: ${{ inputs.is_force_deletion }} diff --git a/src/sync_template.sh b/src/sync_template.sh index e09309d4..de7ab308 100644 --- a/src/sync_template.sh +++ b/src/sync_template.sh @@ -40,6 +40,7 @@ if [[ -n "${SRC_SSH_PRIVATEKEY_ABS_PATH}" ]]; then export GIT_SSH_COMMAND="ssh -i ${SRC_SSH_PRIVATEKEY_ABS_PATH}" fi +IS_FORCE_PUSH_PR="${IS_FORCE_PUSH_PR:-"false"}" GIT_REMOTE_PULL_PARAMS="${GIT_REMOTE_PULL_PARAMS:---allow-unrelated-histories --squash --strategy=recursive -X theirs}" cmd_from_yml "install" @@ -238,11 +239,19 @@ function eventual_create_labels () { # push the changes # Arguments: # branch +# is_force ############################## function push () { info "push changes" local branch=$1 - git push --set-upstream origin "${branch}" + local is_force=$2 + + if [ "$is_force" == true ] ; then + warn "forcing the push." + git push --force --set-upstream origin "${branch}" + else + git push --set-upstream origin "${branch}" + fi } #################################### @@ -254,7 +263,7 @@ function push () { # labels # reviewers ################################### -function create_pr () { +function create_pr() { info "create pr" local title=$1 local body=$2 @@ -267,7 +276,38 @@ function create_pr () { --body "${body}" \ --base "${branch}" \ --label "${labels}" \ - --reviewer "${reviewers}" + --reviewer "${reviewers}" || create_pr_has_issues=true + + if [ "$create_pr_has_issues" == true ] ; then + warn "Creating the PR failed." + warn "Eventually it is already existent." + return 1 + fi + return 0 +} + +#################################### +# creates or edits a pr if already existent +# Arguments: +# title +# body +# branch +# labels +# reviewers +################################### +function create_or_edit_pr() { + info "create pr or edit the pr" + local title=$1 + local body=$2 + local branch=$3 + local labels=$4 + local reviewers=$5 + + create_pr "${title}" "${body}" "${branch}" "${labels}" "${reviewers}" || gh pr edit \ + --title "${title}" \ + --body "${body}" \ + --add-label "${labels}" \ + --add-reviewer "${reviewers}" } ######################################### @@ -313,6 +353,9 @@ function handle_templatesyncignore() { function prechecks() { info "prechecks" echo "::group::prechecks" + if [ "${IS_FORCE_PUSH_PR}" == "true" ]; then + warn "skipping prechecks because we force push and pr" + fi check_branch_remote_existing "${NEW_BRANCH}" check_if_commit_already_in_hist_graceful_exit "${TEMPLATE_REMOTE_GIT_HASH}" @@ -391,9 +434,14 @@ function push_prepare_pr_create_pr() { echo "::group::push changes and create PR" cmd_from_yml "prepush" - push "${NEW_BRANCH}" + push "${NEW_BRANCH}" "${IS_FORCE_PUSH_PR}" cmd_from_yml "prepr" - create_pr "${PR_TITLE}" "${PR_BODY}" "${UPSTREAM_BRANCH}" "${PR_LABELS}" "${PR_REVIEWERS}" + if [ "$IS_FORCE_PUSH_PR" == true ] ; then + create_or_edit_pr "${PR_TITLE}" "${PR_BODY}" "${UPSTREAM_BRANCH}" "${PR_LABELS}" "${PR_REVIEWERS}" + else + create_pr "${PR_TITLE}" "${PR_BODY}" "${UPSTREAM_BRANCH}" "${PR_LABELS}" "${PR_REVIEWERS}" + fi + echo "::endgroup::" }