From 6e9d64e8cd969c4b61b58b7c82374e264e9105d3 Mon Sep 17 00:00:00 2001 From: Rizel Scarlett Date: Wed, 2 Oct 2024 14:37:28 -0400 Subject: [PATCH] Automating adding Hacktoberfest labels (#300) * Automating adding Hacktoberfest labels * shouldn't fail if issue number isnt present * won't fail if issue number isnt found * fix typo --------- Co-authored-by: Rizel Scarlett --- .github/PULL_REQUEST_TEMPLATE.md | 83 +++++++++++++++++++ .../workflows/add-hacktoberfest-labels.yml | 79 ++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/add-hacktoberfest-labels.yml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..a676b8f --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,83 @@ + + +## What type of PR is this? (check all applicable) + +- [ ] โ™ป๏ธ Refactor +- [ ] โœจ New Feature +- [ ] ๐Ÿ› Bug Fix +- [ ] ๐Ÿ“ Documentation Update +- [ ] ๐Ÿ‘ท Example Application +- [ ] ๐Ÿง‘โ€๐Ÿ’ป Code Snippet +- [ ] ๐ŸŽจ Design +- [ ] ๐Ÿ“– Content +- [ ] ๐Ÿงช Tests +- [ ] ๐Ÿ”– Release +- [ ] ๐Ÿšฉ Other + +## Description + + + +This PR [adds/removes/fixes/replaces] this [feature/bug/etc]. + +## Related Tickets & Documents + +Resolves # + +## Mobile & Desktop Screenshots/Recordings + + + +## Added code snippets? +- [ ] ๐Ÿ‘ yes +- [ ] ๐Ÿ™… no, because they aren't needed + +## Added tests? + +- [ ] ๐Ÿ‘ yes +- [ ] ๐Ÿ™… no, because they aren't needed +- [ ] ๐Ÿ™‹ no, because I need help + +### No tests? Add a note + + +## Added to documentation? + +- [ ] ๐Ÿ“œ readme +- [ ] ๐Ÿ“œ contributing.md +- [ ] ๐Ÿ““ general documentation +- [ ] ๐Ÿ™… no documentation needed + +### No docs? Add a note + + +## [optional] Are there any post-deployment tasks we need to perform? + + + +## [optional] What gif best describes this PR or how it makes you feel? + + + + \ No newline at end of file diff --git a/.github/workflows/add-hacktoberfest-labels.yml b/.github/workflows/add-hacktoberfest-labels.yml new file mode 100644 index 0000000..14b7dff --- /dev/null +++ b/.github/workflows/add-hacktoberfest-labels.yml @@ -0,0 +1,79 @@ +name: Propagate Issue Labels to PR +on: + pull_request: + types: [opened, synchronize] +jobs: + copy_labels: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Get issue number from PR body + id: issue_number + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prBody = context.payload.pull_request.body || ''; + // Remove HTML comments + const bodyWithoutComments = prBody.replace(//g, ''); + // Find issue number + const match = bodyWithoutComments.match(/(?:Resolves|Closes) #(\d+)/); + const issueNumber = match ? match[1] : null; + if (issueNumber) { + console.log(`Issue number found: ${issueNumber}`); + core.setOutput('has_issue', 'true'); + core.setOutput('issue_number', issueNumber); + } else { + console.log('No issue number found in PR body'); + core.setOutput('has_issue', 'false'); + } + - name: Get labels from linked issue + if: steps.issue_number.outputs.has_issue == 'true' + uses: actions/github-script@v6 + id: issue_labels + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const issue_number = ${{ steps.issue_number.outputs.issue_number }}; + try { + const issue = await github.rest.issues.get({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: parseInt(issue_number) + }); + return issue.data.labels.map(label => label.name); + } catch (error) { + console.log(`Error fetching issue labels: ${error}`); + return []; + } + - name: Check for required labels + if: steps.issue_number.outputs.has_issue == 'true' && steps.issue_labels.outputs.result != '[]' + id: check_labels + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const labels = ${{ steps.issue_labels.outputs.result }}; + const hacktoberfestLabel = labels.some(label => label.toLowerCase().includes('hacktoberfest')); + const sizeLabelPresent = labels.some(label => ['small', 'medium', 'large'].includes(label.toLowerCase())); + return hacktoberfestLabel || sizeLabelPresent; + - name: Add labels to PR + if: steps.issue_number.outputs.has_issue == 'true' && steps.check_labels.outputs.result == 'true' + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const pr_number = context.issue.number; + const labels = ${{ steps.issue_labels.outputs.result }}; + try { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr_number, + labels: labels + }); + console.log('Labels added successfully'); + } catch (error) { + console.log(`Error adding labels: ${error}`); + }