- improve test case to depend on self
- fix various eslint error reports
This commit is contained in:
@@ -39,6 +39,7 @@ export class Commits {
|
||||
// This is because the GitHub API limits the number of commits returned in a single response.
|
||||
let commits: RestEndpointMethodTypes['repos']['compareCommits']['response']['data']['commits'] = []
|
||||
let compareHead = head
|
||||
// eslint-disable-next-line no-constant-condition
|
||||
while (true) {
|
||||
const compareResult = await this.octokit.repos.compareCommits({
|
||||
owner,
|
||||
|
||||
+16
-23
@@ -52,7 +52,7 @@ export class PullRequests {
|
||||
owner: string,
|
||||
repo: string,
|
||||
fromDate: moment.Moment,
|
||||
toDate: moment.Moment
|
||||
toDate: moment.Moment // eslint-disable-line @typescript-eslint/no-unused-vars
|
||||
): Promise<PullRequestInfo[]> {
|
||||
const mergedPRs: PullRequestInfo[] = []
|
||||
const options = this.octokit.pulls.list.endpoint.merge({
|
||||
@@ -67,33 +67,26 @@ export class PullRequests {
|
||||
type PullsListData = RestEndpointMethodTypes['pulls']['list']['response']['data']
|
||||
const prs: PullsListData = response.data as PullsListData
|
||||
|
||||
for (const pr of prs.filter(p => !!p.merged_at)) {
|
||||
mergedPRs.push({
|
||||
number: pr.number,
|
||||
title: pr.title,
|
||||
htmlURL: pr.html_url,
|
||||
mergedAt: moment(pr.merged_at),
|
||||
author: pr.user.login,
|
||||
repoName: pr.base.repo.full_name,
|
||||
labels: pr.labels.map(function (label) {
|
||||
return label.name
|
||||
}),
|
||||
body: pr.body
|
||||
})
|
||||
}
|
||||
|
||||
const firstPR = prs[0]
|
||||
if (firstPR.merged_at && fromDate.isAfter(moment(firstPR.merged_at))) {
|
||||
// bail out early to not keep iterating on PRs super old
|
||||
return sortPullRequests(mergedPRs, true)
|
||||
}
|
||||
|
||||
prs
|
||||
.filter(
|
||||
pr =>
|
||||
!!pr.merged_at &&
|
||||
fromDate.isBefore(moment(pr.merged_at)) &&
|
||||
toDate.isSameOrAfter(moment(pr.merged_at))
|
||||
)
|
||||
.forEach(pr => {
|
||||
mergedPRs.push({
|
||||
number: pr.number,
|
||||
title: pr.title,
|
||||
htmlURL: pr.html_url,
|
||||
mergedAt: moment(pr.merged_at),
|
||||
author: pr.user.login,
|
||||
repoName: pr.base.repo.full_name,
|
||||
labels: pr.labels.map(function (label) {
|
||||
return label.name
|
||||
}),
|
||||
body: pr.body
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
return sortPullRequests(mergedPRs, true)
|
||||
|
||||
+3
-1
@@ -43,7 +43,9 @@ export class ReleaseNotes {
|
||||
const mergedPullRequests = await this.getMergedPullRequests(octokit)
|
||||
|
||||
if (mergedPullRequests.length === 0) {
|
||||
core.warning(`No pull requests found for between ${this.options.fromTag}...${toTag}`)
|
||||
core.warning(
|
||||
`No pull requests found for between ${this.options.fromTag}...${toTag}`
|
||||
)
|
||||
return configuration.empty_template
|
||||
? configuration.empty_template
|
||||
: DefaultConfiguration.empty_template
|
||||
|
||||
+2
-2
@@ -23,12 +23,12 @@ export class Tags {
|
||||
type TagsListData = RestEndpointMethodTypes['repos']['listTags']['response']['data']
|
||||
const tags: TagsListData = response.data as TagsListData
|
||||
|
||||
tags.forEach(tag => {
|
||||
for (const tag of tags) {
|
||||
tagsInfo.push({
|
||||
name: tag.name,
|
||||
commit: tag.commit.sha
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// for performance only fetch newest 200 tags!!
|
||||
if (tagsInfo.length >= max) {
|
||||
|
||||
+48
-21
@@ -1,69 +1,90 @@
|
||||
import {PullRequestInfo, sortPullRequests} from './pullRequests'
|
||||
import * as core from '@actions/core'
|
||||
import {Category, Configuration, Transformer} from './configuration'
|
||||
import {
|
||||
Category,
|
||||
Configuration,
|
||||
Transformer,
|
||||
DefaultConfiguration
|
||||
} from './configuration'
|
||||
|
||||
export function buildChangelog(
|
||||
prs: PullRequestInfo[],
|
||||
config: Configuration
|
||||
): string {
|
||||
// sort to target order
|
||||
prs = sortPullRequests(prs, config.sort.toUpperCase() === 'ASC')
|
||||
prs = sortPullRequests(
|
||||
prs,
|
||||
(config.sort ? config.sort : DefaultConfiguration.sort).toUpperCase() ===
|
||||
'ASC'
|
||||
)
|
||||
|
||||
const validatedTransformers = validateTransfomers(config.transformers)
|
||||
const transformedMap = new Map<PullRequestInfo, string>()
|
||||
// convert PRs to their text representation
|
||||
prs.forEach(pr => {
|
||||
for (const pr of prs) {
|
||||
transformedMap.set(
|
||||
pr,
|
||||
transform(fillTemplate(pr, config.pr_template), validatedTransformers)
|
||||
transform(
|
||||
fillTemplate(
|
||||
pr,
|
||||
config.pr_template
|
||||
? config.pr_template
|
||||
: DefaultConfiguration.pr_template
|
||||
),
|
||||
validatedTransformers
|
||||
)
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
// bring PRs into the order of categories
|
||||
const categorized = new Map<Category, string[]>()
|
||||
config.categories.forEach(category => {
|
||||
categorized.set(category, [])
|
||||
})
|
||||
if (config.categories) {
|
||||
for (const category of config.categories) {
|
||||
categorized.set(category, [])
|
||||
}
|
||||
}
|
||||
const uncategorized: string[] = []
|
||||
|
||||
// bring elements in order
|
||||
transformedMap.forEach((body, pr) => {
|
||||
for (const [pr, body] of transformedMap) {
|
||||
let matched = false
|
||||
|
||||
categorized.forEach((pullRequests, category) => {
|
||||
for (const [category, pullRequests] of categorized) {
|
||||
if (haveCommonElements(category.labels, pr.labels)) {
|
||||
pullRequests.push(body)
|
||||
matched = true
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if (!matched) {
|
||||
uncategorized.push(body)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// construct final changelog
|
||||
let changelog = ''
|
||||
categorized.forEach((pullRequests, category) => {
|
||||
for (const [category, pullRequests] of categorized) {
|
||||
if (pullRequests.length > 0) {
|
||||
changelog = `${changelog + category.title}\n\n`
|
||||
|
||||
pullRequests.forEach(pr => {
|
||||
for (const pr of pullRequests) {
|
||||
changelog = `${changelog + pr}\n`
|
||||
})
|
||||
}
|
||||
|
||||
// add space between
|
||||
changelog = `${changelog}\n`
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
let changelogUncategorized = ''
|
||||
uncategorized.forEach(pr => {
|
||||
for (const pr of uncategorized) {
|
||||
changelogUncategorized = `${changelogUncategorized + pr}\n`
|
||||
})
|
||||
}
|
||||
|
||||
// fill template
|
||||
let transformedChangelog = config.template
|
||||
? config.template
|
||||
: DefaultConfiguration.template
|
||||
transformedChangelog = transformedChangelog.replace(
|
||||
'${{CHANGELOG}}',
|
||||
changelog
|
||||
@@ -95,13 +116,19 @@ function transform(filled: string, transformers: RegexTransformer[]): string {
|
||||
return filled
|
||||
}
|
||||
let transformed = filled
|
||||
transformers.forEach(({pattern, target}) => {
|
||||
for (const {target, pattern} of transformers) {
|
||||
transformed = transformed.replace(pattern!!, target)
|
||||
})
|
||||
}
|
||||
return transformed
|
||||
}
|
||||
|
||||
function validateTransfomers(transformers: Transformer[]): RegexTransformer[] {
|
||||
function validateTransfomers(
|
||||
specifiedTransformers: Transformer[]
|
||||
): RegexTransformer[] {
|
||||
const transformers = specifiedTransformers
|
||||
? specifiedTransformers
|
||||
: DefaultConfiguration.transformers
|
||||
|
||||
return transformers
|
||||
.map(transformer => {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user