#!/usr/bin/env bash
#
# Automate generation of a new release

set -e

KUP=0
COMMIT=1
LAST_HEAD=""
FOR_NEXT=0

help() {
	echo "$(basename $0) - prepare xfsprogs release tarball or for-next update"
	printf "\t[--kup|-k] upload final tarball with KUP\n"
	printf "\t[--no-commit|-n] don't create release commit\n"
	printf "\t[--last-head|-l] commit of the last release\n"
	printf "\t[--for-next|-f] generate announce email for for-next update\n"
}

update_version() {
	echo "Updating version files"
	# doc/CHANGES
	header="xfsprogs-${version} ($(date +'%d %b %Y'))"
	sed -i "1s/^/$header\n\t<TODO list user affecting changes>\n\n/" doc/CHANGES
	$EDITOR doc/CHANGES

	# ./configure.ac
	CONF_AC="AC_INIT([xfsprogs],[${version}],[linux-xfs@vger.kernel.org])"
	sed -i "s/^AC_INIT.*/$CONF_AC/" ./configure.ac

	# ./debian/changelog
	sed -i "1s/^/\n/" ./debian/changelog
	sed -i "1s/^/ -- Nathan Scott <nathans@debian.org>  `date -R`\n/" ./debian/changelog
	sed -i "1s/^/\n/" ./debian/changelog
	sed -i "1s/^/  * New upstream release\n/" ./debian/changelog
	sed -i "1s/^/\n/" ./debian/changelog
	sed -i "1s/^/xfsprogs (${version}-1) unstable; urgency=low\n/" ./debian/changelog
}

prepare_mail() {
	branch="$1"
	mail_file=$(mktemp)
	if [ -n "$LAST_HEAD" ]; then
		if [ $branch == "master" ]; then
			reason="$(git describe --abbrev=0 $branch) released"
			for_next_update="\n\nThe for-next branch has also been updated to match the state of master."
		else
			reason="for-next updated to $(git log --oneline --format="%h" -1 $branch)"
			for_next_update=""
		fi;
		cat << EOF > $mail_file
To: linux-xfs@vger.kernel.org
Cc: $(./tools/git-contributors.py $LAST_HEAD..$branch --separator ', ')
Subject: [ANNOUNCE] xfsprogs: $reason

Hi folks,

The xfsprogs $branch branch in repository at:

	git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git

has just been updated.

Patches often get missed, so if your outstanding patches are properly reviewed
on the list and not included in this update, please let me know.$(printf "%b" "$for_next_update")

The new head of the $branch branch is commit:

$(git log --oneline --format="%H" -1 $branch)

New commits:

$(git shortlog --format="[%h] %s" $LAST_HEAD..$branch)

Code Diffstat:

$(git diff --stat --summary -C -M $LAST_HEAD..$branch)
EOF
	fi
}

while [ $# -gt 0 ]; do
	case "$1" in
		--kup|-k)
			KUP=1
			;;
		--no-commit|-n)
			COMMIT=0
			;;
		--last-head|-l)
			LAST_HEAD=$2
			shift
			;;
		--for-next|-f)
			FOR_NEXT=1
			;;
		--help|-h)
			help
			exit 0
			;;
		*)
			>&2 printf "Error: Invalid argument\n"
			exit 1
			;;
		esac
	shift
done

if [ $FOR_NEXT -eq 1 ]; then
	echo "Push your for-next branch:"
	printf "\tgit push origin for-next:for-next\n"
	prepare_mail "for-next"
	if [ -n "$LAST_HEAD" ]; then
		echo "Command to send ANNOUNCE email"
		printf "\tneomutt -H $mail_file\n"
	fi
	exit 0
fi

if [ -z "$EDITOR" ]; then
	EDITOR=$(command -v vi)
fi

if [ $COMMIT -eq 1 ]; then
	if git diff --exit-code ./VERSION > /dev/null; then
		$EDITOR ./VERSION
	fi
fi

. ./VERSION

version=${PKG_MAJOR}.${PKG_MINOR}.${PKG_REVISION}
date=`date +"%-d %B %Y"`

if [ $COMMIT -eq 1 ]; then
	update_version

	git diff --color=always | less -r
	[[ "$(read -e -p 'All good? [Y/n]> '; echo $REPLY)" == [Nn]* ]] && exit 0

	echo "Commiting new version update to git"
	git commit --all --signoff --message="xfsprogs: Release v${version}

Update all the necessary files for a v${version} release."

	echo "Tagging git repository"
	git tag --annotate --sign --message="Release v${version}" v${version}
fi

echo "Cleaning up"
make realclean
rm -rf "xfsprogs-${version}.tar" \
	"xfsprogs-${version}.tar.gz" \
	"xfsprogs-${version}.tar.asc" \
	"xfsprogs-${version}.tar.sign"


echo "Making source tarball"
make dist
gunzip -k "xfsprogs-${version}.tar.gz"

echo "Sign the source tarball"
gpg \
	--detach-sign \
	--armor \
	"xfsprogs-${version}.tar"

echo "Verify signature"
gpg \
	--verify \
	"xfsprogs-${version}.tar.asc"
if [ $? -ne 0 ]; then
	echo "Can not verify signature of tarball"
	exit 1
fi

mv "xfsprogs-${version}.tar.asc" "xfsprogs-${version}.tar.sign"

if [ $KUP -eq 1 ]; then
	kup put \
		xfsprogs-${version}.tar.gz \
		xfsprogs-${version}.tar.sign \
		pub/linux/utils/fs/xfs/xfsprogs/
fi;

prepare_mail "master"

echo ""
echo "Done. Please remember to push out tags and the branch."
printf "\tgit push origin v${version} master:master master:for-next\n"
if [ -n "$LAST_HEAD" ]; then
	echo "Command to send ANNOUNCE email"
	printf "\tneomutt -H $mail_file\n"
fi
if [ $KUP -ne 1 ]; then
	echo "Don't forget to upload tarball:"
	echo -e "\tkup put xfsprogs-${version}.tar.gz" \
		"xfsprogs-${version}.tar.sign pub/linux/utils/fs/xfs/xfsprogs/"
fi
