xref: /OK3568_Linux_fs/yocto/poky/scripts/send-pull-request (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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