Commitlint: Slashs and commas are not allowd in scope?

Created on 16 May 2018  ยท  7Comments  ยท  Source: conventional-changelog/commitlint

Expected Behavior


without slash:

โžœ  cra-rewired-starter git:(master) โœ— gc -m "feat(store-modules): add runtime"
husky > npm run -s precommit (node v8.11.1)

 โœ” Running tasks for {src,config}/**/*.{js,jsx,json}
 โ†“ Running tasks for src/**/*.{css,less} [skipped]
   โ†’ No staged files match src/**/*.{css,less}
husky > npm run -s commitmsg (node v8.11.1)

โง—   input: feat(store-modules): add runtime
โœ”   found 0 problems, 0 warnings

Cli-test:

โžœ  cra-rewired-starter git:(master) โœ— echo "feat(components, component): subject" | ./node_modules/.bin/commitlint
โง—   input: feat(components, component): subject
โœ”   found 0 problems, 0 warnings

โžœ  cra-rewired-starter git:(master) โœ— echo "feat(components/component): subject" | ./node_modules/.bin/commitlint
โง—   input: feat(components/component): subject
โœ”   found 0 problems, 0 warnings

Current Behavior


Looks like there's an extra new-line before my commit message:

โžœ  cra-rewired-starter git:(master) โœ— gc -m "feat(store/modules): add runtime"
husky > npm run -s precommit (node v8.11.1)

 โœ” Running tasks for {src,config}/**/*.{js,jsx,json}
 โ†“ Running tasks for src/**/*.{css,less} [skipped]
   โ†’ No staged files match src/**/*.{css,less}
husky > npm run -s commitmsg (node v8.11.1)

โง—   input:
feat(store/modules): add runtime

โœ–   message may not be empty [subject-empty]
โœ–   type may not be empty [type-empty]
โœ–   scope may not be empty [scope-empty]
โœ–   found 3 problems, 0 warnings

Affected packages

  • [ ] cli
  • [ ] core
  • [ ] prompt
  • [ ] config-angular

Possible Solution


Steps to Reproduce (for bugs)

https://github.com/Stupidism/cra-rewired-starter/tree/3a1c47cdcda5f585c529f78b246bc470ce64c526


commitlint.config.js


Context


Your Environment

โžœ  cra-rewired-starter git:(master) โœ— node -v
v8.11.1
โžœ  cra-rewired-starter git:(master) npm -v
6.0.0
โžœ cra-rewired-starter git:(master) โœ— grep 'version' node_modules/@commitlint/cli/package.json
    "type": "version",
  "version": "6.2.0",

| Executable | Version |
| ---: | :--- |
| commitlint --version | VERSION |
| git --version | VERSION |
| node --version | VERSION |

bug help wanted high

Most helpful comment

Ran into the same issue and tried to dig into it a bit.

If I understood correctly, commitlint falls back to conventional-changelog-angular's presetOpts when none are provided.

The headerPatterns specified there would allow special chars to be used in scopes: /^(\w*)(?:\((.*)\))?: (.*)$/

However, presetOpts does not appear to be empty, because it already contains { commentChar: '#' }, hence the angular fallback is not used. Instead it seems that conventional-commits-parser default headerPattern is used, which does not allow special chars in scopes. /^(\w*)(?:\(([\w$.\-* ]*)\))?: (.*)$/

All 7 comments

I suspect this is caused by the additional newline, not the / in commit scopes

The errors you see and the diverging behaviour if direct CLI / stdin usage are consistent with the newline showing up in the commitlint output of your failing example - the commit parser we use assigns special meaning to the first line of a commit.

I don't see any way how commitlint could cause this, any idea what might add the newline on your side?

@marionebl Did you try my repo?

same behavior with #
Do you have a workarround ?

@aguacongas I could only use dot instead of hash or slash or comma

Ran into the same issue and tried to dig into it a bit.

If I understood correctly, commitlint falls back to conventional-changelog-angular's presetOpts when none are provided.

The headerPatterns specified there would allow special chars to be used in scopes: /^(\w*)(?:\((.*)\))?: (.*)$/

However, presetOpts does not appear to be empty, because it already contains { commentChar: '#' }, hence the angular fallback is not used. Instead it seems that conventional-commits-parser default headerPattern is used, which does not allow special chars in scopes. /^(\w*)(?:\(([\w$.\-* ]*)\))?: (.*)$/

Thanks for reporting and the analysis, folks.

https://github.com/marionebl/commitlint/blob/1d79828427c19c72add82ff46a6c893c389cb4c7/%40commitlint/parse/src/index.js#L7-L10

The appropriate is to be more granular about defaulting to conventional-changelog-angular and fall back to the angular preset values for all keys (if missing in parserOpts), e.g.

const changelogOpts = await defaultChangelogOpts; 
parserOpts = merge(changelogOpts, parserOpts);

Want to lend a hand @robin-drexler?

All of this "stuff" should make its way into the documentation as well. It is very confusing to figure out what options are available. Even if the docs just have links pointing to other repo options.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

foray1010 picture foray1010  ยท  3Comments

marionebl picture marionebl  ยท  4Comments

kirillgroshkov picture kirillgroshkov  ยท  3Comments

ResDiaryLewis picture ResDiaryLewis  ยท  4Comments

whizark picture whizark  ยท  3Comments