From cf3d47b15e7598b400406c63c6173ab1fd46f9a9 Mon Sep 17 00:00:00 2001 From: Kevin Aude Date: Tue, 23 Jan 2024 10:11:40 +0100 Subject: [PATCH] feat: automatic label creation * UPDATE main template sync script to support the automatic creation of labels and skip PR cleanup if no labels are set * UPDATE README in order to reflect these changes and explain the reasoning behind it --- README.md | 16 +++++++--- action.yml | 1 + src/sync_template.sh | 73 +++++++++++++++++++++++++++++++++++--------- 3 files changed, 71 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 9ec4fff3..11f45ad2 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} source_repo_path: upstream_branch: # defaults to main - pr_labels: ,[,...] # optional, no default + pr_labels: ,[,...] # defaults to template_sync ``` You will receive a pull request within your repository if there are some changes available in the template. @@ -139,7 +139,7 @@ jobs: github_token: ${{ steps.generate_token.outputs.token }} source_repo_path: upstream_branch: # defaults to main - pr_labels: ,[,...] # optional, no default + pr_labels: ,[,...] # defaults to template_sync ``` #### 2. Using SSH @@ -175,7 +175,7 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} source_repo_path: ${{ secrets.SOURCE_REPO_PATH }} # , should be within secrets upstream_branch: ${{ secrets.TARGET_BRANCH }} # # defaults to main - pr_labels: ,[,...] # optional, no default + pr_labels: ,[,...] # defaults to template_sync source_repo_ssh_private_key: ${{ secrets.SOURCE_REPO_SSH_PRIVATE_KEY }} # contains the private ssh key of the private repository ``` @@ -240,7 +240,7 @@ jobs: | source_repo_ssh_private_key | `[optional]` private ssh key for the source repository. [see](#private-template-repository) | `false` | | | pr_branch_name_prefix | `[optional]` the prefix of branches created by this action | `false` | `chore/template_sync` | | pr_title | `[optional]` the title of PRs opened by this action. Must be already created. | `false` | `upstream merge template repository` | -| pr_labels | `[optional]` comma separated list. [pull request labels][pr-labels]. Must be already created. | `false` | | +| pr_labels | `[optional]` comma separated list. [pull request labels][pr-labels]. | `false` | `sync_template` | | pr_reviewers | `[optional]` comma separated list of pull request reviewers. | `false` | | | pr_commit_msg | `[optional]` commit message in the created pull request | `false` | `chore(template): merge template changes :up:` | | hostname | `[optional]` the hostname of the repository | `false` | `github.com` | @@ -340,6 +340,14 @@ hooks: - echo 'hi, we are within the prepr phase' - echo 'maybe you want to change the code a bit and do another push before creating the pr' ``` +## Labels creation +By default, generated PRs will be labeled with the `template_sync` label. +If that label doesn't exist in your repository, it will be created automatically unless you specify your own existing labels. +Associating a label with the generated PRs helps keeping track of them and allows for features like automatic PR cleanup. + +## Pull request cleanup +Depending on your way of working, you may end up with multiple pull requests related to template syncing pointing to the same branch. +If you want to avoid this situation, you can instruct this action to clean up older PRs pointing to the same branch (search based on labels). ## Troubleshooting diff --git a/action.yml b/action.yml index 3a637093..760b5786 100644 --- a/action.yml +++ b/action.yml @@ -23,6 +23,7 @@ inputs: default: "upstream merge template repository" pr_labels: description: "[optional] comma separated list of pull request labels" + default: "template_sync" pr_reviewers: description: "[optional] comma separated list of pull request reviewers" pr_commit_msg: diff --git a/src/sync_template.sh b/src/sync_template.sh index 97bafc31..9991631c 100644 --- a/src/sync_template.sh +++ b/src/sync_template.sh @@ -66,6 +66,7 @@ echo "::endgroup::" cmd_from_yml_file "prepull" echo "::group::Pull template" + debug "create new branch from default branch with name ${NEW_BRANCH}" git checkout -b "${NEW_BRANCH}" debug "pull changes from template" @@ -97,6 +98,7 @@ fi cmd_from_yml_file "precommit" echo "::group::commit changes" + git add . # we are checking the ignore file if it exists or is empty @@ -124,31 +126,69 @@ echo "::endgroup::" cleanup_older_prs () { cmd_from_yml_file "precleanup" - if [ "$IS_DRY_RUN" != "true" ]; then - echo "::group::cleanup older PRs" - gh pr list \ - --base "${UPSTREAM_BRANCH}" \ - --state open \ - --label "${PR_LABELS}" \ - --json number \ - --template '{{range .}}{{printf "%v" .number}}{{"\n"}}{{end}}' | xargs -L1 gh pr close - echo "::endgroup::" + gh pr list \ + --base "${UPSTREAM_BRANCH}" \ + --state open \ + --label "${PR_LABELS}" \ + --json number \ + --template '{{range .}}{{printf "%v" .number}}{{"\n"}}{{end}}' | xargs -L1 gh pr close +} +echo "::group::cleanup older PRs" + +if [ "$IS_DRY_RUN" != "true" ]; then + if [ "$IS_PR_CLEANUP" != "false" ]; then + if [[ -z "${PR_LABELS}" ]]; then + cleanup_older_prs + else + warn "env var 'PR_LABELS' is empty. Skipping older prs cleanup" + fi else - warn "dry_run option is set to off. Skipping older prs cleanup" + warn "is_pr_cleanup option is set to off. Skipping older prs cleanup" fi +else + warn "dry_run option is set to off. Skipping older prs cleanup" +fi + +echo "::endgroup::" + + +maybe_create_labels () { +all_labels=${PR_LABELS//,/$'\n'} # change the semicolons to white space +for label in $all_labels +do + search_result=$(gh label list \ + --search "${label}" \ + --limit 1 \ + --json name \ + --template '{{range .}}{{printf "%v" .name}}{{"\n"}}{{end}}') + + if [ "${search_result}" = "${label}" ]; then + info "label '${label}' was found in the repository" + else + gh label create "${label}" + info "label '${label}' was missing and has been created" + fi +done } -if [ "$IS_PR_CLEANUP" != "false" ]; then - cleanup_older_prs +echo "::group::check for missing labels" + +if [[ -z "${PR_LABELS}" ]]; then + info "env var 'PR_LABELS' is empty. Skipping labels check" else - warn "is_pr_cleanup option is set to off. Skipping older prs cleanup" + if [ "$IS_DRY_RUN" != "true" ]; then + maybe_create_labels + else + warn "dry_run option is set to off. Skipping labels check" + fi fi +echo "::endgroup::" + push_and_create_pr () { cmd_from_yml_file "prepush" if [ "$IS_DRY_RUN" != "true" ]; then - echo "::group::push changes and create PR" debug "push changes" git push --set-upstream origin "${NEW_BRANCH}" @@ -160,10 +200,13 @@ push_and_create_pr () { --base "${UPSTREAM_BRANCH}" \ --label "${PR_LABELS}" \ --reviewer "${PR_REVIEWERS}" - echo "::endgroup::" else warn "dry_run option is set to off. Skipping push changes and skip create pr" fi } +echo "::group::push changes and create PR" + push_and_create_pr + +echo "::endgroup::"