summaryrefslogtreecommitdiffstats
path: root/scripts/send-pull-request
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/send-pull-request')
-rwxr-xr-xscripts/send-pull-request133
1 files changed, 133 insertions, 0 deletions
diff --git a/scripts/send-pull-request b/scripts/send-pull-request
new file mode 100755
index 0000000000..0576a5dd44
--- /dev/null
+++ b/scripts/send-pull-request
@@ -0,0 +1,133 @@
1#!/bin/bash
2AUTO=0
3
4usage()
5{
6cat <<EOM
7Usage: $(basename $0) [-h] [-a] [[-t email]...] -p pull-dir
8 -t email Explicitly add email to the recipients
9 -a Automatically harvest recipients from "*-by: email" lines
10 in the patches in the pull-dir
11 -p pull-dir Directory containing summary and patch files
12EOM
13}
14
15# Collect To and CC addresses from the patch files if they exist
16# $1: Which header to add the recipients to, "TO" or "CC"
17# $2: The regex to match and strip from the line with email addresses
18harvest_recipients()
19{
20 TO_CC=$1
21 REGX=$2
22 export IFS=$',\n'
23 for PATCH in $PDIR/*.patch; do
24 # Grab To addresses
25 for EMAIL in $(sed '/^---$/q' $PATCH | grep -e "$REGX" | sed "s/$REGX//"); do
26 if [ "$TO_CC" == "TO" ] && [ "${TO/$EMAIL/}" == "$TO" ] && [ -n "$EMAIL" ]; then
27 if [ -z "$TO" ]; then TO=$EMAIL; else TO="$TO,$EMAIL"; fi
28 elif [ "$TO_CC" == "CC" ] && [ "${CC/$EMAIL/}" == "$CC" ] && [ -n "$EMAIL" ]; then
29 if [ -z "$CC" ]; then CC=$EMAIL; else CC="$CC,$EMAIL"; fi
30 fi
31 done
32 done
33 unset IFS
34}
35
36
37# Parse and verify arguments
38while getopts "ahp:t:" OPT; do
39 case $OPT in
40 a)
41 AUTO=1
42 ;;
43 h)
44 usage
45 exit 0
46 ;;
47 p)
48 PDIR=${OPTARG%/}
49 if [ ! -d $PDIR ]; then
50 echo "ERROR: pull-dir \"$PDIR\" does not exist."
51 usage
52 exit 1
53 fi
54 ;;
55 t)
56 if [ -n "$TO" ]; then
57 TO="$TO,$OPTARG"
58 else
59 TO="$OPTARG"
60 fi
61 ;;
62 esac
63done
64
65if [ -z "$PDIR" ]; then
66 echo "ERROR: you must specify a pull-dir."
67 usage
68 exit 1
69fi
70
71
72# Verify the cover letter is complete and free of tokens
73CL="$PDIR/0000-cover-letter.patch"
74for TOKEN in SUBJECT BLURB; do
75 grep -q "*** $TOKEN HERE ***" "$CL"
76 if [ $? -eq 0 ]; then
77 echo "ERROR: Please edit $CL and try again (Look for '*** $TOKEN HERE ***')."
78 exit 1
79 fi
80done
81
82
83# Harvest emails from the generated patches and populate the TO and CC variables
84# In addition to To and CC headers/lines, the common Signed-off-by, Tested-by,
85# etc. (*-by) will be added to CC.
86if [ $AUTO -eq 1 ]; then
87 harvest_recipients TO "^[Tt][Oo]: *"
88 harvest_recipients CC "^[Cc][Cc]: *"
89 harvest_recipients CC "^.*-[Bb][Yy]: *"
90fi
91
92if [ -z "$TO" ] && [ -z "$CC" ]; then
93 echo "ERROR: you have not specified any recipients."
94 usage
95 exit 1
96fi
97
98
99# Generate report for the user and require confirmation before sending
100cat <<EOM
101The following patches:
102$(for PATCH in $PDIR/*.patch; do echo " $PATCH"; done)
103
104will be sent to the following recipients:
105 To: $TO
106 CC: $CC
107
108EOM
109echo "Continue? [y/N] "
110read cont
111
112if [ "$cont" == "y" ] || [ "$cont" == "Y" ]; then
113 ERROR=0
114 for PATCH in $PDIR/*patch; do
115 # Insert To and CC headers via formail to keep them separate and
116 # appending them to the sendmail command as -- $TO $CC has proven
117 # to be an exercise in futility.
118 #
119 # Use tail to remove the email envelope from git or formail as
120 # msmtp (sendmail) would choke on them.
121 cat $PATCH | formail -I "To: $TO" -I "CC: $CC" | tail -n +2 | sendmail -t
122 if [ $? -eq 1 ]; then
123 ERROR=1
124 fi
125 done
126 if [ $ERROR -eq 1 ]; then
127 echo "ERROR: sendmail failed to send one or more messages. Check your"
128 echo " sendmail log for details."
129 fi
130else
131 echo "Send aborted."
132fi
133