#!/usr/bin/sh
#
# Script to simplify adding new patch file.

PATCHNAME=
SPECFILE="$(basename -- "$(pwd)".spec)"
CHANGELOG_COMMENT=
BACKUP=
PKGTOOL=
BUMPPARAMS=
PATCHLEVEL=1
GITADD=0
PATCHPAD=" "

usage()
{
	cat << HELP
${0}: [-p strip] [-c comment] [-b suffix] [-s specfile] [-g] <patch...>
	-p strip     Use patch strip number for given patch file(s)
	-c comment   Use comment in changelog
	-b suffix    Use provided suffix as backup of patch
	-g           Add modified files to git index
	-r           Add -r parameter to rpmdev-bumpspec
	-P pkgtool   Try prep with given tool
	-S padding   Use padding before patch
HELP
}

while getopts -- "c:p:b:grP:S:h" PARAM "$@"
do
	case "${PARAM}" in
		p) PATCHLEVEL="$OPTARG" ;;
		c) CHANGELOG_COMMENT="$OPTARG" ;;
		b) BACKUP=" -b $OPTARG" ;;
		s) SPECFILE="$OPTARG" ;;
		g) GITADD=1 ;;
		P) PKGTOOL="$OPTARG" ;; 
		S) PATCHPAD="$OPTARG" ;;
		r) BUMPPARAMS+="-$PARAM " ;;
		h) usage; exit 0;;
		\?) echo "Invalid option -$OPTARG" >&2 ;;
	esac
#	echo "-$PARAM-"
done

if ! [ -f "$SPECFILE" ]
then
	echo "Specfile $SPECFILE not found" >&2
	exit 1
fi

MAXPATCH=$(spectool -l -P "$SPECFILE" | cut -d: -f1 | cut -c6- | sort -n | tail -1)

set -e

shift $(( OPTIND-1 ))
for PATCHNAME in "$@"
do
	PATCHNAME="$1"
	shift

	if [ ! -f "$PATCHNAME" ]
	then
		echo "Patch file $PATCHNAME not found!" >&2
		exit 1
	fi

	NEWPATCH_NUMBER=$((MAXPATCH+1))

	if spectool -l -P "$SPECFILE" | cut -d: -f2- | grep '^\s*'"$PATCHNAME"'\s*$' > /dev/null
	then
		echo "Patch file $PATCHNAME is already present." >&2
		exit 1
	fi

	sed -i -f - "$SPECFILE" <<SED
/^[Pp]atch${MAXPATCH}:/ a \
Patch${NEWPATCH_NUMBER}:${PATCHPAD}${PATCHNAME}
/^%[Pp]atch${MAXPATCH}\s/ a \
%patch${NEWPATCH_NUMBER} -p${PATCHLEVEL}${BACKUP}
/^%[Pp]atch ${MAXPATCH}\s/ a \
%patch -P ${NEWPATCH_NUMBER} -p${PATCHLEVEL}${BACKUP}
/^%[Pp]atch -P ${MAXPATCH}\s/ a \
%patch -P ${NEWPATCH_NUMBER} -p${PATCHLEVEL}${BACKUP}
/^%[Pp]atch${MAXPATCH}$/ a \
%patch${NEWPATCH_NUMBER} -p${PATCHLEVEL}${BACKUP}
SED

	[ "$GITADD" = '1' ] && git add "$PATCHNAME"

	MAXPATCH=$NEWPATCH_NUMBER
done

if [ -z "$PATCHNAME" ]
then
	echo "No patch argument given." >&2
	exit 1
fi

if [ -n "$CHANGELOG_COMMENT" ]; then
  rpmdev-bumpspec $BUMPPARAMS -c "$CHANGELOG_COMMENT" -- "$SPECFILE"
fi

[ "$GITADD" = '1' ] && git add "$SPECFILE"

[ -n "$PKGTOOL" ] && "$PKGTOOL" prep
