-
-
Save johncmunson/ca02a8027a923a7f4b2f662c67d6528c to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| # | |
| # Inspects branch name and checks if it contains a Jira ticket number (i.e. ABC-123). | |
| # If yes, commit message will be automatically prepended with [ABC-123]. | |
| # | |
| # Useful for looking through git history and relating a commit or group of commits | |
| # back to a user story. | |
| # | |
| BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) | |
| # Ensure BRANCH_NAME is not empty and is not in a detached HEAD state (i.e. rebase). | |
| # SKIP_PREPARE_COMMIT_MSG may be used as an escape hatch to disable this hook, | |
| # while still allowing other githooks to run. | |
| if [ ! -z "$BRANCH_NAME" ] && [ "$BRANCH_NAME" != "HEAD" ] && [ "$SKIP_PREPARE_COMMIT_MSG" != 1 ]; then | |
| PREFIX_PATTERN='[A-Z]{2,5}-[0-9]{1,4}' | |
| [[ $BRANCH_NAME =~ $PREFIX_PATTERN ]] | |
| PREFIX=${BASH_REMATCH[0]} | |
| PREFIX_IN_COMMIT=$(grep -c "\[$PREFIX\]" $1) | |
| # Ensure PREFIX exists in BRANCH_NAME and is not already present in the commit message | |
| if [[ -n "$PREFIX" ]] && ! [[ $PREFIX_IN_COMMIT -ge 1 ]]; then | |
| sed -i.bak -e "1s~^~[$PREFIX] ~" $1 | |
| fi | |
| fi | |
| # | |
| # Resources: | |
| # - https://gist.github.com/bartoszmajsak/1396344 | |
| # - https://stackoverflow.com/questions/34213120/find-branch-name-during-git-rebase | |
| # - https://github.com/typicode/husky/issues/311#issuecomment-580237182 | |
| # - https://gmurphey.github.io/2013/02/02/ignoring-git-hooks-when-rebasing.html#.XkK1AhNKjOQ | |
| # - https://mikemadisonweb.github.io/2018/12/18/git-hook-prepending-commit-message/ | |
| # - https://stackoverflow.com/questions/5894946/how-to-add-gits-branch-name-to-the-commit-message | |
| # - http://blog.bartoszmajsak.com/blog/2012/11/07/lazy-developers-toolbox-number-1-prepend-git-commit-messages/ | |
| # - https://docs.npmjs.com/files/package.json#bin | |
| # - https://www.deadcoderising.com/how-to-smoothly-develop-node-modules-locally-using-npm-link/ | |
| # - https://github.com/sindresorhus/execa | |
| # - https://github.com/shelljs/shelljs | |
| # | |
| # | |
| # Alternative method for finding the branch name | |
| # | |
| # Note that during a rebase, this will return something like | |
| # (no branch, rebasing ABC-123-feature-x) | |
| # instead of | |
| # HEAD | |
| # | |
| # BRANCH_NAME=$(git branch | grep '*' | sed 's/* //') | |
| # | |
| # | |
| # Also, don't forget to place this inside package.json if this is part of a node/npm project | |
| # | |
| # "husky": { | |
| # "hooks": { | |
| # "prepare-commit-msg": "./prepare-commit-msg.sh $HUSKY_GIT_PARAMS" | |
| # } | |
| # } | |
| # |
Thanks @cmackenzie1! I like where you're coming from, but I tested out your regex and it didn't seem to work when dropped into the bash script (even though it works as expected when testing on regex101.com).
It probably just needs a slight tweak to work in the context of bash, but my bash-fu isn't strong enough to get it right.
In the meantime, I think PREFIX_PATTERN='[A-Z]{2,5}-[0-9]{1,4}' is a slight improvement over what I had previously, PREFIX_PATTERN='[A-Z]{4}-[0-9]{3,4}', so that it works with a wider variety of Jira ticket formats.
You can get really flexible and use PREFIX_PATTERN='[A-Z]{2+}-[0-9]{2+}' which I believe would allow strings like CHEMAPP-01` and "ABC-1111"
Nice, thanks @dmwelch. I took a crack this weekend at turning this into an npm package.
The general idea is...
- npm install prefix-commit
- Under the husky section in package.json...
"prepare-commit-msg": "PATTERN='...' prefix-commit"
Husky is successfully running the installed script, but when it's run in this context I'm getting the following error when it reaches sed on line 43...
sed: -i may not be used with stdin
Nice, thanks @dmwelch. I took a crack this weekend at turning this into an npm package.
The general idea is...
- npm install prefix-commit
- Under the husky section in package.json...
"prepare-commit-msg": "PATTERN='...' prefix-commit"Husky is successfully running the installed script, but when it's run in this context I'm getting the following error when it reaches
sedon line 43...sed: -i may not be used with stdin
This is because husky is piping the message through stdin and not as a file. Take a look at https://github.com/bk201-/jira-prepare-commit-msg
Hello @johncmunson , thank you for the amazing script. Can you give me an example of how to use SKIP_PREPARE_COMMIT_MSG?
Hi! Thank you for your script, there are some notes:
- the regex mentioned above doesn't work, you should use
{2,}instead of{2+}. So use this[A-Z]{2,}-[0-9]{2,}`. - this hook executes on a merge commit, so you need to add
[ $2 != merge ].
Nice script. I would suggest a minor change to the
PREFIX_PATTERN. As it currently is, it only supports tickets that have a code of only 4 letters.A more general regex would be as follows: https://regex101.com/r/o3ubPk/1