diff options
Diffstat (limited to 'gitlint/files')
-rw-r--r-- | gitlint/files/commit-msg | 81 | ||||
-rw-r--r-- | gitlint/files/gitlint | 106 |
2 files changed, 187 insertions, 0 deletions
diff --git a/gitlint/files/commit-msg b/gitlint/files/commit-msg new file mode 100644 index 0000000..e468290 --- /dev/null +++ b/gitlint/files/commit-msg @@ -0,0 +1,81 @@ +#!/bin/sh +### gitlint commit-msg hook start ### + +# Determine whether we have a tty available by trying to access it. +# This allows us to deal with UI based gitclient's like Atlassian SourceTree. +# NOTE: "exec < /dev/tty" sets stdin to the keyboard +stdin_available=1 +(exec < /dev/tty) 2> /dev/null || stdin_available=0 + +if [ $stdin_available -eq 1 ]; then + # Set bash color codes in case we have a tty + RED="\033[31m" + YELLOW="\033[33m" + GREEN="\033[32m" + END_COLOR="\033[0m" + + # Now that we know we have a functional tty, set stdin to it so we can ask the user questions :-) + exec < /dev/tty +else + # Unset bash colors if we don't have a tty + RED="" + YELLOW="" + GREEN="" + END_COLOR="" +fi + +run_gitlint(){ + echo "gitlint: checking commit message..." + python -m gitlint.cli --staged --msg-filename "$1" + gitlint_exit_code=$? +} + +# Prompts a given yes/no question. +# Returns 0 if user answers yes, 1 if no +# Reprompts if different answer +ask_yes_no_edit(){ + ask_yes_no_edit_result="no" + # If we don't have a stdin available, then just return "No". + if [ $stdin_available -eq 0 ]; then + ask_yes_no_edit_result="no" + return; + fi + # Otherwise, ask the question until the user answers yes or no + question="$1" + while true; do + read -p "$question" yn + case $yn in + [Yy]* ) ask_yes_no_edit_result="yes"; return;; + [Nn]* ) ask_yes_no_edit_result="no"; return;; + [Ee]* ) ask_yes_no_edit_result="edit"; return;; + esac + done +} + +run_gitlint "$1" + +while [ $gitlint_exit_code -gt 0 ]; do + echo "-----------------------------------------------" + echo "gitlint: ${RED}Your commit message contains the above violations.${END_COLOR}" + ask_yes_no_edit "Continue with commit anyways (this keeps the current commit message)? [y(es)/n(no)/e(dit)] " + if [ $ask_yes_no_edit_result = "yes" ]; then + exit 0 + elif [ $ask_yes_no_edit_result = "edit" ]; then + EDITOR=${EDITOR:-vim} + $EDITOR "$1" + run_gitlint "$1" + else + echo "Commit aborted." + echo "Your commit message: " + echo "-----------------------------------------------" + cat "$1" + echo "-----------------------------------------------" + + exit $gitlint_exit_code + fi +done + +echo "gitlint: ${GREEN}OK${END_COLOR} (no violations in commit message)" +exit 0 + +### gitlint commit-msg hook end ### diff --git a/gitlint/files/gitlint b/gitlint/files/gitlint new file mode 100644 index 0000000..15a6626 --- /dev/null +++ b/gitlint/files/gitlint @@ -0,0 +1,106 @@ +# Edit this file as you like. +# +# All these sections are optional. Each section with the exception of [general] represents +# one rule and each key in it is an option for that specific rule. +# +# Rules and sections can be referenced by their full name or by id. For example +# section "[body-max-line-length]" could be written as "[B1]". Full section names are +# used in here for clarity. +# +# [general] +# Ignore certain rules, this example uses both full name and id +# ignore=title-trailing-punctuation, T3 + +# verbosity should be a value between 1 and 3, the commandline -v flags take precedence over this +# verbosity = 2 + +# By default gitlint will ignore merge, revert, fixup and squash commits. +# ignore-merge-commits=true +# ignore-revert-commits=true +# ignore-fixup-commits=true +# ignore-squash-commits=true + +# Ignore any data send to gitlint via stdin +# ignore-stdin=true + +# Fetch additional meta-data from the local repository when manually passing a +# commit message to gitlint via stdin or --commit-msg. Disabled by default. +# staged=true + +# Enable debug mode (prints more output). Disabled by default. +# debug=true + +# Enable community contributed rules +# See http://jorisroovers.github.io/gitlint/contrib_rules for details +# contrib=contrib-title-conventional-commits,CC1 + +# Set the extra-path where gitlint will search for user defined rules +# See http://jorisroovers.github.io/gitlint/user_defined_rules for details +# extra-path=examples/ + +# This is an example of how to configure the "title-max-length" rule and +# set the line-length it enforces to 80 +# [title-max-length] +# line-length=50 + +# [title-must-not-contain-word] +# Comma-separated list of words that should not occur in the title. Matching is case +# insensitive. It's fine if the keyword occurs as part of a larger word (so "WIPING" +# will not cause a violation, but "WIP: my title" will. +# words=wip + +# [title-match-regex] +# python like regex (https://docs.python.org/2/library/re.html) that the +# commit-msg title must be matched to. +# Note that the regex can contradict with other rules if not used correctly +# (e.g. title-must-not-contain-word). +# regex=^US[0-9]* + +# [body-max-line-length] +# line-length=72 + +# [body-min-length] +# min-length=5 + +# [body-is-missing] +# Whether to ignore this rule on merge commits (which typically only have a title) +# default = True +# ignore-merge-commits=false + +# [body-changed-file-mention] +# List of files that need to be explicitly mentioned in the body when they are changed +# This is useful for when developers often erroneously edit certain files or git submodules. +# By specifying this rule, developers can only change the file when they explicitly reference +# it in the commit message. +# files=gitlint/rules.py,README.md + +# [author-valid-email] +# python like regex (https://docs.python.org/2/library/re.html) that the +# commit author email address should be matched to +# For example, use the following regex if you only want to allow email addresses from foo.com +# regex=[^@]+@foo.com + +# [ignore-by-title] +# Ignore certain rules for commits of which the title matches a regex +# E.g. Match commit titles that start with "Release" +# regex=^Release(.*) + +# Ignore certain rules, you can reference them by their id or by their full name +# Use 'all' to ignore all rules +# ignore=T1,body-min-length + +# [ignore-by-body] +# Ignore certain rules for commits of which the body has a line that matches a regex +# E.g. Match bodies that have a line that that contain "release" +# regex=(.*)release(.*) +# +# Ignore certain rules, you can reference them by their id or by their full name +# Use 'all' to ignore all rules +# ignore=T1,body-min-length + +# This is a contrib rule - a community contributed rule. These are disabled by default. +# You need to explicitly enable them one-by-one by adding them to the "contrib" option +# under [general] section above. +# [contrib-title-conventional-commits] +# Specify allowed commit types. For details see: https://www.conventionalcommits.org/ +# types = bugfix,user-story,epic
\ No newline at end of file |