#!/bin/sh
#
# Copyright (c) 2010-2013,  Intel Corporation.
#
# SPDX-License-Identifier: GPL-2.0-or-later
#

#
# This script is intended to be used to prepare a series of patches
# and a cover letter in an appropriate and consistent format for
# submission to Open Embedded and The Yocto Project, as well as to
# related projects and layers.
#

ODIR=pull-$$
RELATIVE_TO="master"
COMMIT_ID="HEAD"
PREFIX="PATCH"
RFC=0

usage() {
CMD=$(basename $0)
cat <<EOM
Usage: $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>]
  -b branch           Branch name in the specified remote (default: current branch)
  -l local branch     Local branch name (default: HEAD)
  -c                  Create an RFC (Request for Comment) patch series
  -h                  Display this help message
  -a                  Automatically push local branch (-l) to remote branch (-b),
                      or set CPR_CONTRIB_AUTO_PUSH in env
  -i commit_id        Ending commit (default: HEAD)
  -m msg_body_file    The file containing a blurb to be inserted into the summary email
  -o output_dir       Specify the output directory for the messages (default: pull-PID)
  -p prefix           Use [prefix N/M] instead of [PATCH N/M] as the subject prefix
  -r relative_to      Starting commit (default: master)
  -s subject          The subject to be inserted into the summary email
  -u remote           The git remote where the branch is located, or set CPR_CONTRIB_REMOTE in env
  -d relative_dir     Generate patches relative to directory

 Examples:
   $CMD -u contrib -b nitin/basic
   $CMD -u contrib -r distro/master -i nitin/distro -b nitin/distro
   $CMD -u contrib -r distro/master -i nitin/distro -b nitin/distro -l distro
   $CMD -u contrib -r master -i misc -b nitin/misc -o pull-misc
   $CMD -u contrib -p "RFC PATCH" -b nitin/experimental
   $CMD -u contrib -i misc -b nitin/misc -d ./bitbake
   $CMD -u contrib -r origin/master -o /tmp/out.v3 -- -v3 --in-reply-to=20170511120134.XX7799@site.com
EOM
}

REMOTE="$CPR_CONTRIB_REMOTE"
# Parse and validate arguments
while getopts "b:acd:hi:m:o:p:r:s:u:l:" OPT; do
	case $OPT in
	b)
		BRANCH="$OPTARG"
		;;
	l)
		L_BRANCH="$OPTARG"
		;;
	c)
		RFC=1
		;;
	d)
		RELDIR="$OPTARG"
		;;
	h)
		usage
		exit 0
		;;
	i)
		COMMIT_ID="$OPTARG"
		;;
	m)
		BODY="$OPTARG"
		if [ ! -e "$BODY" ]; then
			echo "ERROR: Body file does not exist"
			exit 1
		fi
		;;
	o)
		ODIR="$OPTARG"
		;;
	p)
		PREFIX="$OPTARG"
		;;
	r)
		RELATIVE_TO="$OPTARG"
		;;
	s)
		SUBJECT="$OPTARG"
		;;
	u)
		REMOTE="$OPTARG"
		;;
	a)
		CPR_CONTRIB_AUTO_PUSH="1"
		;;
	--)
		shift
		break
		;;
	esac
done

shift "$((OPTIND - 1))"
extraopts="$@"

if [ -z "$REMOTE" ]; then
	echo "ERROR: Missing parameter -u or CPR_CONTRIB_REMOTE in env, no git remote!"
	usage
	exit 1
fi

REMOTE_URL=$(git config remote.$REMOTE.url)
if [ $? -ne 0 ]; then
	echo "ERROR: git config failed to find a url for '$REMOTE'"
	echo
	echo "To add a remote url for $REMOTE, use:"
	echo "  git config remote.$REMOTE.url <url>"
	exit 1
fi

# Rewrite private URLs to public URLs
# Determine the repository name for use in the WEB_URL later
USER_RE="[A-Za-z0-9_.@][A-Za-z0-9_.@-]*\$\?"
PROTO_RE="[a-z][a-z+]*://"
GIT_RE="\(^\($PROTO_RE\)\?\)\($USER_RE@\)\?\([^:/]*\)[:/]\(.*\)"
REMOTE_URL=${REMOTE_URL%.git}
REMOTE_REPO=$(echo $REMOTE_URL | sed "s#$GIT_RE#\5#")
REMOTE_URL=$(echo $REMOTE_URL | sed "s#$GIT_RE#git://\4/\5#")

if [ -z "$BRANCH" ]; then
	BRANCH=$(git branch | grep -e "^\* " | cut -d' ' -f2)
	echo "NOTE: Assuming remote branch '$BRANCH', use -b to override."
fi

if [ -z "$L_BRANCH" ]; then
	L_BRANCH=HEAD
	echo "NOTE: Assuming local branch HEAD, use -l to override."
fi

if [ $RFC -eq 1 ]; then
	PREFIX="RFC $PREFIX"
fi


