#!/bin/bash # # PRE-COMMIT, hook script to verify what is about to be committed # Copyright (C) 2022 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 aspell >/dev/null if [ $? -eq 0 ]; then misspell=0 ASPELL_OPTS='-l en -x --home-dir=. --personal=.aspell.en.pws' for docfile in $(git diff --cached --name-only --diff-filter=d | grep -E\ '(.rst|.md)$'); do words=$(git diff --cached $docfile | grep '^[+][^+]' | aspell\ $ASPELL_OPTS list) if [ -n "$words" ]; then # interactively edit file to fix misspellings aspell $ASPELL_OPTS check $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 "aspell 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: