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