| #!/bin/sh |
| |
| # An example hook script to validate a patch (and/or patch series) before |
| # sending it via email. |
| # |
| # The hook should exit with non-zero status after issuing an appropriate |
| # message if it wants to prevent the email(s) from being sent. |
| # |
| # To enable this hook, rename this file to "sendemail-validate". |
| # |
| # By default, it will only check that the patch(es) can be applied on top of |
| # the default upstream branch without conflicts in a secondary worktree. After |
| # validation (successful or not) of the last patch of a series, the worktree |
| # will be deleted. |
| # |
| # The following config variables can be set to change the default remote and |
| # remote ref that are used to apply the patches against: |
| # |
| # sendemail.validateRemote (default: origin) |
| # sendemail.validateRemoteRef (default: HEAD) |
| # |
| # Replace the TODO placeholders with appropriate checks according to your |
| # needs. |
| |
| validate_cover_letter () { |
| file="$1" |
| # TODO: Replace with appropriate checks (e.g. spell checking). |
| true |
| } |
| |
| validate_patch () { |
| file="$1" |
| # Ensure that the patch applies without conflicts. |
| git am -3 "$file" || return |
| # TODO: Replace with appropriate checks for this patch |
| # (e.g. checkpatch.pl). |
| true |
| } |
| |
| validate_series () { |
| # TODO: Replace with appropriate checks for the whole series |
| # (e.g. quick build, coding style checks, etc.). |
| true |
| } |
| |
| # main ------------------------------------------------------------------------- |
| |
| if test "$GIT_SENDEMAIL_FILE_COUNTER" = 1 |
| then |
| remote=$(git config --default origin --get sendemail.validateRemote) && |
| ref=$(git config --default HEAD --get sendemail.validateRemoteRef) && |
| worktree=$(mktemp --tmpdir -d sendemail-validate.XXXXXXX) && |
| git worktree add -fd --checkout "$worktree" "refs/remotes/$remote/$ref" && |
| git config --replace-all sendemail.validateWorktree "$worktree" |
| else |
| worktree=$(git config --get sendemail.validateWorktree) |
| fi || { |
| echo "sendemail-validate: error: failed to prepare worktree" >&2 |
| exit 1 |
| } |
| |
| unset GIT_DIR GIT_WORK_TREE |
| cd "$worktree" && |
| |
| if grep -q "^diff --git " "$1" |
| then |
| validate_patch "$1" |
| else |
| validate_cover_letter "$1" |
| fi && |
| |
| if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" |
| then |
| git config --unset-all sendemail.validateWorktree && |
| trap 'git worktree remove -ff "$worktree"' EXIT && |
| validate_series |
| fi |