diff options
| -rwxr-xr-x | scripts/send-pull-request | 133 |
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 | ||
| 2 | AUTO=0 | ||
| 3 | |||
| 4 | usage() | ||
| 5 | { | ||
| 6 | cat <<EOM | ||
| 7 | Usage: $(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 | ||
| 12 | EOM | ||
| 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 | ||
| 18 | harvest_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 | ||
| 38 | while 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 | ||
| 63 | done | ||
| 64 | |||
| 65 | if [ -z "$PDIR" ]; then | ||
| 66 | echo "ERROR: you must specify a pull-dir." | ||
| 67 | usage | ||
| 68 | exit 1 | ||
| 69 | fi | ||
| 70 | |||
| 71 | |||
| 72 | # Verify the cover letter is complete and free of tokens | ||
| 73 | CL="$PDIR/0000-cover-letter.patch" | ||
| 74 | for 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 | ||
| 80 | done | ||
| 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. | ||
| 86 | if [ $AUTO -eq 1 ]; then | ||
| 87 | harvest_recipients TO "^[Tt][Oo]: *" | ||
| 88 | harvest_recipients CC "^[Cc][Cc]: *" | ||
| 89 | harvest_recipients CC "^.*-[Bb][Yy]: *" | ||
| 90 | fi | ||
| 91 | |||
| 92 | if [ -z "$TO" ] && [ -z "$CC" ]; then | ||
| 93 | echo "ERROR: you have not specified any recipients." | ||
| 94 | usage | ||
| 95 | exit 1 | ||
| 96 | fi | ||
| 97 | |||
| 98 | |||
| 99 | # Generate report for the user and require confirmation before sending | ||
| 100 | cat <<EOM | ||
| 101 | The following patches: | ||
| 102 | $(for PATCH in $PDIR/*.patch; do echo " $PATCH"; done) | ||
| 103 | |||
| 104 | will be sent to the following recipients: | ||
| 105 | To: $TO | ||
| 106 | CC: $CC | ||
| 107 | |||
| 108 | EOM | ||
| 109 | echo "Continue? [y/N] " | ||
| 110 | read cont | ||
| 111 | |||
| 112 | if [ "$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 | ||
| 130 | else | ||
| 131 | echo "Send aborted." | ||
| 132 | fi | ||
| 133 | |||
