diff options
Diffstat (limited to 'hooks')
-rwxr-xr-x | hooks/pre-commit | 132 | ||||
-rw-r--r-- | hooks/pre-commit.conf.template | 27 |
2 files changed, 159 insertions, 0 deletions
diff --git a/hooks/pre-commit b/hooks/pre-commit new file mode 100755 index 00000000..884f8246 --- /dev/null +++ b/hooks/pre-commit @@ -0,0 +1,132 @@ +#!/bin/bash +# +# A hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. + +# +# Checks provided by the hook template +# + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +git diff-index --check --cached $against -- + +# +# Check formating of the commited .po files +# + +# Get the list of updated po files +po_files=`git diff --cached --name-only --diff-filter=ACM | grep '\.po$'` +# Run 'msgfmt -vc' on each po file +# Warn about each malformed file and abort the commit if needed +failure=0 +for po_file in $po_files +do + msgfmt -vc $po_file > /dev/null 2>&1 + if [ $? -eq 1 ]; then + echo "Error: Malformed file $po_file" + echo "\tPlease run 'msgfmt -vc $po_file' and fix the reported errors." + failure=1 + fi +done + +# Exit only in case of error. +if [ $failure -eq 1 ]; then + exit $failure +fi + +# +# Sending of [DONE] messages +# + +CONFIG_FILE=hooks/pre-commit.conf +# Bump this version number whenever a new, non-retrocompatible change +# is introduced in the configuration. +PRECOMMIT_SCRIPT_VERSION=1 +if [ -f "$CONFIG_FILE" ]; then + . "$CONFIG_FILE" + if [ $PRECOMMIT_SCRIPT_VERSION -ne $PRECOMMIT_CONFIG_VERSION ]; then + echo "Mismatch between the script and your configuration file." + echo "Please update your configuration according to the template and update the value of \$PRECOMMIT_CONFIG_VERSION to $PRECOMMIT_SCRIPT_VERSION." + exit 1 + fi + + # Prepare [DONE] messages + # First, collect the message-ids of the [RFR] or [LCFC] messages matching the files. + # Note: One message can be about several files, so we have to gather them. + content=$(curl -L --silent $COORDINATION_URL) + declare -A messages + for po_file in $po_files + do + name=$(echo "$po_file" | sed -E 's#po/.+/##' | sed -E 's/\..*//') + msgurl=$(echo "$content" | grep -A 6 "<td>manpages" | grep -A 4 "<td>$name/" | grep -o "https.*html") + if [ -z "$msgurl" ] + then + echo "$po_file has not been found on $COORDINATION_URL" + else + msg=$(curl -L --silent $msgurl) + msgid=$(echo "$msg" | grep "Message-id" | grep -oP '"/msgid-search/.*?"' | sed 's#"/msgid-search/\(.*\)"#\1#') + title=$(echo "$msg" | grep h1 | sed -E 's/<.?h1>//g' | sed -E 's/\[.*\]//') + messages[$msgid]=$title + fi + done + + # Now, for each collected message, send a [DONE] reply to the l10n list. + for msgid in "${!messages[@]}" + do + case $MUA in + mailto) + # Escape line endings so they can be correctly interpreted by the MUA. + escaped_done_msg=$(echo "$DONE_MSG" | sed ':a;N;$!ba;s/\n/%0D%0A/g') + echo -e 'Ctrl+click on \e]8;;mailto:'"${LIST_ADDRESS}"'?subject=[DONE] '"${messages[$msgid]}"'&in-reply-to=<'"$msgid"'>&body='"$escaped_done_msg"'\e\\this link\e]8;;\e\\ to send your message.' + ;; + thunderbird) + thunderbird -compose "to='${LIST_ADDRESS}',subject='[DONE] ${messages[$msgid]}',body='$DONE_MSG'" + ;; + *) + echo "Unknown Mail User Agent, you can use 'mailto' for the default behavior." + ;; + esac + done +fi + +exit 0 diff --git a/hooks/pre-commit.conf.template b/hooks/pre-commit.conf.template new file mode 100644 index 00000000..535d3c77 --- /dev/null +++ b/hooks/pre-commit.conf.template @@ -0,0 +1,27 @@ +# This file is a template for the configuration of the pre-commit hook +# Please copy this file as pre-commit.conf + +# Version checking, please do not change the following value +PRECOMMIT_CONFIG_VERSION=1 + +# Address of your l10n mailing list +LIST_ADDRESS= + +# URL of the coordination page for your language, ordered by status +# It should look like https://l10n.debian.org/coordination/french/fr.by_status.html +# All languages pages can be easily found on https://l10n.debian.org/coordination +COORDINATION_URL= + +# Body of the DONE messages to be sent when you commit +DONE_MSG="Hello, +This translation is done. +Thanks for your reviews. +Best regards, +Your fellow Debian contributor" + +# Your favorite Mail User Agent. +# If your MUA is not in the list below, please open an issue or provide a patch. +# Available choices: +# * mailto - displays a 'mailto:' link, click it and your default MUA will pop up. +# * thunderbird - directly opens a thunderbird editing window. NOTE: will not allow you to reply to a thread. +MUA=mailto
\ No newline at end of file |