Skip to content

Although defined in my commitlint.config.js file as '$', parserOpts.commentChar is superseded by '#' #2351

Closed
@loicraux

Description

@loicraux

Although defined in my commitlint.config.js file as '$', parserOpts.commentChar is superseded by '#'

In the commit messages of my repository, references to issues starts with a '#' character.
I have also set the commentChar for git to '$' since older (before I setup commitlint) commit messages could start with a '#' for such references : git config --local core.commentChar '$'
E.g. of old commit : #123456 - double API now really doubles the passed number

// commitlint.config.js

const ERROR = 2;
const WARNING = 1;

module.exports = {
    extends: ['@commitlint/config-conventional'],
    parserPreset: {
        parserOpts: {
            referenceActions: null,
            commentChar: '$' // <------ SEE HERE
        }
    },
    rules: {
        'body-max-line-length': [ERROR, 'always', 130],
        'footer-max-line-length': [ERROR, 'always', 130],
        'header-max-length': [ERROR, 'always', 130],
        'references-empty': [ERROR, 'never'],
        'subject-case': [ERROR, 'never', ['start-case', 'pascal-case', 'upper-case']],
        'subject-full-stop': [WARNING, 'never', '.'],
        'type-enum': [ERROR, 'always', ['build', 'chore', 'deploy', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'test']]
    }
};

// package.json :

    "husky": {
        "hooks": {
            "pre-commit": "lint-staged",
            "commit-msg": "commitlint -E HUSKY_GIT_PARAMS --help-url='https://some.url'"
        }
    },

Now with such a config (see my commmitlint.config.js below in details section), I run the following git commit -am "..." commands :

  1. git commit -am "fix: #233601"
  2. git commit -am "foo #123456"
  3. git commit -a then in the editor opened for the message, I write a single line #123456
  4. git commit -am "#123456"

Expected Behavior

  1. should succeed
  2. should fail because no type is provided
  3. should fail because no type is provided
  4. should fail because no type is provided

Current Behavior

  1. does succeed ✅
  2. does fail ✅
  3. does fail ✅
  4. does succeed ❌

Affected packages

  • cli (I guess)

Possible Solution / Observations

We can observe that :

  • commitlint corrrectly discard the message "#123456" when git commit command is used (I guess because it wrongly thinks the message is empty)
  • commitlint somehow wrongly accepts the same message when git commit -m "#123456" command is used, despite there are no more lines after wrongly stripping the comments => first bug ?

Also : The logic behind how flags.edit is set to '.git/COMMIT_EDITMSG' from my commitlint -E HUSKY_GIT_PARAMS command in husky pre-commit hook is not clear for me, but for sure this line is very suspicious to me :

opts.parserOpts.commentChar = '#';

How can commitlint CLI hardcode the comment char as # ?? This does not work for anyone using a different Git commentChar... Somehow commitlint HAS to take into account my commentChar option set in my commitlint.config.js (another option would be to get it from git config, but I guess that's not the purpose of commitlint)

This logic has been introduced by this commit FYI :
35d0ca5

Environment

Reproduced on MacOs and Windows machines.

Executable Version
commitlint --version @commitlint/cli@11.0.0
git --version git version 2.20.1 (Apple Git-117)
node --version v14.8.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions