;dev: bin: commitlint: check for preferred style in commit messages
This commit is contained in:
		
							parent
							
								
									8b1650c6af
								
							
						
					
					
						commit
						215e90ad78
					
				
							
								
								
									
										98
									
								
								bin/commitlint
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										98
									
								
								bin/commitlint
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,98 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | # shellcheck disable=SC2059 | ||||||
|  | # | ||||||
|  | # Check git commits for compliance with hledger's conventions, | ||||||
|  | # described at https://hledger.org/CONTRIBUTING.html#commit-messages. | ||||||
|  | # | ||||||
|  | # Usage: | ||||||
|  | # commitlint [GITREV|GITRANGE] | ||||||
|  | #   Checks unpushed commits, or the specified commit or range. | ||||||
|  | #   If the argument contains - or .. it's a range, otherwise a single commit. | ||||||
|  | # | ||||||
|  | # Examples: | ||||||
|  | # commitlint                              # unpushed commits | ||||||
|  | # commitlint HEAD                         # last commit | ||||||
|  | # commitlint d5d19f841                    # this commit | ||||||
|  | # commitlint -20                          # last 20 commits | ||||||
|  | # commitlint master..                     # commits in this branch | ||||||
|  | # commitlint 1.21..1.22 | grep -F [FAIL]  # bad commits in 1.22 release cycle | ||||||
|  | 
 | ||||||
|  | if [[ -n ${NO_COLOR+set} ]] | ||||||
|  | then | ||||||
|  |     RED="" | ||||||
|  |     GRN="" | ||||||
|  |     NRM="" | ||||||
|  | else | ||||||
|  |     RED="\033[31m" | ||||||
|  |     GRN="\033[32m" | ||||||
|  |     NRM="\033[0m" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # checkcommit GITHASH - check this commit's message and print result | ||||||
|  | function checkcommit() | ||||||
|  | { | ||||||
|  |     HASH=${1} | ||||||
|  |     SUMMARY=$(git log -1 "$HASH" --pretty=format:"%s") | ||||||
|  | 
 | ||||||
|  |     # Does the summary have a type: prefix ? | ||||||
|  |     # Can begin with ; and/or end with !, some spaces are tolerated. | ||||||
|  |     FMT="%s %-60s  %b${NRM}\n" | ||||||
|  |     if ! echo "$SUMMARY" | grep -qE '^(; *)?\w+:[ \w]+!?' | ||||||
|  |     then | ||||||
|  |         printf "$FMT" "$HASH" "$SUMMARY" "${RED}[FAIL]" | ||||||
|  |         STATUS=1 | ||||||
|  |     else | ||||||
|  |         printf "$FMT" "$HASH" "$SUMMARY" "${GRN}[ok]" | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | RANGE=${*:-"@{u}.."}  # @{u} = upstream | ||||||
|  | 
 | ||||||
|  | if [[ ! $RANGE =~ (-|\.\.) ]] | ||||||
|  | then | ||||||
|  |     RANGE=$RANGE^!  # assume range is a single commit | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | HASHES=$(git log --abbrev-commit --pretty=format:%h "$RANGE") | ||||||
|  | 
 | ||||||
|  | STATUS= | ||||||
|  | for HASH in $HASHES; do | ||||||
|  |     checkcommit "$HASH" | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | if [[ -z $STATUS ]] | ||||||
|  | then | ||||||
|  |     printf "" # "${GRN}Ok${NRM}\n" | ||||||
|  | else | ||||||
|  |     printf "\n${RED}Some commits are not in preferred style.${NRM}\n" | ||||||
|  |     cat <<EOF | ||||||
|  | --------------------------------------------------------------------------- | ||||||
|  | Commit messages should follow this format: | ||||||
|  | 
 | ||||||
|  |   [;]type[!]: [topic:] summary | ||||||
|  | 
 | ||||||
|  |   [Optional description, ready for release notes/changelog.] | ||||||
|  | 
 | ||||||
|  | Explanation: | ||||||
|  | 
 | ||||||
|  | The subject line should have a type: prefix. Common types: | ||||||
|  |  feat imp fix            - end-user changes (->release notes & changelogs) | ||||||
|  |  cha pkg lib             - packager/builder/lib-user changes (->changelogs) | ||||||
|  |  dev doc test ci ref cln - developer changes | ||||||
|  | 
 | ||||||
|  | It may additionally have a topic prefix such as: | ||||||
|  |  (see https://hledger.org/CONTRIBUTING.html#open-issues -> COMPONENT) | ||||||
|  | 
 | ||||||
|  | Mention any related issues, usually parenthesised at end of summary: (#1234) | ||||||
|  | ! indicates a breaking change. | ||||||
|  | ; skips expensive CI tests. | ||||||
|  | 
 | ||||||
|  | These conventions are evolving. In practice, any type or topic will | ||||||
|  | do. Use your best judgement and we'll polish during code review. | ||||||
|  | More detail: https://hledger.org/CONTRIBUTING.html#commit-messages | ||||||
|  | --------------------------------------------------------------------------- | ||||||
|  | EOF | ||||||
|  | 
 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | exit 0"$STATUS" | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user