]> git.ipfire.org Git - thirdparty/git.git/blob - templates/hooks--sendemail-validate.sample
Merge branch 'bb/unicode-width-table-15'
[thirdparty/git.git] / templates / hooks--sendemail-validate.sample
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