mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 10:22:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
name: Auto Label Pull Requests
 | 
						|
 | 
						|
on:
 | 
						|
  pull_request_target:
 | 
						|
    branches: ["main"]
 | 
						|
    types: [opened, synchronize, reopened, edited]
 | 
						|
 | 
						|
jobs:
 | 
						|
  autolabeler:
 | 
						|
    runs-on: runner-cluster-htl-set
 | 
						|
    permissions:
 | 
						|
      pull-requests: write
 | 
						|
    env:
 | 
						|
      CONFIG_PATH: .github/autolabeler-config.json
 | 
						|
    steps:
 | 
						|
      - name: Checkout repository
 | 
						|
        uses: actions/checkout@v4
 | 
						|
 | 
						|
      - name: Install dependencies
 | 
						|
        run: npm install minimatch
 | 
						|
      
 | 
						|
      - name: Label PR based on file changes and PR template
 | 
						|
        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 prNumber = context.payload.pull_request.number;
 | 
						|
            const prBody = context.payload.pull_request.body.toLowerCase();
 | 
						|
 | 
						|
            let labelsToAdd = new Set();
 | 
						|
 | 
						|
            const prListFilesResponse = await github.rest.pulls.listFiles({
 | 
						|
              owner: context.repo.owner,
 | 
						|
              repo: context.repo.repo,
 | 
						|
              pull_number: prNumber,
 | 
						|
            });
 | 
						|
            const prFiles = prListFilesResponse.data;
 | 
						|
           
 | 
						|
 | 
						|
          
 | 
						|
            // Apply labels based on file changes
 | 
						|
            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;
 | 
						|
                });
 | 
						|
              });
 | 
						|
 | 
						|
              if (shouldAddLabel) {
 | 
						|
                labelsToAdd.add(label);
 | 
						|
              }
 | 
						|
            }
 | 
						|
            //if two labels or more are added, return
 | 
						|
              if (labelsToAdd.size < 2) {
 | 
						|
                const templateLabelMappings = {
 | 
						|
                "🐞 **Bug fix**": "bugfix",
 | 
						|
                "✨ **New feature**": "feature",
 | 
						|
                "💥 **Breaking change**": "breaking change",
 | 
						|
              };
 | 
						|
 | 
						|
              for (const [checkbox, label] of Object.entries(templateLabelMappings)) {
 | 
						|
                const escapedCheckbox = checkbox.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
 | 
						|
                const regex = new RegExp(`- \\[(x|X)\\]\\s*.*${escapedCheckbox}`, "i");
 | 
						|
                const match = prBody.match(regex);              
 | 
						|
                if (match) {
 | 
						|
                  console.log(`Match: ${match}`);
 | 
						|
                  labelsToAdd.add(label);
 | 
						|
                }
 | 
						|
              }
 | 
						|
            }
 | 
						|
 | 
						|
            
 | 
						|
            
 | 
						|
            console.log(`Labels to add: ${Array.from(labelsToAdd).join(", ")}`);
 | 
						|
 | 
						|
            if (labelsToAdd.size > 0) {
 | 
						|
              console.log(`Adding labels ${Array.from(labelsToAdd).join(", ")} to PR ${prNumber}`);
 | 
						|
              await github.rest.issues.addLabels({
 | 
						|
                owner: context.repo.owner,
 | 
						|
                repo: context.repo.repo,
 | 
						|
                issue_number: prNumber,
 | 
						|
                labels: Array.from(labelsToAdd),
 | 
						|
              });
 | 
						|
            }
 |