- drop no longer needed limiting of PRs - retrieve state from PR review comment
130 lines
4.2 KiB
TypeScript
130 lines
4.2 KiB
TypeScript
import * as core from '@actions/core'
|
||
import {Configuration, DefaultConfiguration} from './configuration'
|
||
import {Octokit} from '@octokit/rest'
|
||
import {ReleaseNotes} from './releaseNotes'
|
||
import {Tags} from './tags'
|
||
import {failOrError} from './utils'
|
||
import {HttpsProxyAgent} from 'https-proxy-agent'
|
||
|
||
export class ReleaseNotesBuilder {
|
||
constructor(
|
||
private baseUrl: string | null,
|
||
private token: string | null,
|
||
private repositoryPath: string,
|
||
private owner: string | null,
|
||
private repo: string | null,
|
||
private fromTag: string | null,
|
||
private toTag: string | null,
|
||
private includeOpen: boolean = false,
|
||
private failOnError: boolean,
|
||
private ignorePreReleases: boolean,
|
||
private fetchReviewers: boolean = false,
|
||
private fetchReleaseInformation: boolean = false,
|
||
private fetchReviews: boolean = false,
|
||
private commitMode: boolean,
|
||
private configuration: Configuration
|
||
) {}
|
||
|
||
async build(): Promise<string | null> {
|
||
if (!this.owner) {
|
||
failOrError(`💥 Missing or couldn't resolve 'owner'`, this.failOnError)
|
||
return null
|
||
} else {
|
||
core.setOutput('owner', this.owner)
|
||
core.debug(`Resolved 'owner' as ${this.owner}`)
|
||
}
|
||
|
||
if (!this.repo) {
|
||
failOrError(`💥 Missing or couldn't resolve 'owner'`, this.failOnError)
|
||
return null
|
||
} else {
|
||
core.setOutput('repo', this.repo)
|
||
core.debug(`Resolved 'repo' as ${this.repo}`)
|
||
}
|
||
core.endGroup()
|
||
|
||
// check proxy setup for GHES environments
|
||
const proxy = process.env.https_proxy || process.env.HTTPS_PROXY
|
||
const noProxy = process.env.no_proxy || process.env.NO_PROXY
|
||
let noProxyArray: string[] = []
|
||
if (noProxy) {
|
||
noProxyArray = noProxy.split(',')
|
||
}
|
||
|
||
// load octokit instance
|
||
const octokit = new Octokit({
|
||
auth: `token ${this.token || process.env.GITHUB_TOKEN}`,
|
||
baseUrl: `${this.baseUrl || 'https://api.github.com'}`
|
||
})
|
||
|
||
if (proxy) {
|
||
const agent = new HttpsProxyAgent(proxy)
|
||
octokit.hook.before('request', options => {
|
||
if (noProxyArray.includes(options.request.hostname)) {
|
||
return
|
||
}
|
||
options.request.agent = agent
|
||
})
|
||
}
|
||
|
||
// ensure proper from <-> to tag range
|
||
core.startGroup(`🔖 Resolve tags`)
|
||
const tagsApi = new Tags(octokit)
|
||
const tagRange = await tagsApi.retrieveRange(
|
||
this.repositoryPath,
|
||
this.owner,
|
||
this.repo,
|
||
this.fromTag,
|
||
this.toTag,
|
||
this.ignorePreReleases,
|
||
this.configuration.max_tags_to_fetch || DefaultConfiguration.max_tags_to_fetch,
|
||
this.configuration.tag_resolver || DefaultConfiguration.tag_resolver
|
||
)
|
||
|
||
let thisTag = tagRange.to
|
||
if (!thisTag) {
|
||
failOrError(`💥 Missing or couldn't resolve 'toTag'`, this.failOnError)
|
||
return null
|
||
} else {
|
||
core.setOutput('toTag', thisTag.name)
|
||
core.debug(`Resolved 'toTag' as ${thisTag.name}`)
|
||
}
|
||
|
||
let previousTag = tagRange.from
|
||
if (previousTag == null) {
|
||
failOrError(`💥 Unable to retrieve previous tag given ${this.toTag}`, this.failOnError)
|
||
return null
|
||
}
|
||
core.setOutput('fromTag', previousTag.name)
|
||
core.debug(`fromTag resolved via previousTag as: ${previousTag.name}`)
|
||
|
||
if (this.fetchReleaseInformation) {
|
||
// load release information from the GitHub API
|
||
core.info(`ℹ️ Fetching release information was enabled`)
|
||
thisTag = await tagsApi.fillTagInformation(this.repositoryPath, this.owner, this.repo, thisTag)
|
||
previousTag = await tagsApi.fillTagInformation(this.repositoryPath, this.owner, this.repo, previousTag)
|
||
} else {
|
||
core.debug(`ℹ️ Fetching release information was disabled`)
|
||
}
|
||
|
||
core.endGroup()
|
||
|
||
const options = {
|
||
owner: this.owner,
|
||
repo: this.repo,
|
||
fromTag: previousTag,
|
||
toTag: thisTag,
|
||
includeOpen: this.includeOpen,
|
||
failOnError: this.failOnError,
|
||
fetchReviewers: this.fetchReviewers,
|
||
fetchReleaseInformation: this.fetchReleaseInformation,
|
||
fetchReviews: this.fetchReviews,
|
||
commitMode: this.commitMode,
|
||
configuration: this.configuration
|
||
}
|
||
const releaseNotes = new ReleaseNotes(octokit, options)
|
||
|
||
return await releaseNotes.pull()
|
||
}
|
||
}
|