Files
cypress/scripts/github-actions/semantic-pull-request/validate-pr-title.js
2023-03-30 20:16:10 -05:00

79 lines
2.5 KiB
JavaScript

const parser = require('conventional-commits-parser').sync
const { changeCatagories, parserOpts } = require('../../semantic-commits/change-categories')
const types = Object.keys(changeCatagories)
function _validateTitle (prTitle) {
const result = parser(prTitle, parserOpts)
function printAvailableTypes () {
return `Available types:\n${types
.map((type) => ` - ${type}: ${changeCatagories[type].description}`)
.join('\n')}`
}
if (!result.type) {
throw new Error(
`No release type found in pull request title "${prTitle}". Add a prefix to indicate what kind of release this pull request corresponds to. Cypress types are:/\n\n${printAvailableTypes()}`,
)
}
if (!result.subject) {
throw new Error(`No subject found in pull request title "${prTitle}".`)
}
if (!types.includes(result.type)) {
throw new Error(
`Unknown release type "${result.type}" found in pull request title "${prTitle}".
\n\n${printAvailableTypes()}`,
)
}
return result
}
async function validatePrTitle ({ github, prTitle, restParameters }) {
let result = _validateTitle(prTitle)
const commits = []
let nonMergeCommits = []
for await (const response of github.paginate.iterator(
github.rest.pulls.listCommits,
restParameters,
)) {
commits.push(...response.data)
// GitHub does not count merge commits when deciding whether to use
// the PR title or a commit message for the squash commit message.
nonMergeCommits = commits.filter((commit) => {
return commit.parents.length < 2
})
// We only need two non-merge commits to know that the PR
// title won't be used.
if (nonMergeCommits.length >= 2) break
}
// If there is only one (non merge) commit present, GitHub will use
// that commit rather than the PR title for the title of a squash
// commit. To make sure a semantic title is used for the squash
// commit, we need to validate the commit title.
if (nonMergeCommits.length === 1) {
try {
result = _validateTitle(nonMergeCommits[0].commit.message)
} catch (error) {
throw new Error(
`Pull request has only one commit and it's not semantic; this may lead to a non-semantic commit in the base branch (see https://github.community/t/how-to-change-the-default-squash-merge-commit-message/1155). Amend the commit message to match the pull request title, or add another commit.`,
)
}
}
return result
}
module.exports = {
validatePrTitle,
_validateTitle,
}