# Set WEB_URL from known remotes
WEB_URL=""
case "$REMOTE_URL" in
	*git.yoctoproject.org*)
		WEB_URL="http://git.yoctoproject.org/cgit.cgi/$REMOTE_REPO/log/?h=$BRANCH"
		;;
	*git.pokylinux.org*)
		WEB_URL="http://git.pokylinux.org/cgit.cgi/$REMOTE_REPO/log/?h=$BRANCH"
		;;
	*git.openembedded.org*)
		WEB_URL="http://cgit.openembedded.org/$REMOTE_REPO/log/?h=$BRANCH"
		;;
	*github.com*)
		WEB_URL="https://github.com/$REMOTE_REPO/tree/$BRANCH"
		;;
esac

# Perform a sanity test on the web URL. Issue a warning if it is not
# accessible, but do not abort as users may want to run offline.
if [ -n "$WEB_URL" ]; then
	if [ "$CPR_CONTRIB_AUTO_PUSH" = "1" ]; then
		echo "Pushing '$BRANCH' on '$REMOTE' as requested..."
		git push $REMOTE $L_BRANCH:$BRANCH
		echo ""
	fi
	wget --no-check-certificate -q $WEB_URL -O /dev/null
	if [ $? -ne 0 ]; then
		echo "WARNING: Branch '$BRANCH' was not found on the contrib git tree."
		echo "         Please check your remote and branch parameter before sending."
		echo ""
	fi
fi

if [ -e $ODIR ]; then
	echo "ERROR: output directory $ODIR exists."
	exit 1
fi
mkdir $ODIR

if [ -n "$RELDIR" ]; then
	ODIR=$(realpath $ODIR)
	pdir=$(pwd)
	cd $RELDIR
	extraopts="$extraopts --relative"
fi

# Generate the patches and cover letter
git format-patch $extraopts -M40 --subject-prefix="$PREFIX" -n -o $ODIR --thread=shallow --cover-letter $RELATIVE_TO..$COMMIT_ID > /dev/null

if [ -z "$(ls -A $ODIR 2> /dev/null)" ]; then
    echo "ERROR: $ODIR is empty, no cover letter and patches was generated!"
    echo "       This is most likely due to that \$RRELATIVE_TO..\$COMMIT_ID"
    echo "       ($RELATIVE_TO..$COMMIT_ID) don't contain any differences."
    rmdir $ODIR
    exit 1
fi

[ -n "$RELDIR" ] && cd $pdir

# Customize the cover letter
CL="$(echo $ODIR/*0000-cover-letter.patch)"
PM="$ODIR/pull-msg"
GIT_VERSION=$(`git --version` | tr -d '[:alpha:][:space:].' | sed 's/\(...\).*/\1/')
NEWER_GIT_VERSION=210
if [ $GIT_VERSION -lt $NEWER_GIT_VERSION ]; then
	git request-pull $RELATIVE_TO $REMOTE_URL $COMMIT_ID >> "$PM"
else
	git request-pull $RELATIVE_TO $REMOTE_URL $L_BRANCH:$BRANCH >> "$PM"
fi
if [ $? -ne 0 ]; then
	echo "ERROR: git request-pull reported an error"
	rm -rf $ODIR
	exit 1
fi

# The cover letter already has a diffstat, remove it from the pull-msg
# before inserting it.
sed -n "0,\#$REMOTE_URL# p" "$PM" | sed -i "/BLURB HERE/ r /dev/stdin" "$CL"
rm "$PM"

# If this is an RFC, make that clear in the cover letter
if [ $RFC -eq 1 ]; then
(cat <<EOM
Please review the following changes for suitability for inclusion. If you have
any objections or suggestions for improvement, please respond to the patches. If
you agree with the changes, please provide your Acked-by.

EOM
) | sed -i "/BLURB HERE/ r /dev/stdin" "$CL"
fi

# Insert the WEB_URL if there is one
if [ -n "$WEB_URL" ]; then
	echo "  $WEB_URL" | sed -i "\#$REMOTE_URL# r /dev/stdin" "$CL"
fi


# If the user specified a message body, insert it into the cover letter and
# remove the BLURB token.
if [ -n "$BODY" ]; then
	sed -i "/BLURB HERE/ r $BODY" "$CL"
	sed -i "/BLURB HERE/ d" "$CL"
fi

# Set subject automatically if there is only one patch
patch_cnt=`git log --pretty=oneline ${RELATIVE_TO}..${L_BRANCH} | wc -l`
if [ -z "$SUBJECT" -a $patch_cnt -eq 1 ]; then
    SUBJECT="`git log --format=%s ${RELATIVE_TO}..${L_BRANCH}`"
fi

# Replace the SUBJECT token with it.
if [ -n "$SUBJECT" ]; then
	sed -i -e "s\`\*\*\* SUBJECT HERE \*\*\*\`$SUBJECT\`" "$CL"
fi


# Generate report for user
cat <<EOM
The following patches have been prepared:
$(for PATCH in $(ls $ODIR/*); do echo "    $PATCH"; done)

Review their content, especially the summary mail:
    $CL

When you are satisfied, you can send them with:
    send-pull-request -a -p $ODIR
EOM

# Check the patches for trailing white space
egrep -q -e "^\+.*\s+$" $ODIR/*
if [ $? -ne 1 ]; then
	echo
	echo "WARNING: Trailing white space detected at these locations"
	egrep -nH --color -e "^\+.*\s+$" $ODIR/*
fi
