From ace5b13a7c7ba16eb805d61bc2d59528bd731825 Mon Sep 17 00:00:00 2001 From: JeanExtreme002 Date: Wed, 13 May 2026 01:54:11 -0300 Subject: [PATCH 1/2] ci: auto-delete PR head branch after merge GitHub's repo-level "automatically delete head branches" is off, so merged branches linger (e.g. jeanextreme002/* and ci/* from recent PRs). This workflow deletes the head ref when a PR from this repo is merged, skipping protected branches (main, gh-pages) and PRs from forks. --- .github/workflows/delete-merged-branch.yml | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/delete-merged-branch.yml diff --git a/.github/workflows/delete-merged-branch.yml b/.github/workflows/delete-merged-branch.yml new file mode 100644 index 0000000..7929e33 --- /dev/null +++ b/.github/workflows/delete-merged-branch.yml @@ -0,0 +1,43 @@ +name: Delete merged branch + +on: + pull_request: + types: [closed] + +permissions: + contents: write + +jobs: + delete: + name: Delete head branch after merge + if: >- + github.event.pull_request.merged == true && + github.event.pull_request.head.repo.full_name == github.repository + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v7 + with: + script: | + const pr = context.payload.pull_request; + const ref = pr.head.ref; + + const protectedBranches = new Set(["main", "gh-pages"]); + if (protectedBranches.has(ref)) { + core.info(`Refusing to delete protected branch: ${ref}`); + return; + } + + try { + await github.rest.git.deleteRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: `heads/${ref}`, + }); + core.info(`Deleted branch: ${ref}`); + } catch (err) { + if (err.status === 422 || err.status === 404) { + core.info(`Branch already gone: ${ref}`); + return; + } + throw err; + } From 39d9d839a9556394c48804a08bd41de2c12fec7f Mon Sep 17 00:00:00 2001 From: JeanExtreme002 Date: Wed, 13 May 2026 01:56:57 -0300 Subject: [PATCH 2/2] ci: also delete head branch when PR is closed without merge Drop the merged==true guard so abandoned PRs also get their head branch cleaned up. Rename the workflow file/name to match the broader scope. --- .../{delete-merged-branch.yml => delete-pr-branch.yml} | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) rename .github/workflows/{delete-merged-branch.yml => delete-pr-branch.yml} (83%) diff --git a/.github/workflows/delete-merged-branch.yml b/.github/workflows/delete-pr-branch.yml similarity index 83% rename from .github/workflows/delete-merged-branch.yml rename to .github/workflows/delete-pr-branch.yml index 7929e33..4d9f0b1 100644 --- a/.github/workflows/delete-merged-branch.yml +++ b/.github/workflows/delete-pr-branch.yml @@ -1,4 +1,4 @@ -name: Delete merged branch +name: Delete PR branch on: pull_request: @@ -9,10 +9,8 @@ permissions: jobs: delete: - name: Delete head branch after merge - if: >- - github.event.pull_request.merged == true && - github.event.pull_request.head.repo.full_name == github.repository + name: Delete head branch after PR close + if: github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest steps: - uses: actions/github-script@v7