#!/bin/bash # # PRE-COMMIT, hook script to verify what is about to be committed # Copyright (C) 2022-2023 Xavier Delaruelle # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ########################################################################## # redirect output to stderr. exec 1>&2 # apply SGR code to message if output channel is attached to terminal sgr() { local code=$1 local msg=$2 if [ -t 2 ]; then echo "\033[${code}m${msg}\033[0m" else echo "$msg" fi } echo_warning() { echo -e "$(sgr 43 WARNING): $1" } echo_error() { echo -e "$(sgr 41 ERROR): $1" } # fail if there are misspellings (check all files) command -v codespell >/dev/null if [ $? -eq 0 ]; then git diff --cached HEAD | grep '^[+][^+]' | codespell - if [ $? -ne 0 ]; then exit 1 fi else echo_warning "codespell command not found" fi # interactively check misspellings in doc files command -v hunspell >/dev/null if [ $? -eq 0 ]; then misspell=0 HUNSPELL_OPTS=(-d en_US -p .hunspell.en.dic) for docfile in $(git diff --cached --name-only --diff-filter=d | grep -E\ '(.rst|.md)$'); do words=$(git diff --cached "$docfile" | grep '^[+][^+]' | hunspell\ "${HUNSPELL_OPTS[@]}" -l) if [ -n "$words" ]; then # interactively edit file to fix misspellings hunspell "${HUNSPELL_OPTS[@]}" "$docfile" /dev/tty; misspell=1 fi done # abort if misspellings were found as commit content should be adapted if [ $misspell -eq 1 ]; then echo_error "misspelling found, commit should be updated" exit 1 fi else echo_warning "hunspell command not found" fi # fail if there are whitespace errors git diff-index --check --cached HEAD -- if [ $? -ne 0 ]; then exit 1 fi exit 0 # vim:set tabstop=3 shiftwidth=3 expandtab autoindent: