Skip to content
Open
97 changes: 97 additions & 0 deletions .github/workflows/needs-changes.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
name: PR Review Label Management

on:
pull_request_review:
types: [submitted]
issue_comment:
types: [created]
pull_request:
types: [labeled]

permissions:
pull-requests: write

jobs:
manage-review-labels:
runs-on: ubuntu-latest
steps:
- name: Handle review submission
if: github.event_name == 'pull_request_review'
uses: actions/github-script@v7
with:
script: |
const { owner, repo } = context.repo;
const pr_number = context.payload.pull_request.number;
const review_state = context.payload.review.state;

// Remove needs-review label when any review is submitted
try {
await github.rest.issues.removeLabel({
owner,
repo,
issue_number: pr_number,
name: 'needs-review'
});
console.log('Removed needs-review label');
} catch (error) {
console.log('needs-review label not found or already removed');
}

// Add needs-changes label for non-approved reviews
if (review_state === 'changes_requested' || review_state === 'commented') {
try {
await github.rest.issues.addLabels({
owner,
repo,
issue_number: pr_number,
labels: ['needs-changes']
});
console.log('Added needs-changes label');
} catch (error) {
console.log('Error adding needs-changes label:', error.message);
}
}

- name: Handle manual needs-changes via comment
if: github.event_name == 'issue_comment' && github.event.issue.pull_request
uses: actions/github-script@v7
with:
script: |
const comment = context.payload.comment.body.toLowerCase();

if (comment.includes('needs-changes') || comment.includes('/needs-changes')) {
const { owner, repo } = context.repo;
const issue_number = context.payload.issue.number;

try {
await github.rest.issues.addLabels({
owner,
repo,
issue_number,
labels: ['needs-changes']
});
console.log('Added needs-changes label via comment');
} catch (error) {
console.log('Error adding needs-changes label:', error.message);
}
}

- name: Remove needs-changes when lgtm is added
if: github.event_name == 'pull_request' && github.event.action == 'labeled' && github.event.label.name == 'lgtm'
uses: actions/github-script@v7
with:
script: |
const { owner, repo } = context.repo;
const pr_number = context.payload.pull_request.number;

try {
await github.rest.issues.removeLabel({
owner,
repo,
issue_number: pr_number,
name: 'needs-changes'
});
console.log('Removed needs-changes label when lgtm was added');
} catch (error) {
console.log('needs-changes label not found or already removed');
}
83 changes: 83 additions & 0 deletions .github/workflows/needs-review.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
name: Auto-label PR for review

on:
pull_request_target:
types: [opened, edited, ready_for_review, labeled]
issue_comment:
types: [created]
permissions:
pull-requests: write

jobs:
auto-label:
runs-on: ubuntu-latest
if: >
github.event_name == 'pull_request_target' &&
contains(fromJSON('["opened", "edited", "ready_for_review"]'), github.event.action) &&
github.event.pull_request.draft == false &&
github.event.pull_request.user.login != 'red-hat-konflux' &&
!contains(github.event.pull_request.title, 'WIP')
steps:
- name: Add needs-review label
uses: actions/github-script@v7
with:
script: |
github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: ['needs-review']
});

manual-needs-review:
runs-on: ubuntu-latest
if: github.event_name == 'issue_comment' && github.event.issue.pull_request
steps:
- name: Add needs-review label via comment
uses: actions/github-script@v7
with:
script: |
const comment = context.payload.comment.body.toLowerCase();

if (comment.includes('needs-review') || comment.includes('/needs-review')) {
const { owner, repo } = context.repo;
const issue_number = context.payload.issue.number;

try {
await github.rest.issues.addLabels({
owner,
repo,
issue_number,
labels: ['needs-review']
});
console.log('Added needs-review label via comment');
} catch (error) {
console.log('Error adding needs-review label:', error.message);
}
}

remove-needs-review-on-needs-changes:
runs-on: ubuntu-latest
if: >
github.event_name == 'pull_request_target' &&
github.event.action == 'labeled' &&
github.event.label.name == 'needs-changes'
steps:
- name: Remove needs-review label when needs-changes is added
uses: actions/github-script@v7
with:
script: |
const { owner, repo } = context.repo;
const pr_number = context.payload.pull_request.number;

try {
await github.rest.issues.removeLabel({
owner,
repo,
issue_number: pr_number,
name: 'needs-review'
});
console.log('Removed needs-review label when needs-changes was added');
} catch (error) {
console.log('needs-review label not found or already removed');
}