3c8d3adeae
When sending patch series (with a cover-letter or not) sendemail-validate is called with every email/patch file independently from the others. When one of the patches depends on a previous one, it may not be possible to use this hook in a meaningful way. A hook that wants to check some property of the whole series needs to know which patch is the final one. Expose the current and total number of patches to the hook via the GIT_SENDEMAIL_PATCH_COUNTER and GIT_SENDEMAIL_PATCH_TOTAL environment variables so that both incremental and global validation is possible. Sharing any other state between successive invocations of the validate hook must be done via external means. For example, by storing it in a git config sendemail.validateWorktree entry. Add a sample script with placeholder validations and update tests to check that the counters are properly exported. Suggested-by: Phillip Wood <phillip.wood123@gmail.com> Signed-off-by: Robin Jarry <robin@jarry.cc> Signed-off-by: Junio C Hamano <gitster@pobox.com>
78 lines
2.3 KiB
Bash
Executable File
78 lines
2.3 KiB
Bash
Executable File
#!/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
|