From 69ff934a42ab694f7ca90ecaa1724e5dcccc5780 Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Mon, 10 Feb 2025 13:08:31 +0100 Subject: [PATCH] Update autolabeler.yml --- .github/workflows/autolabeler.yml | 71 +++++++++++++++++-------------- 1 file changed, 39 insertions(+), 32 deletions(-) diff --git a/.github/workflows/autolabeler.yml b/.github/workflows/autolabeler.yml index 660135f5..8eeade3c 100644 --- a/.github/workflows/autolabeler.yml +++ b/.github/workflows/autolabeler.yml @@ -13,50 +13,57 @@ jobs: env: CONFIG_PATH: .github/autolabeler-config.json steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Install minimatch - run: npm install minimatch - - name: Label PR based on config rules uses: actions/github-script@v7 with: script: | const fs = require('fs').promises; - const path = require('path'); const { minimatch } = require('minimatch'); - const configPath = path.resolve(process.env.CONFIG_PATH); - const fileContent = await fs.readFile(configPath, 'utf-8'); - const autolabelerConfig = JSON.parse(fileContent); - + const configPath = process.env.CONFIG_PATH; + let config; + try { + const fileContent = await fs.readFile(configPath, 'utf-8'); + config = JSON.parse(fileContent); + } catch (error) { + console.error(`❌ Fehler beim Laden der Konfigurationsdatei: ${error.message}`); + return; + } + const prNumber = context.payload.pull_request.number; - const prListFilesResponse = await github.rest.pulls.listFiles({ + const prFiles = (await github.rest.pulls.listFiles({ owner: context.repo.owner, repo: context.repo.repo, pull_number: prNumber, - }); - const prFiles = prListFilesResponse.data; + })).data; - for (const [label, rules] of Object.entries(autolabelerConfig)) { - const shouldAddLabel = prFiles.some((prFile) => { - return rules.some((rule) => { - const isFileStatusMatch = rule.fileStatus ? rule.fileStatus === prFile.status : true; - const isIncludeGlobMatch = rule.includeGlobs.some((glob) => minimatch(prFile.filename, glob)); - const isExcludeGlobMatch = rule.excludeGlobs.some((glob) => minimatch(prFile.filename, glob)); - - return isFileStatusMatch && isIncludeGlobMatch && !isExcludeGlobMatch; - }); - }); + let labelsToAdd = new Set(); - if (shouldAddLabel) { - console.log(`Adding label ${label} to PR ${prNumber}`); - await github.rest.issues.addLabels({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber, - labels: [label], - }); + for (const [label, rules] of Object.entries(config)) { + if (prFiles.some(prFile => + rules.some(rule => + (!rule.fileStatus || rule.fileStatus === prFile.status) && + rule.includeGlobs.some(glob => minimatch(prFile.filename, glob)) && + !rule.excludeGlobs.some(glob => minimatch(prFile.filename, glob)) + ) + )) { + labelsToAdd.add(label); } } + + const existingLabels = new Set((await github.rest.issues.listLabelsOnIssue({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + })).data.map(l => l.name)); + + labelsToAdd = [...labelsToAdd].filter(label => !existingLabels.has(label)); + + if (labelsToAdd.length > 0) { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + labels: labelsToAdd, + }); + }