Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: adds commitDepth as new input param #595

Merged
merged 2 commits into from Nov 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Expand Up @@ -58,6 +58,12 @@ Link to a page explaining your commit message convention.

default: `https://github.com/conventional-changelog/commitlint/#what-is-commitlint`

### `commitDepth`

When set to a valid Integer value - X, considers only the latest X number of commits.

default: `null` (Equivalent to linting all commits)

### `token`

Personal access token (PAT) used to interact with the GitHub API.
Expand Down
11 changes: 8 additions & 3 deletions action.yml
Expand Up @@ -3,7 +3,8 @@ description: Lints Pull Request commit messages with commitlint
author: Wagner Santos
inputs:
configFile:
description: Commitlint config file. If the file doesn't exist, config-conventional settings will be
description:
Commitlint config file. If the file doesn't exist, config-conventional settings will be
loaded as a fallback.
default: ./commitlint.config.js
required: false
Expand All @@ -12,16 +13,20 @@ inputs:
When set to true, we follow only the first parent commit when seeing a merge commit.
More info in git-log docs
https://git-scm.com/docs/git-log#Documentation/git-log.txt---first-parent
default: "true"
default: 'true'
required: false
failOnWarnings:
description: Whether you want to fail on warnings or not
default: "false"
default: 'false'
required: false
helpURL:
description: Link to a page explaining your commit message convention
default: https://github.com/conventional-changelog/commitlint/#what-is-commitlint
required: false
commitDepth:
description: When set to a valid Integer value - X, considers only the latest X number of commits.
default: ''
required: false
token:
description: >
Personal access token (PAT) used to interact with the GitHub API. By default, the
Expand Down
14 changes: 12 additions & 2 deletions src/action.js
Expand Up @@ -16,6 +16,13 @@ const { GITHUB_EVENT_NAME, GITHUB_SHA } = process.env

const configPath = resolve(process.env.GITHUB_WORKSPACE, getInput('configFile'))

const getCommitDepth = () => {
const commitDepthString = getInput('commitDepth')
if (!commitDepthString?.trim()) return null
const commitDepth = parseInt(commitDepthString, 10)
return Number.isNaN(commitDepth) ? null : Math.max(commitDepth, 0)
}

const pushEventHasOnlyOneCommit = (from) => {
const gitEmptySha = '0000000000000000000000000000000000000000'

Expand Down Expand Up @@ -118,7 +125,11 @@ const handleOnlyWarnings = (formattedResults) => {
}

const showLintResults = async ([from, to]) => {
const commits = await getHistoryCommits(from, to)
let commits = await getHistoryCommits(from, to)
const commitDepth = getCommitDepth()
if (commitDepth) {
commits = commits?.slice(0, commitDepth)
}
const config = existsSync(configPath)
? await load({}, { file: configPath })
: await load({ extends: ['@commitlint/config-conventional'] })
Expand All @@ -130,7 +141,6 @@ const showLintResults = async ([from, to]) => {
})),
)
const formattedResults = formatErrors(lintedCommits, { config })

generateOutputs(lintedCommits)

if (hasOnlyWarnings(lintedCommits)) {
Expand Down
37 changes: 37 additions & 0 deletions src/action.test.js
Expand Up @@ -605,4 +605,41 @@ describe('Commit Linter action', () => {
td.verify(core.setFailed(contains(' https://example.org')))
})
})

describe('when commitDepth is provided in the config', () => {
beforeEach(async () => {
cwd = await git.bootstrap('fixtures/conventional')
await gitEmptyCommit(cwd, 'message from before push')
await gitEmptyCommit(cwd, 'incorrect message within commit depth')
await gitEmptyCommit(cwd, 'chore: correct message 2')
const [before, , to] = await getCommitHashes(cwd)
await createPushEventPayload(cwd, { before, to })
updatePushEnvVars(cwd, to)
td.replace(process, 'cwd', () => cwd)
td.replace(console, 'log')
})
it('should pass when only considering messages defined by commitDepth', async () => {
td.when(core.getInput('commitDepth')).thenReturn('1')
await runAction()

td.verify(core.setFailed(), { times: 0, ignoreExtraArgs: true })
td.verify(console.log('Lint free! 🎉'))
})
it('should fail when older commits have lint errors', async () => {
td.when(core.getInput('commitDepth')).thenReturn('2')
await runAction()

td.verify(
core.setFailed(contains('incorrect message within commit depth')),
)
})
it('should consider all commits when an invalid commit depth is passed in config', async () => {
td.when(core.getInput('commitDepth')).thenReturn('xzy')
await runAction()

td.verify(
core.setFailed(contains('incorrect message within commit depth')),
)
})
})
})