#!/bin/bash
# creates a new haproxy release at the current commit
# Copyright (c) 2006-2016 Willy Tarreau <w@1wt.eu>
#
# In short :
#   - requires git
#   - works only from master branch
#   - finds old and new version by itself
#   - builds changelog
#   - updates dates and versions in files
#   - commits + tags + signs
#   - no upload!

USAGE="Usage: ${0##*/} [-i] [-y] [-t] [-b branch] [-d date] [-o oldver] [-n newver]"
INTERACTIVE=
TAGONLY=
SAYYES=
BRANCH=
DATE=
YEAR=
OLD=
NEW=

die() {
	[ "$#" -eq 0 ] || echo "$*" >&2
	exit 1
}

err() {
	echo "$*" >&2
}

quit() {
	[ "$#" -eq 0 ] || echo "$*"
	exit 0
}

do_commit() {
	(
		echo "[RELEASE] Released version $NEW"
		echo
		echo "Released version $NEW with the following main changes :"
		sed -ne '/^[ ]*-/,/^$/{p;b a};d;:a;/^$/q' CHANGELOG
	) | git commit -a -F -
}

do_tag() {
	git tag -u "$GIT_GPG_KEY" -s -m "HAProxy $NEW" v$NEW && echo "Tagged as v$NEW"
}

if [ -z "$GIT_COMMITTER_NAME" ]; then
	GIT_COMMITTER_NAME=$(git config --get user.name)
	[ -n "$GIT_COMMITTER_NAME" ] || die "GIT_COMMITTER_NAME not set"
fi

if [ -z "$GIT_COMMITTER_EMAIL" ]; then
	GIT_COMMITTER_EMAIL=$(git config --get user.email)
	[ -n "$GIT_COMMITTER_EMAIL" ] || die "GIT_COMMITTER_EMAIL not set"
fi

while [ -n "$1" -a -z "${1##-*}" ]; do
	case "$1" in
		-y)        SAYYES=1       ; shift   ;;
		-i)        INTERACTIVE=1  ; shift   ;;
		-t)        TAGONLY=1      ; shift   ;;
		-d)        DATE="$2"      ; shift 2 ;;
		-b)        BRANCH="$2"    ; shift 2 ;;
		-o)        OLD="$2"       ; shift 2 ;;
		-n)        NEW="$2"       ; shift 2 ;;
		-h|--help) quit "$USAGE" ;;
		*)         die  "$USAGE" ;;
	esac
done

