-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Expand file tree
/
Copy pathreusable-cleanup-pull-requests.yml
More file actions
130 lines (109 loc) · 5.57 KB
/
reusable-cleanup-pull-requests.yml
File metadata and controls
130 lines (109 loc) · 5.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
##
# A reusable workflow that finds and closes any pull requests that are linked to Trac
# tickets that are referenced as fixed in commit messages.
#
# More info about using GitHub pull requests for contributing to WordPress can be found in the handbook: https://make.wordpress.org/core/handbook/contribute/git/github-pull-requests-for-code-review/.
##
name: Run pull request cleanup
on:
workflow_call:
jobs:
# Finds and closes pull requests referencing fixed Trac tickets in commit messages using the
# documented expected format
#
# Commit message format is documented in the Core handbook: https://make.wordpress.org/core/handbook/best-practices/commit-messages/.
#
# Performs the following steps:
# - Parse fixed ticket numbers from the commit message.
# - Parse the SVN revision from the commit message.
# - Searches for pull requests referencing any fixed tickets.
# - Leaves a comment on each PR before closing.
close-prs:
name: Find and close PRs
runs-on: ubuntu-24.04
permissions:
pull-requests: write
steps:
- name: Find fixed ticket numbers
id: trac-tickets
env:
COMMIT_MSG_RAW: ${{ github.event.head_commit.message }}
run: |
COMMIT_MESSAGE="$(echo "$COMMIT_MSG_RAW" | sed -n '/^Fixes #/,/\./p')"
echo "fixed_list=$(echo "$COMMIT_MESSAGE" | sed -n 's/.*Fixes #\([0-9]\+\).*/\1/p' | tr '\n' ' ')" >> "$GITHUB_OUTPUT"
- name: Get the SVN revision
id: git-svn-id
env:
COMMIT_MSG_RAW: ${{ github.event.head_commit.message }}
run: |
COMMIT_MESSAGE="$(echo "$COMMIT_MSG_RAW" | sed -n '$p')"
echo "svn_revision_number=$(echo "$COMMIT_MESSAGE" | sed -n 's/.*git-svn-id: https:\/\/develop.svn.wordpress.org\/[^@]*@\([0-9]*\) .*/\1/p')" >> "$GITHUB_OUTPUT"
- name: Find pull requests
id: linked-prs
if: ${{ steps.trac-tickets.outputs.fixed_list != '' && steps.git-svn-id.outputs.svn_revision_number != '' }}
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
const fixedList = "${{ steps.trac-tickets.outputs.fixed_list }}".split(' ').filter(Boolean);
let prNumbers = [];
for (const ticket of fixedList) {
const tracTicketUrl = `https://core.trac.wordpress.org/ticket/${ticket}`;
const corePrefix = `core-${ticket}`;
const query = `
query($searchQuery: String!) {
search(query: $searchQuery, type: ISSUE_ADVANCED, first: 20) {
nodes {
... on PullRequest {
number
bodyText
}
}
}
}
`;
const searchQuery = `repo:${context.repo.owner}/${context.repo.repo} is:pr is:open ( "${tracTicketUrl}" OR "${corePrefix}" )`;
const result = await github.graphql(query, {
searchQuery,
});
// Since search queries will match anywhere for any activity on a pull request, the body specifically needs to be manually checked.
const matchingPRs = result.search.nodes
.filter(pr => {
const bodyLower = pr.bodyText.toLowerCase();
return bodyLower.includes(tracTicketUrl.toLowerCase()) || bodyLower.includes(corePrefix.toLowerCase());
}).map(pr => pr.number);
prNumbers.push(...matchingPRs);
}
return prNumbers;
- name: Comment and close pull requests
if: ${{ steps.trac-tickets.outputs.fixed_list != '' && steps.git-svn-id.outputs.svn_revision_number != '' }}
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
const prNumbers = ${{ steps.linked-prs.outputs.result }};
const commentBody = `A commit was made that fixes the Trac ticket referenced in the description of this pull request.
SVN changeset: [${{ steps.git-svn-id.outputs.svn_revision_number }}](https://core.trac.wordpress.org/changeset/${{ steps.git-svn-id.outputs.svn_revision_number }})
GitHub commit: https://github.com/WordPress/wordpress-develop/commit/${{ github.sha }}
This PR will be closed, but please confirm the accuracy of this and reopen if there is more work to be done.`;
const tickets = "${{ steps.trac-tickets.outputs.fixed_list }}".split(' ').filter(Boolean);
for (const ticket of tickets) {
core.notice(`Ticket: https://core.trac.wordpress.org/ticket/${ticket}`);
}
core.notice(`SVN changeset: https://core.trac.wordpress.org/changeset/${{ steps.git-svn-id.outputs.svn_revision_number }}`);
// Update all matched pull requests.
for (const prNumber of prNumbers) {
core.notice(`Closed pull request: https://github.com/${context.repo.owner}/${context.repo.repo}/pull/${prNumber}`);
// Comment on the pull request with details.
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: commentBody
});
// Close the pull request.
await github.rest.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber,
state: 'closed'
});
}