| #!/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 |