Skip to content

Commit 7ff1d2b

Browse files
committed
Adding in isWip rule to allow or prevent WIP commits. For example PR validation could prevent WIP commits from being merged.
1 parent 87ed639 commit 7ff1d2b

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

packages/commitlint-plugin-github-rules/src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import githubIssueNumberMissingRuleResolver from './rules/githubIssueNumbers/isM
55
import githubIssueNumberFormatRuleResolver from './rules/githubIssueNumbers/isCorrectFormat';
66
import githubIssueNumberDuplicateRuleResolver from './rules/githubIssueNumbers/isDuplicate';
77

8+
import wipAllowedRuleResolver from './rules/wip/isWipAllowed';
9+
810
import {
911
subjectEmptyRuleResolver,
1012
subjectCaseRuleResolver,
@@ -30,6 +32,8 @@ export const commitlintPluginGitHub: CommitlintPluginGitHub = {
3032
[commitlintGitHubRules.issueNumberFormat]: githubIssueNumberFormatRuleResolver,
3133
[commitlintGitHubRules.issueNumberDuplicate]: githubIssueNumberDuplicateRuleResolver,
3234

35+
[commitlintGitHubRules.wipAllowed]: wipAllowedRuleResolver,
36+
3337
[commitlintGitHubRules.subjectEmpty]: subjectEmptyRuleResolver,
3438
[commitlintGitHubRules.subjectCase]: subjectCaseRuleResolver,
3539
[commitlintGitHubRules.subjectFullStop]: subjectFullStopRuleResolver,
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import utils from 'commitlint-github-utils';
2+
import { RuleResolver } from '../../../@types';
3+
4+
const wipAllowedRuleResolver: RuleResolver<void> = (parsed, when?: string) => {
5+
const rawCommitMessage = parsed.raw;
6+
if (!rawCommitMessage) return [false, 'Commit message should not be empty'];
7+
8+
const commitMessage = utils.parseCommitMessage(rawCommitMessage);
9+
10+
const result = !commitMessage.isWip || !utils.isNegated(when);
11+
12+
return [result, 'WIP commits are not permitted'];
13+
};
14+
15+
export default wipAllowedRuleResolver;
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { When } from 'commitlint-github-utils/@types';
2+
3+
import { RuleResolverResult } from '../../../../@types';
4+
import wipAllowedRuleResolver from '../isWipAllowed';
5+
import runRule from '../../utils/tests/utils';
6+
7+
const parse = (when: When, rawCommitMessage: string): RuleResolverResult =>
8+
runRule(wipAllowedRuleResolver, [when], rawCommitMessage);
9+
10+
describe('wipAllowedRuleResolver', () => {
11+
it('should always return an error response if an empty commit message is provided', () => {
12+
expect(parse(When.ALWAYS, '')[0]).toEqual(false);
13+
expect(parse(When.NEVER, '')[0]).toEqual(false);
14+
});
15+
16+
it('should return a success response if the commit is not a WIP', () => {
17+
expect(parse(When.ALWAYS, '(#1) my commit message')[0]).toEqual(true);
18+
expect(parse(When.ALWAYS, '(#1) chore: my commit message')[0]).toEqual(true);
19+
20+
expect(parse(When.ALWAYS, '(#1, #2) my commit message')[0]).toEqual(true);
21+
expect(parse(When.ALWAYS, '(#1,#2) my commit message')[0]).toEqual(true);
22+
23+
expect(parse(When.ALWAYS, '(#123, #23) chore: my commit message')[0]).toEqual(true);
24+
expect(parse(When.ALWAYS, '(#123,#23) chore: my commit message')[0]).toEqual(true);
25+
});
26+
27+
it('should return a success response if the commit is WIP and not disallowed', () => {
28+
expect(parse(When.ALWAYS, '(#1) WIP: my commit message')[0]).toEqual(true);
29+
expect(parse(When.ALWAYS, '(#1, #2, #3, #4) WIP: my commit message')[0]).toEqual(true);
30+
expect(parse(When.ALWAYS, '(#1,#2,#3,#4) WIP: my commit message')[0]).toEqual(true);
31+
});
32+
33+
it('should return a success response if the commit is not a WIP even if disallowed', () => {
34+
expect(parse(When.NEVER, '(#1) my commit message')[0]).toEqual(true);
35+
expect(parse(When.NEVER, '(#1) chore: my commit message')[0]).toEqual(true);
36+
37+
expect(parse(When.NEVER, '(#1, #2) my commit message')[0]).toEqual(true);
38+
expect(parse(When.NEVER, '(#1,#2) my commit message')[0]).toEqual(true);
39+
40+
expect(parse(When.NEVER, '(#123, #23) chore: my commit message')[0]).toEqual(true);
41+
expect(parse(When.NEVER, '(#123,#23) chore: my commit message')[0]).toEqual(true);
42+
});
43+
44+
it('should return an error response if the commit is WIP and disallowed', () => {
45+
expect(parse(When.NEVER, '(#1) WIP: my commit message')[0]).toEqual(false);
46+
expect(parse(When.NEVER, '(#1, #2, #3, #4) WIP: my commit message')[0]).toEqual(false);
47+
expect(parse(When.NEVER, '(#1,#2,#3,#4) WIP: my commit message')[0]).toEqual(false);
48+
});
49+
});

0 commit comments

Comments
 (0)