diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 22ca09f7f..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,39 +0,0 @@ -# GitHub CODEOWNERS File -# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners - -# Default owner for the entire project -* @Snowiiii - -# Protocol related changes -crates/pumpkin-protocol/ @Snowiiii @xRookieFight -crates/pumpkin/src/net/ @Snowiiii @xRookieFight - -# Bedrock related changes -assets/bedrock/ @ZlordHUN @xRookieFight -crates/pumpkin-protocol/src/bedrock/ @ZlordHUN @xRookieFight @QuantumSegfault -crates/pumpkin/src/net/bedrock/ @ZlordHUN @xRookieFight @QuantumSegfault - -# Command related changes -crates/pumpkin/src/command/ @aure31 - -# Plugin related changes & WASM Host -crates/pumpkin-plugin-api/ @vyPal @yunuservices -crates/pumpkin-plugin-wit/ @vyPal @yunuservices @QuantumSegfault -crates/pumpkin-api-macros/ @vyPal @yunuservices -crates/pumpkin/src/plugin/ @vyPal @yunuservices @QuantumSegfault - -# Documentation related changes -*.md @Q2297045667 -docs/ @Q2297045667 - -# Mob & projectile related changes -crates/pumpkin/src/entity/mob/ @Snowiiii @RoosterBooster007 -crates/pumpkin/src/entity/projectile/ @Snowiiii @RoosterBooster007 - -# Block & item related changes -crates/pumpkin/src/block/ @Snowiiii @RoosterBooster007 -crates/pumpkin/src/item/ @Snowiiii @RoosterBooster007 - -# World generation feature & noise related changes -crates/pumpkin-world/src/generation/feature/ @Snowiiii @RoosterBooster007 -crates/pumpkin-world/src/generation/noise/ @Snowiiii @RoosterBooster007 \ No newline at end of file diff --git a/.github/workflows/reviewers.yml b/.github/workflows/reviewers.yml new file mode 100644 index 000000000..20b0599f4 --- /dev/null +++ b/.github/workflows/reviewers.yml @@ -0,0 +1,87 @@ +name: Request reviewers + +on: + pull_request_target: + types: + - opened + - reopened + - synchronize + - ready_for_review + +permissions: + contents: read + pull-requests: write + +jobs: + request-reviewers: + name: Request reviewers + runs-on: ubuntu-latest + steps: + - name: Request reviewers based on changed files + uses: actions/github-script@v8 + with: + script: | + const rules = [ + { pattern: 'crates/pumpkin-protocol/', reviewers: ['Snowiiii', 'xRookieFight'] }, + { pattern: 'crates/pumpkin/src/net/', reviewers: ['Snowiiii', 'xRookieFight'] }, + + { pattern: 'assets/bedrock/', reviewers: ['ZlordHUN', 'xRookieFight'] }, + { pattern: 'crates/pumpkin-protocol/src/bedrock/', reviewers: ['ZlordHUN', 'xRookieFight', 'QuantumSegfault'] }, + { pattern: 'crates/pumpkin/src/net/bedrock/', reviewers: ['ZlordHUN', 'xRookieFight', 'QuantumSegfault'] }, + + { pattern: 'crates/pumpkin/src/command/', reviewers: ['aure31'] }, + + { pattern: 'crates/pumpkin-plugin-api/', reviewers: ['vyPal', 'yunuservices'] }, + { pattern: 'crates/pumpkin-plugin-wit/', reviewers: ['vyPal', 'yunuservices', 'QuantumSegfault'] }, + { pattern: 'crates/pumpkin-api-macros/', reviewers: ['vyPal', 'yunuservices'] }, + { pattern: 'crates/pumpkin/src/plugin/', reviewers: ['vyPal', 'yunuservices', 'QuantumSegfault'] }, + + { pattern: '*.md', reviewers: ['Q2297045667'] }, + { pattern: 'docs/', reviewers: ['Q2297045667'] }, + + { pattern: 'crates/pumpkin/src/entity/mob/', reviewers: ['Snowiiii', 'RoosterBooster007'] }, + { pattern: 'crates/pumpkin/src/entity/projectile/', reviewers: ['Snowiiii', 'RoosterBooster007'] }, + + { pattern: 'crates/pumpkin/src/block/', reviewers: ['Snowiiii', 'RoosterBooster007'] }, + { pattern: 'crates/pumpkin/src/item/', reviewers: ['Snowiiii', 'RoosterBooster007'] }, + + { pattern: 'crates/pumpkin-world/src/generation/feature/', reviewers: ['Snowiiii', 'RoosterBooster007', 'MegalithOfficial'] }, + { pattern: 'crates/pumpkin-world/src/generation/noise/', reviewers: ['Snowiiii', 'RoosterBooster007', 'MegalithOfficial'] }, + ]; + + const matches = (path, pattern) => { + if (pattern === '*') return true; + if (pattern.endsWith('/')) return path.startsWith(pattern); + if (pattern.startsWith('*.')) return path.endsWith(pattern.slice(1)); + return path === pattern; + }; + + const files = await github.paginate( + github.rest.pulls.listFiles, + { + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + per_page: 100, + }, + ); + + const reviewers = new Set(); + for (const file of files) { + const matchingRule = [...rules].reverse().find((rule) => matches(file.filename, rule.pattern)); + matchingRule?.reviewers.forEach((reviewer) => reviewers.add(reviewer)); + } + + if (reviewers.size === 0) { + core.info('No reviewers matched the changed files.'); + return; + } + + await github.rest.pulls.requestReviewers({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + reviewers: [...reviewers], + }); + + core.info(`Requested reviewers: ${[...reviewers].join(', ')}`);