- introduce new flag to include open PRs into the changelog

- only fetch open with this flag
- expand pull request spec with
  - status, created at timestamp
- expand definition for placeholder patterns in the changelog
This commit is contained in:
Mike Penz
2022-04-08 11:00:39 +02:00
parent 7a59e9f4b4
commit 85af6a8181
10 changed files with 333 additions and 58 deletions
+64 -11
View File
@@ -8,7 +8,8 @@ export interface PullRequestInfo {
title: string
htmlURL: string
baseBranch: string
mergedAt: moment.Moment
createdAt: moment.Moment
mergedAt: moment.Moment | null
mergeCommitSha: string
author: string
repoName: string
@@ -17,6 +18,7 @@ export interface PullRequestInfo {
body: string
assignees: string[]
requestedReviewers: string[]
status: 'open' | 'merged'
}
type PullData = RestEndpointMethodTypes['pulls']['get']['response']['data']
@@ -69,7 +71,7 @@ export class PullRequests {
const prs: PullsListData = response.data as PullsListData
for (const pr of prs.filter(p => !!p.merged_at)) {
mergedPRs.push(mapPullRequest(pr))
mergedPRs.push(mapPullRequest(pr, 'merged'))
}
const firstPR = prs[0]
@@ -89,6 +91,42 @@ export class PullRequests {
return sortPullRequests(mergedPRs, true)
}
async getOpen(
owner: string,
repo: string,
maxPullRequests: number
): Promise<PullRequestInfo[]> {
const mergedPRs: PullRequestInfo[] = []
const options = this.octokit.pulls.list.endpoint.merge({
owner,
repo,
state: 'open',
sort: 'created',
per_page: '100',
direction: 'desc'
})
for await (const response of this.octokit.paginate.iterator(options)) {
const prs: PullsListData = response.data as PullsListData
for (const pr of prs) {
mergedPRs.push(mapPullRequest(pr, 'open'))
}
const firstPR = prs[0]
if (firstPR === undefined || mergedPRs.length >= maxPullRequests) {
if (mergedPRs.length >= maxPullRequests) {
core.warning(`⚠️ Reached 'maxPullRequests' count ${maxPullRequests}`)
}
// bail out early to not keep iterating on PRs super old
return sortPullRequests(mergedPRs, true)
}
}
return sortPullRequests(mergedPRs, true)
}
}
export function sortPullRequests(
@@ -97,18 +135,22 @@ export function sortPullRequests(
): PullRequestInfo[] {
if (ascending) {
pullRequests.sort((a, b) => {
if (a.mergedAt.isBefore(b.mergedAt)) {
const aa = a.mergedAt || a.createdAt
const bb = b.mergedAt || b.createdAt
if (aa.isBefore(bb)) {
return -1
} else if (b.mergedAt.isBefore(a.mergedAt)) {
} else if (bb.isBefore(aa)) {
return 1
}
return 0
})
} else {
pullRequests.sort((b, a) => {
if (a.mergedAt.isBefore(b.mergedAt)) {
const aa = a.mergedAt || a.createdAt
const bb = b.mergedAt || b.createdAt
if (aa.isBefore(bb)) {
return -1
} else if (b.mergedAt.isBefore(a.mergedAt)) {
} else if (bb.isBefore(aa)) {
return 1
}
return 0
@@ -117,23 +159,34 @@ export function sortPullRequests(
return pullRequests
}
// helper function to add a special open label to prs not merged.
function addOpenLabel(labels: Set<string>): Set<string> {
labels.add('##rcba-open')
return labels
}
const mapPullRequest = (
pr: PullData | Unpacked<PullsListData>
pr: PullData | Unpacked<PullsListData>,
status: 'open' | 'merged' = 'open'
): PullRequestInfo => ({
number: pr.number,
title: pr.title,
htmlURL: pr.html_url,
baseBranch: pr.base.ref,
mergedAt: moment(pr.merged_at),
createdAt: moment(pr.created_at),
mergedAt: pr.merged_at ? moment(pr.merged_at) : null,
mergeCommitSha: pr.merge_commit_sha || '',
author: pr.user?.login || '',
repoName: pr.base.repo.full_name,
labels: new Set(
pr.labels?.map(lbl => lbl.name?.toLocaleLowerCase('en') || '') || []
labels: addOpenLabel(
new Set(
pr.labels?.map(lbl => lbl.name?.toLocaleLowerCase('en') || '') || []
)
),
milestone: pr.milestone?.title || '',
body: pr.body || '',
assignees: pr.assignees?.map(asignee => asignee?.login || '') || [],
requestedReviewers:
pr.requested_reviewers?.map(reviewer => reviewer?.login || '') || []
pr.requested_reviewers?.map(reviewer => reviewer?.login || '') || [],
status
})