#!/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'
  if [ $(git log --oneline v$OLD.. | wc -l) = 0 ]; then
    echo "    - exact copy of $OLD"
  else
    git log --oneline --reverse --format="    - %s" v$OLD..
  fi
  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"

remote=$(git config --get branch.master.remote)
echo "Do not forget to push updates, publish and announce this version :"
echo
echo "git push ${remote:-origin} master v$NEW"
echo "${0%/*}/publish-release"
echo "${0%/*}/announce-release"
