1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Copyright (c) 2010-2011, Intel Corporation. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-or-later 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun# 9*4882a593Smuzhiyun# This script is intended to be used to send a patch series prepared by the 10*4882a593Smuzhiyun# create-pull-request script to Open Embedded and The Yocto Project, as well 11*4882a593Smuzhiyun# as to related projects and layers. 12*4882a593Smuzhiyun# 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunAUTO=0 15*4882a593SmuzhiyunAUTO_CL=0 16*4882a593SmuzhiyunGITSOBCC="--suppress-cc=all" 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun# Prevent environment leakage to these vars. 19*4882a593Smuzhiyununset TO 20*4882a593Smuzhiyununset CC 21*4882a593Smuzhiyununset AUTO_CC 22*4882a593Smuzhiyununset EXTRA_CC 23*4882a593Smuzhiyun 24*4882a593Smuzhiyunusage() 25*4882a593Smuzhiyun{ 26*4882a593Smuzhiyuncat <<EOM 27*4882a593SmuzhiyunUsage: $(basename $0) [-h] [-a] [-c] [[-t email]...] -p pull-dir 28*4882a593Smuzhiyun -a Send the cover letter to every recipient listed in Cc and 29*4882a593Smuzhiyun Signed-off-by lines found in the cover letter and the patches. 30*4882a593Smuzhiyun This option implies -c. 31*4882a593Smuzhiyun -c Expand the Cc list for the individual patches using the Cc and 32*4882a593Smuzhiyun Signed-off-by lines from the same patch. 33*4882a593Smuzhiyun -C Add extra CC to each email sent. 34*4882a593Smuzhiyun -p pull-dir Directory containing summary and patch files 35*4882a593Smuzhiyun -t email Explicitly add email to the recipients 36*4882a593SmuzhiyunEOM 37*4882a593Smuzhiyun} 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun# Collect addresses from a patch into AUTO_CC 40*4882a593Smuzhiyun# $1: a patch file 41*4882a593Smuzhiyunharvest_recipients() 42*4882a593Smuzhiyun{ 43*4882a593Smuzhiyun PATCH=$1 44*4882a593Smuzhiyun export IFS=$',\n' 45*4882a593Smuzhiyun for REGX in "^[Cc][Cc]: *" "^[Ss]igned-[Oo]ff-[Bb]y: *"; do 46*4882a593Smuzhiyun for EMAIL in $(sed '/^---$/q' $PATCH | grep -e "$REGX" | sed "s/$REGX//"); do 47*4882a593Smuzhiyun if [ "${AUTO_CC/$EMAIL/}" == "$AUTO_CC" ] && [ -n "$EMAIL" ]; then 48*4882a593Smuzhiyun if [ -z "$AUTO_CC" ]; then 49*4882a593Smuzhiyun AUTO_CC=$EMAIL; 50*4882a593Smuzhiyun else 51*4882a593Smuzhiyun AUTO_CC="$AUTO_CC,$EMAIL"; 52*4882a593Smuzhiyun fi 53*4882a593Smuzhiyun fi 54*4882a593Smuzhiyun done 55*4882a593Smuzhiyun done 56*4882a593Smuzhiyun unset IFS 57*4882a593Smuzhiyun} 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun# Parse and verify arguments 60*4882a593Smuzhiyunwhile getopts "acC:hp:t:" OPT; do 61*4882a593Smuzhiyun case $OPT in 62*4882a593Smuzhiyun a) 63*4882a593Smuzhiyun AUTO=1 64*4882a593Smuzhiyun GITSOBCC="--signed-off-by-cc" 65*4882a593Smuzhiyun AUTO_CL=1 66*4882a593Smuzhiyun ;; 67*4882a593Smuzhiyun c) 68*4882a593Smuzhiyun AUTO=1 69*4882a593Smuzhiyun GITSOBCC="--signed-off-by-cc" 70*4882a593Smuzhiyun ;; 71*4882a593Smuzhiyun C) 72*4882a593Smuzhiyun EXTRA_CC="$OPTARG" 73*4882a593Smuzhiyun ;; 74*4882a593Smuzhiyun h) 75*4882a593Smuzhiyun usage 76*4882a593Smuzhiyun exit 0 77*4882a593Smuzhiyun ;; 78*4882a593Smuzhiyun p) 79*4882a593Smuzhiyun PDIR=${OPTARG%/} 80*4882a593Smuzhiyun if [ ! -d $PDIR ]; then 81*4882a593Smuzhiyun echo "ERROR: pull-dir \"$PDIR\" does not exist." 82*4882a593Smuzhiyun usage 83*4882a593Smuzhiyun exit 1 84*4882a593Smuzhiyun fi 85*4882a593Smuzhiyun ;; 86*4882a593Smuzhiyun t) 87*4882a593Smuzhiyun if [ -n "$TO" ]; then 88*4882a593Smuzhiyun TO="$TO,$OPTARG" 89*4882a593Smuzhiyun else 90*4882a593Smuzhiyun TO="$OPTARG" 91*4882a593Smuzhiyun fi 92*4882a593Smuzhiyun ;; 93*4882a593Smuzhiyun esac 94*4882a593Smuzhiyundone 95*4882a593Smuzhiyun 96*4882a593Smuzhiyunif [ -z "$PDIR" ]; then 97*4882a593Smuzhiyun echo "ERROR: you must specify a pull-dir." 98*4882a593Smuzhiyun usage 99*4882a593Smuzhiyun exit 1 100*4882a593Smuzhiyunfi 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun# Verify the cover letter is complete and free of tokens 104*4882a593Smuzhiyunif [ -e $PDIR/0000-cover-letter.patch ]; then 105*4882a593Smuzhiyun CL="$PDIR/0000-cover-letter.patch" 106*4882a593Smuzhiyun for TOKEN in SUBJECT BLURB; do 107*4882a593Smuzhiyun grep -q "*** $TOKEN HERE ***" "$CL" 108*4882a593Smuzhiyun if [ $? -eq 0 ]; then 109*4882a593Smuzhiyun echo "ERROR: Please edit $CL and try again (Look for '*** $TOKEN HERE ***')." 110*4882a593Smuzhiyun exit 1 111*4882a593Smuzhiyun fi 112*4882a593Smuzhiyun done 113*4882a593Smuzhiyunelse 114*4882a593Smuzhiyun echo "WARNING: No cover letter will be sent." 115*4882a593Smuzhiyunfi 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun# Harvest emails from the generated patches and populate AUTO_CC. 118*4882a593Smuzhiyunif [ $AUTO_CL -eq 1 ]; then 119*4882a593Smuzhiyun for PATCH in $PDIR/*.patch; do 120*4882a593Smuzhiyun harvest_recipients $PATCH 121*4882a593Smuzhiyun done 122*4882a593Smuzhiyunfi 123*4882a593Smuzhiyun 124*4882a593SmuzhiyunAUTO_TO="$(git config sendemail.to)" 125*4882a593Smuzhiyunif [ -n "$AUTO_TO" ]; then 126*4882a593Smuzhiyun if [ -n "$TO" ]; then 127*4882a593Smuzhiyun TO="$TO,$AUTO_TO" 128*4882a593Smuzhiyun else 129*4882a593Smuzhiyun TO="$AUTO_TO" 130*4882a593Smuzhiyun fi 131*4882a593Smuzhiyunfi 132*4882a593Smuzhiyun 133*4882a593Smuzhiyunif [ -z "$TO" ] && [ -z "$AUTO_CC" ]; then 134*4882a593Smuzhiyun echo "ERROR: you have not specified any recipients." 135*4882a593Smuzhiyun usage 136*4882a593Smuzhiyun exit 1 137*4882a593Smuzhiyunfi 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun# Convert the collected addresses into git-send-email argument strings 141*4882a593Smuzhiyunexport IFS=$',' 142*4882a593SmuzhiyunGIT_TO=$(for R in $TO; do echo -n "--to='$R' "; done) 143*4882a593SmuzhiyunGIT_CC=$(for R in $AUTO_CC; do echo -n "--cc='$R' "; done) 144*4882a593SmuzhiyunGIT_EXTRA_CC=$(for R in $EXTRA_CC; do echo -n "--cc='$R' "; done) 145*4882a593Smuzhiyununset IFS 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun# Handoff to git-send-email. It will perform the send confirmation. 148*4882a593Smuzhiyun# Mail threading was already handled by git-format-patch in 149*4882a593Smuzhiyun# create-pull-request, so we must not allow git-send-email to 150*4882a593Smuzhiyun# add In-Reply-To and References headers again. 151*4882a593SmuzhiyunPATCHES=$(echo $PDIR/*.patch) 152*4882a593Smuzhiyunif [ $AUTO_CL -eq 1 ]; then 153*4882a593Smuzhiyun # Send the cover letter to every recipient, both specified as well as 154*4882a593Smuzhiyun # harvested. Then remove it from the patches list. 155*4882a593Smuzhiyun # --no-thread is redundant here (only sending a single message) and 156*4882a593Smuzhiyun # merely added for the sake of consistency. 157*4882a593Smuzhiyun eval "git send-email $GIT_TO $GIT_CC $GIT_EXTRA_CC --confirm=always --no-thread --suppress-cc=all $CL" 158*4882a593Smuzhiyun if [ $? -eq 1 ]; then 159*4882a593Smuzhiyun echo "ERROR: failed to send cover-letter with automatic recipients." 160*4882a593Smuzhiyun exit 1 161*4882a593Smuzhiyun fi 162*4882a593Smuzhiyun PATCHES=${PATCHES/"$CL"/} 163*4882a593Smuzhiyunfi 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun# Send the patch to the specified recipients and, if -c was specified, those git 166*4882a593Smuzhiyun# finds in this specific patch. 167*4882a593Smuzhiyuneval "git send-email $GIT_TO $GIT_EXTRA_CC --confirm=always --no-thread $GITSOBCC $PATCHES" 168*4882a593Smuzhiyunif [ $? -eq 1 ]; then 169*4882a593Smuzhiyun echo "ERROR: failed to send patches." 170*4882a593Smuzhiyun exit 1 171*4882a593Smuzhiyunfi 172