/youtrack-prepare-commit-msg

Husky Git hook to add YouTrack ticket ID into the commit message.

Primary LanguageTypeScriptMIT LicenseMIT

youtrack-prepare-commit-msg

Downloads MIT license

The husky command to add YOUTRACK ticket ID into the commit message if it is missed.

The YOUTRACK ticket ID is taken from a git branch name.

Why?

Installing Youtrack prepare commit msg hook into your project will mean everyone contributing code to your project will automatically tag each commit with it's associated issue key based off the branch name.

So if your branch name is feature/TEST-123-new-feature, then when you commit with a message "initial commit" it will automatically become "TEST-123: initial commit".

Why would you want this? Well, Youtrack has many hidden goodies, and this is one of them! If you include an issue key in your commit messages AND you have your deployment pipeline connected to Youtrack this will unlock many bonus features, such as the Deployments view, Cycle time report, Deployment frequency report and I've heard many more features are coming soon!

Installation

Install the package using NPM

npm install husky @chicken-suop/youtrack-prepare-commit-msg@1.6.2 --save-dev && npx husky install

For Husky 5:

Execute command

npx husky add .husky/prepare-commit-msg 'npx @chicken-suop/youtrack-prepare-commit-msg $1'

For Husky 2-4:

Inside your package.json add a standard husky npm script for the git hook

{
  "husky": {
    "hooks": {
      "prepare-commit-msg": "@chicken-suop/youtrack-prepare-commit-msg"
    }
  }
}

Configuration

Starting with v1.3 you can now use different ways of configuring it:

  • youtrack-prepare-commit-msg object in your package.json
  • .youtrackpreparecommitmsgrc file in JSON or YML format
  • youtrack-prepare-commit-msg.config.js file in JS format

See cosmiconfig for more details on what formats are supported.

package.json example:

{
  "youtrack-prepare-commit-msg": {
    "messagePattern": "[$J]\n$M",
    "youtrackTicketPattern": "([A-Z]+-\\d+)",
    "commentChar": "#",
    "isConventionalCommit": false,
    "allowEmptyCommitMessage": false,
    "gitRoot": ""
  }
}

Supported message pattern

youtrack-prepare-commit-msg supports special message pattern to configure where YOUTRACK ticket number will be inserted.

  • Symbols $J will be replaced on YOUTRACK ticket number
  • Symbols $M will be replaced on commit message.

Pattern [$J]\n$M is currently supported by default.

{
  "youtrack-prepare-commit-msg": {
    "messagePattern": "[$J]\n$M"
  }
}
Examples
  • [$J] $M
  • [$J]-$M
  • $J $M

NOTE: the supplied commit message will be cleaned up by strip mode.

Supported YOUTRACK ticket pattern

youtrack-prepare-commit-msg allows using custom regexp string pattern to search YOUTRACK ticket number.

Pattern ([A-Z]+-\\d+) is currently supported by default.

NOTE: to search YOUTRACK ticket pattern flag i is used: new RegExp(pattern, i')

{
  "youtrack-prepare-commit-msg": {
    "youtrackTicketPattern": "([A-Z]+-\\d+)"
  }
}

Git comment char

Git uses # by default to comment lines in the commit message. If default char was changed youtrack-prepare-commit-msg can allow set it.

{
  "youtrack-prepare-commit-msg": {
    "commentChar": "#"
  }
}

Allow empty commit message

The commit message might be empty after cleanup or using -m "", youtrack-prepare-commit-msg might insert the YOUTRACK ticket number anyway if this flag is set.

{
  "youtrack-prepare-commit-msg": {
    "allowEmptyCommitMessage": true
  }
}

Git root

The git root folder might be set. It is either absolute path or relative path which will be resolved from cwd

{
  "youtrack-prepare-commit-msg": {
    "gitRoot": "./../../"
  }
}

The package will search commit message so:

const pathToGit = path.resolve(cwd, './../../');
const pathToCommitMessage = path.join(pathToGit, '.git', 'COMMIT_EDITMSG');

Conventional commit

youtrack-prepare-commit-msg supports conventional commit. To insert YOUTRACK ticket number to the description set the following setting:

{
  "youtrack-prepare-commit-msg": {
    "isConventionalCommit": true
  }
}

NOTE: For description will be applied messagePattern

Examples

If the configuration is:

{
  "youtrack-prepare-commit-msg": {
    "messagePattern": "[$J] $M",
    "isConventionalCommit": true
  }
}

and commit message is fix(test)!: important changes then at result will be fix(test)!: [YOUTRACK-1234] important changes

TODO

  • Support user patterns
  • Support configuration (package.json)
  • Lint
  • Tests
    • Test for configuration
  • Don't clear commit message

License

MIT