@@ -3,7 +3,12 @@ name: Enforce PR Template
33on :
44 pull_request_target :
55 types : [opened, edited, synchronize, reopened]
6- workflow_dispatch :
6+ workflow_dispatch :
7+ inputs :
8+ pr_number :
9+ description : ' Pull request number to validate'
10+ required : true
11+ type : number
712
813permissions :
914 pull-requests : write
@@ -15,17 +20,43 @@ jobs:
1520 runs-on : ubuntu-latest
1621
1722 steps :
23+ - name : Determine PR number
24+ id : pr
25+ run : |
26+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
27+ echo "number=${{ inputs.pr_number }}" >> "$GITHUB_OUTPUT"
28+ else
29+ echo "number=${{ github.event.pull_request.number }}" >> "$GITHUB_OUTPUT"
30+ fi
31+
32+ - name : Load PR details
33+ id : load_pr
34+ uses : actions/github-script@v8
35+ with :
36+ github-token : ${{ secrets.GITHUB_TOKEN }}
37+ script : |
38+ const prNumber = Number('${{ steps.pr.outputs.number }}');
39+ const { data: pr } = await github.rest.pulls.get({
40+ owner: context.repo.owner,
41+ repo: context.repo.repo,
42+ pull_number: prNumber,
43+ });
44+
45+ core.setOutput('author', pr.user.login);
46+ core.setOutput('body', pr.body || '');
47+ core.setOutput('state', pr.state);
48+ core.setOutput('number', pr.number.toString());
49+
1850 - name : Check if author is org member
1951 id : org_check
20- uses : actions/github-script@v8
52+ uses : actions/github-script@v7
2153 with :
2254 github-token : ${{ secrets.GITHUB_TOKEN }}
2355 script : |
2456 const org = 'Pycord-Development';
25- const username = context.payload.pull_request.user.login ;
57+ const username = '${{ steps.load_pr.outputs.author }}' ;
2658
2759 try {
28- // Succeeds if user is a member; throws 404 if not
2960 await github.rest.orgs.checkMembershipForUser({
3061 org,
3162 username,
@@ -50,12 +81,11 @@ jobs:
5081 with :
5182 github-token : ${{ secrets.GITHUB_TOKEN }}
5283 script : |
53- const pr = context.payload.pull_request;
54- const body = (pr.body || '').trim();
84+ const body = (`${{ steps.load_pr.outputs.body }}` || '').trim();
5585
5686 const problems = [];
5787
58- // Basic length check – tune as you like
88+ // Basic length check – adjust as desired
5989 if (body.length < 150) {
6090 problems.push('PR description is too short (expected more content based on the template).');
6191 }
@@ -91,18 +121,25 @@ jobs:
91121 with :
92122 github-token : ${{ secrets.GITHUB_TOKEN }}
93123 script : |
94- const pr = context.payload.pull_request;
95- const problems = core.getInput('problems');
124+ const prNumber = Number('${{ steps.load_pr.outputs.number }}');
125+ const problems = `${{ steps.validate.outputs.problems }}`;
126+ const prState = '${{ steps.load_pr.outputs.state }}';
96127
97128 const INVALID_LABEL = 'invalid';
98129
99130 // 1) Add 'invalid' label if not present
131+ const { data: pr } = await github.rest.pulls.get({
132+ owner: context.repo.owner,
133+ repo: context.repo.repo,
134+ pull_number: prNumber,
135+ });
136+
100137 const existingLabels = (pr.labels || []).map(l => l.name);
101138 if (!existingLabels.includes(INVALID_LABEL)) {
102139 await github.rest.issues.addLabels({
103140 owner: context.repo.owner,
104141 repo: context.repo.repo,
105- issue_number: pr.number ,
142+ issue_number: prNumber ,
106143 labels: [INVALID_LABEL],
107144 });
108145 }
@@ -111,7 +148,7 @@ jobs:
111148 await github.rest.issues.createComment({
112149 owner: context.repo.owner,
113150 repo: context.repo.repo,
114- issue_number: pr.number ,
151+ issue_number: prNumber ,
115152 body: [
116153 'This pull request does not follow the required pull request template.',
117154 '',
@@ -125,15 +162,17 @@ jobs:
125162 ].join('\n'),
126163 });
127164
128- // 3) Close PR
129- await github.rest.pulls.update({
130- owner: context.repo.owner,
131- repo: context.repo.repo,
132- pull_number: pr.number,
133- state: 'closed',
134- });
165+ // 3) Close PR if it is still open
166+ if (prState === 'open') {
167+ await github.rest.pulls.update({
168+ owner: context.repo.owner,
169+ repo: context.repo.repo,
170+ pull_number: prNumber,
171+ state: 'closed',
172+ });
173+ }
135174
136- core.setFailed('PR does not follow the required template and has been closed .');
175+ core.setFailed('PR does not follow the required template.');
137176
138177 - name : Validation passed
139178 if : steps.org_check.outputs.is_member == 'false' && steps.validate.outputs.valid == 'true'
0 commit comments