todo/.git/hooks/sendemail-validate.sample

go back
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