Skip to content

Optimiere Workflow zum Kopieren von Labels, um verknüpfte Issues über… #7

Optimiere Workflow zum Kopieren von Labels, um verknüpfte Issues über…

Optimiere Workflow zum Kopieren von Labels, um verknüpfte Issues über… #7

name: Copy labels from referenced issues to PR
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review, edited]
permissions:
contents: read
issues: read
pull-requests: write
jobs:
copy-issue-labels:
runs-on: ubuntu-latest
steps:
- name: Copy labels from issues mentioned in PR body
uses: actions/github-script@v7
with:
script: |
const pr = context.payload.pull_request;
const prNumber = pr.number;
const prBody = pr.body || '';
// Finde alle Issue-Referenzen (#12, Fixes #13 etc.)
const issueMatches = [...prBody.matchAll(/(?:Fixes|Closes|Resolves)?\s*#(\d+)/gi)];
const issueNumbers = [...new Set(issueMatches.map(m => parseInt(m[1], 10)))];
if (issueNumbers.length === 0) {
core.info('📭 Keine referenzierten Issues im PR-Text gefunden.');
return;
}
core.info(`🔗 Verlinkte Issues: ${issueNumbers.join(', ')}`);
const allLabels = new Set();
for (const issueNumber of issueNumbers) {
core.info(`📥 Lese Labels von Issue #${issueNumber} ...`);
try {
const issue = await github.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber
});
issue.data.labels.forEach(label => allLabels.add(label.name));
} catch (error) {
core.warning(`⚠️ Issue #${issueNumber} konnte nicht gelesen werden: ${error.message}`);
}
}
const labelList = [...allLabels];
if (labelList.length === 0) {
core.info('📭 Keine Labels zum Übertragen gefunden.');
return;
}
core.info(`🏷️ Übertrage Labels auf PR #${prNumber}: ${labelList.join(', ')}`);
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
labels: labelList
});