blob: 21eb302169c5845800f7941f7870582adf51873c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
#!/bin/bash
AUTO=0
AUTO_CL=0
# Prevent environment leakage to these vars.
unset TO
unset CC
unset AUTO_CC
usage()
{
cat <<EOM
Usage: $(basename $0) [-h] [-a] [-c] [[-t email]...] -p pull-dir
-a Send the cover letter to every recipient listed in Cc and
Signed-off-by lines found in the cover letter and the patches.
This option implies -c.
-c Expand the Cc list for the individual patches using the Cc and
Signed-off-by lines from the same patch.
-p pull-dir Directory containing summary and patch files
-t email Explicitly add email to the recipients
EOM
}
# Collect addresses from a patch into AUTO_CC
# $1: a patch file
harvest_recipients()
{
PATCH=$1
export IFS=$',\n'
for REGX in "^[Cc][Cc]: *" "^[Ss]igned-[Oo]ff-[Bb]y: *"; do
for EMAIL in $(sed '/^---$/q' $PATCH | grep -e "$REGX" | sed "s/$REGX//"); do
if [ "${AUTO_CC/$EMAIL/}" == "$AUTO_CC" ] && [ -n "$EMAIL" ]; then
if [ -z "$AUTO_CC" ]; then
AUTO_CC=$EMAIL;
else
AUTO_CC="$AUTO_CC,$EMAIL";
fi
fi
done
done
unset IFS
}
check_git_sendemail_config()
{
GIT_SMTP=$(git config sendemail.smtpserver)
GIT_FROM=$(git config sendemail.from)
if [ -z "$GIT_SMTP" ] || [ -z "$GIT_FROM" ]; then
echo "ERROR: git sendemail is not configured."
echo "Please read GIT-SEND-EMAIL(1) and configure:"
echo " sendemail.smtpserver"
echo " sendemail.from"
exit 1
fi
}
# Parse and verify arguments
while getopts "achp:t:" OPT; do
case $OPT in
a)
AUTO_CL=1
AUTO=1
;;
c)
AUTO=1
;;
h)
usage
exit 0
;;
p)
PDIR=${OPTARG%/}
if [ ! -d $PDIR ]; then
echo "ERROR: pull-dir \"$PDIR\" does not exist."
usage
exit 1
fi
;;
t)
if [ -n "$TO" ]; then
TO="$TO,$OPTARG"
else
TO="$OPTARG"
fi
;;
esac
done
# Abort early if git-send-email is not properly configured
check_git_sendemail_config
if [ -z "$PDIR" ]; then
echo "ERROR: you must specify a pull-dir."
usage
exit 1
fi
# Verify the cover letter is complete and free of tokens
CL="$PDIR/0000-cover-letter.patch"
for TOKEN in SUBJECT BLURB; do
grep -q "*** $TOKEN HERE ***" "$CL"
if [ $? -eq 0 ]; then
echo "ERROR: Please edit $CL and try again (Look for '*** $TOKEN HERE ***')."
exit 1
fi
done
# Harvest emails from the generated patches and populate AUTO_CC.
if [ $AUTO_CL -eq 1 ]; then
for PATCH in $PDIR/*.patch; do
harvest_recipients $PATCH
done
fi
AUTO_TO="$(git config sendemail.to)"
if [ -n "$AUTO_TO" ]; then
if [ -n "$TO" ]; then
TO="$TO,$AUTO_TO"
else
TO="$AUTO_TO"
fi
fi
if [ -z "$TO" ] && [ -z "$AUTO_CC" ]; then
echo "ERROR: you have not specified any recipients."
usage
exit 1
fi
# Generate report for the user and require confirmation before sending
cat <<EOM
The following patches:
$(for PATCH in $PDIR/*.patch; do echo " $PATCH"; done)
will now be sent via the git send-email command. Git will prompt you before
sending any email.
EOM
echo "Continue? [y/N] "
read cont
if [ "$cont" == "y" ] || [ "$cont" == "Y" ]; then
ERROR=0
export IFS=$','
GIT_TO=$(for R in $TO; do echo -n "--to='$R' "; done)
GIT_CC=$(for R in $AUTO_CC; do echo -n "--cc='$R' "; done)
unset IFS
for PATCH in $PDIR/*patch; do
if [ $AUTO -eq 1 ]; then
if [ $PATCH == "$CL" ] && [ $AUTO_CL -eq 1 ]; then
# Send the cover letter to every recipient, both
# specified as well as harvested.
eval "git send-email $GIT_TO $GIT_CC --confirm=always --no-chain-reply-to --suppress-cc=all $PATCH"
else
# Send the patch to the specified recipients and
# those git finds in this specific patch.
eval "git send-email $GIT_TO --confirm=always --no-chain-reply-to --signed-off-by-cc $PATCH"
fi
else
# Only send to the explicitly specified recipients
eval "git send-email $GIT_TO --confirm=always --no-chain-reply-to --suppress-cc=all $PATCH"
fi
if [ $? -eq 1 ]; then
ERROR=1
fi
done
if [ $ERROR -eq 1 ]; then
echo "ERROR: Failed to send one or more messages."
fi
else
echo "Send aborted."
fi
|