name: PR Format Validation on: pull_request: types: [opened, edited, synchronize] jobs: validate-pr: runs-on: ubuntu-latest steps: - name: Check for Spam PR uses: actions/github-script@v7 with: script: | const prTitle = context.payload.pull_request.title; const spamRegex = /^(feat|chore|fix)(\(.*\))?\s*:/i; if (spamRegex.test(prTitle)) { // Leave a comment explaining why await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.payload.pull_request.number, body: `## PR Closed as Spam This PR was automatically closed because the title format \`feat:\`, \`fix:\`, or \`chore:\` is commonly associated with spam contributions. If this is a legitimate contribution, please: 1. Review our contribution guidelines 2. Use the correct PR title format: \`directory, ...: description\` 3. Open a new PR with the proper title format Thank you for your understanding.` }); // Close the PR await github.rest.pulls.update({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.payload.pull_request.number, state: 'closed' }); core.setFailed('PR closed as spam due to suspicious title format'); return; } console.log('✅ PR passed spam check'); - name: Checkout repository uses: actions/checkout@v4 - name: Check PR Title Format uses: actions/github-script@v7 with: script: | const fs = require('fs'); const path = require('path'); const prTitle = context.payload.pull_request.title; const titleRegex = /^([\w\s,{}/.]+): .+/; if (!titleRegex.test(prTitle)) { core.setFailed(`PR title "${prTitle}" does not match required format: directory, ...: description`); return; } const match = prTitle.match(titleRegex); const dirPart = match[1]; const directories = dirPart.split(',').map(d => d.trim()); const missingDirs = []; for (const dir of directories) { const fullPath = path.join(process.env.GITHUB_WORKSPACE, dir); if (!fs.existsSync(fullPath)) { missingDirs.push(dir); } } if (missingDirs.length > 0) { core.setFailed(`The following directories in the PR title do not exist: ${missingDirs.join(', ')}`); return; } console.log('✅ PR title format is valid');