blob: 280880b3f70de901b30467e9f1664661977d1c85 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001#!/bin/sh
2#
3# Copyright (c) 2010-2013, Intel Corporation.
4# All Rights Reserved
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
14# the GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19#
20
21#
22# This script is intended to be used to prepare a series of patches
23# and a cover letter in an appropriate and consistent format for
24# submission to Open Embedded and The Yocto Project, as well as to
25# related projects and layers.
26#
27
28ODIR=pull-$$
29RELATIVE_TO="master"
30COMMIT_ID="HEAD"
31PREFIX="PATCH"
32RFC=0
33
34usage() {
35CMD=$(basename $0)
36cat <<EOM
Brad Bishopd7bf8c12018-02-25 22:55:05 -050037Usage: $CMD [-h] [-o output_dir] [-m msg_body_file] [-s subject] [-r relative_to] [-i commit_id] [-d relative_dir] -u remote [-b branch] [-- <format-patch options>]
Patrick Williamsc124f4f2015-09-15 14:41:29 -050038 -b branch Branch name in the specified remote (default: current branch)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050039 -l local branch Local branch name (default: HEAD)
Patrick Williamsc124f4f2015-09-15 14:41:29 -050040 -c Create an RFC (Request for Comment) patch series
41 -h Display this help message
Patrick Williamsc0f7c042017-02-23 20:41:17 -060042 -a Automatically push local branch (-l) to remote branch (-b),
43 or set CPR_CONTRIB_AUTO_PUSH in env
Patrick Williamsc124f4f2015-09-15 14:41:29 -050044 -i commit_id Ending commit (default: HEAD)
45 -m msg_body_file The file containing a blurb to be inserted into the summary email
46 -o output_dir Specify the output directory for the messages (default: pull-PID)
47 -p prefix Use [prefix N/M] instead of [PATCH N/M] as the subject prefix
48 -r relative_to Starting commit (default: master)
49 -s subject The subject to be inserted into the summary email
Patrick Williamsc0f7c042017-02-23 20:41:17 -060050 -u remote The git remote where the branch is located, or set CPR_CONTRIB_REMOTE in env
Patrick Williamsc124f4f2015-09-15 14:41:29 -050051 -d relative_dir Generate patches relative to directory
52
53 Examples:
54 $CMD -u contrib -b nitin/basic
55 $CMD -u contrib -r distro/master -i nitin/distro -b nitin/distro
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050056 $CMD -u contrib -r distro/master -i nitin/distro -b nitin/distro -l distro
Patrick Williamsc124f4f2015-09-15 14:41:29 -050057 $CMD -u contrib -r master -i misc -b nitin/misc -o pull-misc
58 $CMD -u contrib -p "RFC PATCH" -b nitin/experimental
59 $CMD -u contrib -i misc -b nitin/misc -d ./bitbake
Brad Bishopd7bf8c12018-02-25 22:55:05 -050060 $CMD -u contrib -r origin/master -o /tmp/out.v3 -- -v3 --in-reply-to=20170511120134.XX7799@site.com
Patrick Williamsc124f4f2015-09-15 14:41:29 -050061EOM
62}
63
Patrick Williamsc0f7c042017-02-23 20:41:17 -060064REMOTE="$CPR_CONTRIB_REMOTE"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050065# Parse and validate arguments
Patrick Williamsc0f7c042017-02-23 20:41:17 -060066while getopts "b:acd:hi:m:o:p:r:s:u:l:" OPT; do
Patrick Williamsc124f4f2015-09-15 14:41:29 -050067 case $OPT in
68 b)
69 BRANCH="$OPTARG"
70 ;;
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050071 l)
72 L_BRANCH="$OPTARG"
73 ;;
Patrick Williamsc124f4f2015-09-15 14:41:29 -050074 c)
75 RFC=1
76 ;;
77 d)
78 RELDIR="$OPTARG"
79 ;;
80 h)
81 usage
82 exit 0
83 ;;
84 i)
85 COMMIT_ID="$OPTARG"
86 ;;
87 m)
88 BODY="$OPTARG"
89 if [ ! -e "$BODY" ]; then
90 echo "ERROR: Body file does not exist"
91 exit 1
92 fi
93 ;;
94 o)
95 ODIR="$OPTARG"
96 ;;
97 p)
98 PREFIX="$OPTARG"
99 ;;
100 r)
101 RELATIVE_TO="$OPTARG"
102 ;;
103 s)
104 SUBJECT="$OPTARG"
105 ;;
106 u)
107 REMOTE="$OPTARG"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600108 ;;
109 a)
110 CPR_CONTRIB_AUTO_PUSH="1"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500111 ;;
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500112 --)
113 shift
114 break
115 ;;
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500116 esac
117done
118
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500119shift "$((OPTIND - 1))"
120extraopts="$@"
121
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600122if [ -z "$REMOTE" ]; then
123 echo "ERROR: Missing parameter -u or CPR_CONTRIB_REMOTE in env, no git remote!"
124 usage
125 exit 1
126fi
127
128REMOTE_URL=$(git config remote.$REMOTE.url)
129if [ $? -ne 0 ]; then
130 echo "ERROR: git config failed to find a url for '$REMOTE'"
131 echo
132 echo "To add a remote url for $REMOTE, use:"
133 echo " git config remote.$REMOTE.url <url>"
134 exit 1
135fi
136
137# Rewrite private URLs to public URLs
138# Determine the repository name for use in the WEB_URL later
139case "$REMOTE_URL" in
140*@*)
141 USER_RE="[A-Za-z0-9_.@][A-Za-z0-9_.@-]*\$\?"
142 PROTO_RE="[a-z][a-z+]*://"
143 GIT_RE="\(^\($PROTO_RE\)\?$USER_RE@\)\([^:/]*\)[:/]\(.*\)"
144 REMOTE_URL=${REMOTE_URL%.git}
145 REMOTE_REPO=$(echo $REMOTE_URL | sed "s#$GIT_RE#\4#")
146 REMOTE_URL=$(echo $REMOTE_URL | sed "s#$GIT_RE#git://\3/\4#")
147 ;;
148*)
149 echo "WARNING: Unrecognized remote URL: $REMOTE_URL"
150 echo " The pull and browse URLs will likely be incorrect"
151 ;;
152esac
153
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500154if [ -z "$BRANCH" ]; then
155 BRANCH=$(git branch | grep -e "^\* " | cut -d' ' -f2)
156 echo "NOTE: Assuming remote branch '$BRANCH', use -b to override."
157fi
158
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500159if [ -z "$L_BRANCH" ]; then
160 L_BRANCH=HEAD
161 echo "NOTE: Assuming local branch HEAD, use -l to override."
162fi
163
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500164if [ $RFC -eq 1 ]; then
165 PREFIX="RFC $PREFIX"
166fi
167
168
169# Set WEB_URL from known remotes
170WEB_URL=""
171case "$REMOTE_URL" in
172 *git.yoctoproject.org*)
173 WEB_URL="http://git.yoctoproject.org/cgit.cgi/$REMOTE_REPO/log/?h=$BRANCH"
174 ;;
175 *git.pokylinux.org*)
176 WEB_URL="http://git.pokylinux.org/cgit.cgi/$REMOTE_REPO/log/?h=$BRANCH"
177 ;;
178 *git.openembedded.org*)
Brad Bishop6e60e8b2018-02-01 10:27:11 -0500179 WEB_URL="http://cgit.openembedded.org/$REMOTE_REPO/log/?h=$BRANCH"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500180 ;;
181 *github.com*)
182 WEB_URL="https://github.com/$REMOTE_REPO/tree/$BRANCH"
183 ;;
184esac
185
186# Perform a sanity test on the web URL. Issue a warning if it is not
187# accessible, but do not abort as users may want to run offline.
188if [ -n "$WEB_URL" ]; then
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600189 if [ "$CPR_CONTRIB_AUTO_PUSH" = "1" ]; then
190 echo "Pushing '$BRANCH' on '$REMOTE' as requested..."
191 git push $REMOTE $L_BRANCH:$BRANCH
192 echo ""
193 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500194 wget --no-check-certificate -q $WEB_URL -O /dev/null
195 if [ $? -ne 0 ]; then
196 echo "WARNING: Branch '$BRANCH' was not found on the contrib git tree."
197 echo " Please check your remote and branch parameter before sending."
198 echo ""
199 fi
200fi
201
202if [ -e $ODIR ]; then
203 echo "ERROR: output directory $ODIR exists."
204 exit 1
205fi
206mkdir $ODIR
207
208if [ -n "$RELDIR" ]; then
209 ODIR=$(realpath $ODIR)
210 pdir=$(pwd)
211 cd $RELDIR
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500212 extraopts="$extraopts --relative"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500213fi
214
215# Generate the patches and cover letter
216git format-patch $extraopts -M40 --subject-prefix="$PREFIX" -n -o $ODIR --thread=shallow --cover-letter $RELATIVE_TO..$COMMIT_ID > /dev/null
217
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500218if [ -z "$(ls -A $ODIR 2> /dev/null)" ]; then
219 echo "ERROR: $ODIR is empty, no cover letter and patches was generated!"
220 echo " This is most likely due to that \$RRELATIVE_TO..\$COMMIT_ID"
221 echo " ($RELATIVE_TO..$COMMIT_ID) don't contain any differences."
222 rmdir $ODIR
223 exit 1
224fi
225
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500226[ -n "$RELDIR" ] && cd $pdir
227
228# Customize the cover letter
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500229CL="$(echo $ODIR/*0000-cover-letter.patch)"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500230PM="$ODIR/pull-msg"
231GIT_VERSION=$(`git --version` | tr -d '[:alpha:][:space:].' | sed 's/\(...\).*/\1/')
232NEWER_GIT_VERSION=210
233if [ $GIT_VERSION -lt $NEWER_GIT_VERSION ]; then
234 git request-pull $RELATIVE_TO $REMOTE_URL $COMMIT_ID >> "$PM"
235else
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500236 git request-pull $RELATIVE_TO $REMOTE_URL $L_BRANCH:$BRANCH >> "$PM"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500237fi
238if [ $? -ne 0 ]; then
239 echo "ERROR: git request-pull reported an error"
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600240 rm -rf $ODIR
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500241 exit 1
242fi
243
244# The cover letter already has a diffstat, remove it from the pull-msg
245# before inserting it.
246sed -n "0,\#$REMOTE_URL# p" "$PM" | sed -i "/BLURB HERE/ r /dev/stdin" "$CL"
247rm "$PM"
248
249# If this is an RFC, make that clear in the cover letter
250if [ $RFC -eq 1 ]; then
251(cat <<EOM
252Please review the following changes for suitability for inclusion. If you have
253any objections or suggestions for improvement, please respond to the patches. If
254you agree with the changes, please provide your Acked-by.
255
256EOM
257) | sed -i "/BLURB HERE/ r /dev/stdin" "$CL"
258fi
259
260# Insert the WEB_URL if there is one
261if [ -n "$WEB_URL" ]; then
262 echo " $WEB_URL" | sed -i "\#$REMOTE_URL# r /dev/stdin" "$CL"
263fi
264
265
266# If the user specified a message body, insert it into the cover letter and
267# remove the BLURB token.
268if [ -n "$BODY" ]; then
269 sed -i "/BLURB HERE/ r $BODY" "$CL"
270 sed -i "/BLURB HERE/ d" "$CL"
271fi
272
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600273# Set subject automatically if there is only one patch
274patch_cnt=`git log --pretty=oneline ${RELATIVE_TO}..${L_BRANCH} | wc -l`
275if [ -z "$SUBJECT" -a $patch_cnt -eq 1 ]; then
276 SUBJECT="`git log --format=%s ${RELATIVE_TO}..${L_BRANCH}`"
277fi
278
279# Replace the SUBJECT token with it.
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500280if [ -n "$SUBJECT" ]; then
281 sed -i -e "s/\*\*\* SUBJECT HERE \*\*\*/$SUBJECT/" "$CL"
282fi
283
284
285# Generate report for user
286cat <<EOM
287The following patches have been prepared:
288$(for PATCH in $(ls $ODIR/*); do echo " $PATCH"; done)
289
290Review their content, especially the summary mail:
291 $CL
292
293When you are satisfied, you can send them with:
294 send-pull-request -a -p $ODIR
295EOM
296
297# Check the patches for trailing white space
298egrep -q -e "^\+.*\s+$" $ODIR/*
299if [ $? -ne 1 ]; then
300 echo
301 echo "WARNING: Trailing white space detected at these locations"
302 egrep -nH --color -e "^\+.*\s+$" $ODIR/*
303fi