if [ $# -gt 0 ]; then
	die "$USAGE"
fi

if [ -z "$GIT_GPG_KEY" ]; then
	die "GIT_GPG_KEY is not set, it must contain your GPG key ID."
fi

if ! git rev-parse --verify -q HEAD >/dev/null; then
	die "Failed to check git HEAD."
fi

# we want to go to the git top dir
cd $(git rev-parse --show-toplevel)

if [ "$(git rev-parse --verify -q HEAD)" != "$(git rev-parse --verify -q master)" ]; then
	die "git HEAD doesn't match master branch."
fi

if [ "$(git diff HEAD|wc -c)" != 0 ]; then
	err "You appear to have uncommitted local changes, please commit them first :"
	git status -s -uno >&2
	die
fi

if [ -z "$OLD" ]; then
	OLD="$(git describe --tags HEAD --abbrev=0)"
	OLD="${OLD#v}"
fi

if ! git rev-parse --verify -q "v$OLD" >/dev/null; then
	die "git tag v$OLD doesn't exist."
fi

if [ -z "$NEW" ]; then
	radix="$OLD"
	while [ -n "$radix" -a -z "${radix%%*[0-9]}" ]; do
		radix="${radix%[0-9]}"
	done

	number=${OLD#$radix}
	if [ -z "$number" -o "$radix" = "$OLD" ]; then
		die "Fatal: cannot determine new version, please specify it."
	fi
	NEW=${radix}$((number+1))
fi

if git show-ref --tags "v$NEW" >/dev/null; then
	die "git tag v$NEW already exists, please remove it first."
fi

# determine the product branch from the new release
if [ -z "$BRANCH" ]; then
	subvers=${NEW#[0-9]*.[0-9]*[-.]*[0-9].}
	[ "${subvers}" = "${NEW}" ] && subvers=""
	major=${NEW%.$subvers}
	branch_ext=${major#*[0-9].*[0-9]}
	BRANCH=${major%${branch_ext}}
fi


# determine the release date
if [ -z "$DATE" ]; then
	# Uncomment the line below to use the date of the last commit,
	# otherwise fall back to current date
	DATE="$(git log --pretty=fuller -1 v$NEW 2>/dev/null | sed -ne '/^CommitDate:/{s/\(^[^ ]*:\)\|\( [-+].*\)//gp;q}')"
	DATE="$(date +%Y/%m/%d -d "$DATE")"
else
	if [ "$DATE" != "$(date +%Y/%m/%d -d "$DATE")" ]; then
		die "Date format must exclusively be YYYY/MM/DD ; date was '$DATE'."
	fi
fi
YEAR="${DATE%%/*}"

if [ -n "$TAGONLY" ]; then
	do_tag || die "Failed to tag changes"
	echo "Done. You may have to push changes."
	exit 0
fi

echo "About to release version $NEW from $OLD at $DATE (branch $BRANCH)."
if [ -z "$SAYYES" ]; then
	echo "Press ENTER to continue or Ctrl-C to abort now!"
	read
fi

echo "Updating CHANGELOG ..."
( echo "ChangeLog :"
  echo "==========="
  echo
  echo "$DATE : $NEW"
  #git shortlog v$OLD.. | sed -ne 's/^      /    - /p'
  git log --oneline --reverse --format="    - %s" v$OLD..
  echo
  tail -n +4 CHANGELOG
) >.chglog.tmp && mv .chglog.tmp CHANGELOG

echo "Updating VERSION ..."
rm -f VERSION VERDATE
echo "$NEW" > VERSION

echo "Updating VERDATE ..."
echo '$Format:%ci$' > VERDATE
echo "$DATE" >> VERDATE

# updating branch and date in all modified doc files except the outdated architecture.txt
for file in doc/intro.txt doc/configuration.txt doc/management.txt $(git diff --name-only v${OLD}.. -- doc); do
	if [ ! -e "$file" ]; then continue; fi
	if [ "$file" = doc/architecture.txt ]; then continue; fi
	echo "Updating $file ..."
	sed -e "1,10s:\(\sversion\s\).*:\1$BRANCH:" \
	    -e "1,10s:\(\s\)\(20[0-9]\{2\}/[0-9]\{1,2\}/[0-9]\{1,2\}\):\1$DATE:" \
	    -i "$file"
done

echo "Updating haproxy.c ..."
sed -e "s:Copyright 2000-[0-9]*\s*Willy Tarreau.*>:Copyright 2000-$YEAR Willy Tarreau <willy@haproxy.org>:" \
    -i src/haproxy.c

echo "Updating version.h ..."
sed -e "s:^\(#define\s*PRODUCT_BRANCH\s*\)\"[^\"]*\":\1\"$BRANCH\":" \
    -i include/common/version.h

if [ -n "$INTERACTIVE" ]; then
	vi CHANGELOG VERSION VERDATE \
	   src/haproxy.c doc/configuration.txt \
	   $(git diff --name-only v${OLD}.. -- doc)
fi

if [ "$(git diff -- CHANGELOG | wc -c)" = 0 ]; then
	die "CHANGELOG must be updated."
fi

if [ -z "$SAYYES" ]; then
	echo "Press ENTER to review the changes..."
	read
fi

git diff

echo
echo "About to commit and tag version $NEW with the following message:"
echo
echo "[RELEASE] Released version $NEW with the following main changes :"
sed -ne '/^[ ]*-/,/^$/{p;b a};d;:a;/^$/q' CHANGELOG

echo
echo "LAST chance to cancel! Press ENTER to proceed now or Ctrl-C to abort."
read

do_commit || die "Failed to commit changes"
do_tag    || die "Failed to tag changes"

echo "Do not forget to push updates, publish and announce this version :"
echo
echo "git push origin master v$NEW"
echo "${0%/*}/publish-release"
echo "${0%/*}/announce-release"
