| 1 | #!/bin/sh |
| 2 | |
| 3 | # An example hook script to validate a patch (and/or patch series) before |
| 4 | # sending it via email. |
| 5 | # |
| 6 | # The hook should exit with non-zero status after issuing an appropriate |
| 7 | # message if it wants to prevent the email(s) from being sent. |
| 8 | # |
| 9 | # To enable this hook, rename this file to "sendemail-validate". |
| 10 | # |
| 11 | # By default, it will only check that the patch(es) can be applied on top of |
| 12 | # the default upstream branch without conflicts in a secondary worktree. After |
| 13 | # validation (successful or not) of the last patch of a series, the worktree |
| 14 | # will be deleted. |
| 15 | # |
| 16 | # The following config variables can be set to change the default remote and |
| 17 | # remote ref that are used to apply the patches against: |
| 18 | # |
| 19 | # sendemail.validateRemote (default: origin) |
| 20 | # sendemail.validateRemoteRef (default: HEAD) |
| 21 | # |
| 22 | # Replace the TODO placeholders with appropriate checks according to your |
| 23 | # needs. |
| 24 | |
| 25 | validate_cover_letter () { |
| 26 | file="$1" |
| 27 | # TODO: Replace with appropriate checks (e.g. spell checking). |
| 28 | true |
| 29 | } |
| 30 | |
| 31 | validate_patch () { |
| 32 | file="$1" |
| 33 | # Ensure that the patch applies without conflicts. |
| 34 | git am -3 "$file" || return |
| 35 | # TODO: Replace with appropriate checks for this patch |
| 36 | # (e.g. checkpatch.pl). |
| 37 | true |
| 38 | } |
| 39 | |
| 40 | validate_series () { |
| 41 | # TODO: Replace with appropriate checks for the whole series |
| 42 | # (e.g. quick build, coding style checks, etc.). |
| 43 | true |
| 44 | } |
| 45 | |
| 46 | # main ------------------------------------------------------------------------- |
| 47 | |
| 48 | if test "$GIT_SENDEMAIL_FILE_COUNTER" = 1 |
| 49 | then |
| 50 | remote=$(git config --default origin --get sendemail.validateRemote) && |
| 51 | ref=$(git config --default HEAD --get sendemail.validateRemoteRef) && |
| 52 | worktree=$(mktemp --tmpdir -d sendemail-validate.XXXXXXX) && |
| 53 | git worktree add -fd --checkout "$worktree" "refs/remotes/$remote/$ref" && |
| 54 | git config --replace-all sendemail.validateWorktree "$worktree" |
| 55 | else |
| 56 | worktree=$(git config --get sendemail.validateWorktree) |
| 57 | fi || { |
| 58 | echo "sendemail-validate: error: failed to prepare worktree" >&2 |
| 59 | exit 1 |
| 60 | } |
| 61 | |
| 62 | unset GIT_DIR GIT_WORK_TREE |
| 63 | cd "$worktree" && |
| 64 | |
| 65 | if grep -q "^diff --git " "$1" |
| 66 | then |
| 67 | validate_patch "$1" |
| 68 | else |
| 69 | validate_cover_letter "$1" |
| 70 | fi && |
| 71 | |
| 72 | if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" |
| 73 | then |
| 74 | git config --unset-all sendemail.validateWorktree && |
| 75 | trap 'git worktree remove -ff "$worktree"' EXIT && |
| 76 | validate_series |
| 77 | fi |
| 78 | |