diff --git a/.github/workflows/merge-conflict-label.yml b/.github/workflows/merge-conflict-label.yml new file mode 100644 index 00000000..9b988a81 --- /dev/null +++ b/.github/workflows/merge-conflict-label.yml @@ -0,0 +1,56 @@ +name: Label PR merge conflicts + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + +jobs: + label-conflict: + runs-on: ubuntu-latest + permissions: + pull-requests: write + contents: read + steps: + - name: Get PR data and label conflicts + uses: actions/github-script@v7 + with: + script: | + const pr = context.payload.pull_request; + const prNumber = pr.number; + const repo = context.repo; + + // Fetch PR details to get mergeable_state + const { data: prData } = await github.rest.pulls.get({ + ...repo, + pull_number: prNumber + }); + + const mergeableState = prData.mergeable_state; // clean, dirty, blocked, unstable + const hasConflict = mergeableState === 'dirty'; + + const labelName = 'merge-conflict'; + + // Get current labels + const { data: labels } = await github.rest.issues.listLabelsOnIssue({ + ...repo, + issue_number: prNumber + }); + const hasLabel = labels.some(l => l.name === labelName); + + if (hasConflict && !hasLabel) { + console.log(`PR #${prNumber} has merge conflicts. Adding label '${labelName}'.`); + await github.rest.issues.addLabels({ + ...repo, + issue_number: prNumber, + labels: [labelName] + }); + } else if (!hasConflict && hasLabel) { + console.log(`PR #${prNumber} no longer has merge conflicts. Removing label '${labelName}'.`); + await github.rest.issues.removeLabel({ + ...repo, + issue_number: prNumber, + name: labelName + }); + } else { + console.log(`PR #${prNumber}: conflict=${hasConflict}, label=${hasLabel}. No change needed.`); + } \ No newline at end of file