diff --git a/.github/workflows/pr_approval.yml b/.github/workflows/pr_approval.yml index 70089fed5ec3f..a244de66c6097 100644 --- a/.github/workflows/pr_approval.yml +++ b/.github/workflows/pr_approval.yml @@ -73,6 +73,21 @@ jobs: return; } + // Get the list of changed files + const { data: changedFiles } = await github.rest.pulls.listFiles({ + owner, + repo, + pull_number, + }); + + // Check if any files in doc/, library/ or verifast-proofs/ are modified + const affectsDocs = changedFiles.some(file => file.filename.startsWith('doc/')); + const affectsLibrary = changedFiles.some(file => file.filename.startsWith('library/')); + const affectsVerifast = changedFiles.some(file => file.filename.startsWith('verifast-proofs/')); + // Require two approvals iff one of the above folders are modified; otherwise, one is sufficient. + const requiresTwoApprovals = affectsDocs || affectsLibrary || affectsVerifast; + const requiredApprovals = requiresTwoApprovals ? 2 : 1; + // Get all reviews with pagination async function getAllReviews() { let allReviews = []; @@ -113,15 +128,19 @@ jobs: .map(review => review.user.login) ); - const requiredApprovals = 2; const committeeApprovers = Array.from(approvers) .filter(approver => requiredApprovers.includes(approver)); const currentCountfromCommittee = committeeApprovers.length; - // Core logic that checks if the approvers are in the committee - const conclusion = (currentCountfromCommittee >= 2) ? 'success' : 'failure'; + // Check if we have enough approvals + const conclusion = (currentCountfromCommittee >= requiredApprovals) ? 'success' : 'failure'; console.log('PR Approval Status'); + console.log('Modified folders:'); + console.log(`- doc/: ${affectsDocs ? 'yes' : 'no'}`); + console.log(`- library/: ${affectsLibrary ? 'yes' : 'no'}`); + console.log(`- verifast-proofs/: ${affectsVerifast ? 'yes' : 'no'}`); + console.log(`Required approvals from committee: ${requiredApprovals}`); console.log(`PR has ${approvers.size} total approvals and ${currentCountfromCommittee} required approvals from the committee.`); console.log(`Committee Members: [${requiredApprovers.join(', ')}]`); @@ -129,7 +148,7 @@ jobs: console.log(`All Approvers: ${approvers.size === 0 ? 'NONE' : `[${Array.from(approvers).join(', ')}]`}`); if (conclusion === 'failure') { - core.setFailed(`PR needs 2 approvals from committee members, but it has ${currentCountfromCommittee}`); + core.setFailed(`PR needs ${requiredApprovals} approval${requiredApprovals > 1 ? 's' : ''} from committee members, but it has ${currentCountfromCommittee}`); } else { core.info('PR approval check passed successfully.'); }