enso/tools/ci/check-changelog.js
2024-07-26 17:47:59 +10:00

57 lines
1.5 KiB
JavaScript

const fs = require('fs')
const proc = require('child_process')
const skipChangelogInfix = '[no-changelog]'
const changelogPath = process.argv[2]
const baseRef = process.argv[3]
/// Runs the git command with the provided arguments.
function runGit(args) {
const result = proc.spawnSync('git', args)
if (result.error) {
console.log('Cannot access git', result.error)
process.exit(1)
}
return result
}
/** Checks if the changelog file was changed in any commits that are part of the
* PR.
*/
function wasChangelogModified() {
const diffArgs = ['--no-pager', 'diff', '--exit-code', baseRef, '--', changelogPath]
const result = runGit(diffArgs)
const exitCode = result.status
console.log(result.stdout.toString('utf-8'))
const noDifference = exitCode == 0
return !noDifference
}
/// Checks if any commit has overridden the changelog check.
function isChangelogSkipped() {
const logArgs = ['--no-pager', 'log', 'HEAD~3...HEAD', '--pretty=oneline']
const result = runGit(logArgs)
const output = result.stdout.toString('utf-8')
const containsSkipCommit = output.indexOf(skipChangelogInfix) >= 0
return containsSkipCommit
}
if (wasChangelogModified()) {
console.log('Changelog was changed')
process.exit(0)
} else {
console.log('No changes to the changelog')
if (isChangelogSkipped()) {
console.log(
'But one of the commits within the PR includes ' +
skipChangelogInfix +
', so the check is skipped.',
)
process.exit(0)
} else {
process.exit(1)
}
}