#!/usr/bin/env bash
# prepares a template e-mail and HTML file to announce a new release
# Copyright (c) 2006-2016 Willy Tarreau <w@1wt.eu>
#
# In short :
#   - requires git
#   - wants that last commit is a release/tag
#   - no restriction to master, uses last tag
#   - creates mail-$version.txt
#   - creates web-$version.html
#   - indicates how to edit the mail and how to send it

USAGE="Usage: ${0##*/} [-f] [-b branch] [-d date] [-o oldver] [-n newver]
  -f: force to overwrite existing files and ignore local changes
  -b: force the project branch name to this (def: inherited from the version)
  -d: force the release date (e.g. to rework a failed announce)
  -o: previous version (def: newver-1)
  -n: new version (if not last tag)
"
PREPARE=
FORCE=
OUTPUT=
BRANCH=
HTML=
DATE=
YEAR=
OLD=
LASTCOM=
NEWVER=
NEWTAG=
DIR=

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

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

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

while [ -n "$1" -a -z "${1##-*}" ]; do
	case "$1" in
		-d)        DATE="$2"      ; shift 2 ;;
		-b)        BRANCH="$2"    ; shift 2 ;;
		-f)        FORCE=1        ; shift   ;;
		-o)        OLD="$2"       ; shift 2 ;;
		-n)        NEWVER="$2"    ; shift 2 ;;
		-h|--help) quit "$USAGE" ;;
		*)         die  "$USAGE" ;;
	esac
done

if [ $# -gt 0 ]; then
	die "$USAGE"
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 root dir
DIR="$PWD"
cd $(git rev-parse --show-toplevel)

if [ -z "$FORCE" -a "$(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 [ "$(git rev-parse --verify -q HEAD)" != "$(git rev-parse --verify -q master)" ]; then
	die "git HEAD doesn't match master branch."
fi

if [ -n "$NEWVER" ]; then
	if git show-ref --tags "v$NEWVER" >/dev/null; then
		NEWTAG="v$NEWVER"
	else
		echo "Note: no matching tag v$NEWVER, using HEAD".
	fi
fi

# version unspecified or no existing tag for it
if [ -z "$NEWTAG" ]; then
	NEWTAG="$(git describe --tags HEAD --abbrev=0)"

	if [ -z "$NEWTAG" ]; then
		die "Fatal: cannot determine new version, please specify it."

	elif [ "$(git describe --tags HEAD)" != "$NEWTAG" ]; then
		die "About to use current HEAD which doesn't seem tagged, it reports '$(git describe --tags HEAD 2>/dev/null)'. Did you release it ?"
	fi
elif ! git show-ref --tags "$NEWTAG" >/dev/null 2>&1; then
	die "git tag $NEWTAG doesn't exist, did you create the release ?"
fi

if [ -z "$NEWVER" ]; then
	NEWVER="${NEWTAG#v}"
fi

if [ -z "$LASTCOM" ]; then
	LASTCOM="$(git rev-parse --short ${NEWTAG}^)"
fi

if [ -z "$OLD" ]; then
	OLD="$(git describe --tags ${LASTCOM} --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

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

# determine the release date
if [ -z "$DATE" ]; then
	DATE="$(git log -1 --pretty=fuller ${NEWTAG} 2>/dev/null | sed -ne '/^CommitDate:/{s/\(^[^ ]*:\)\|\( [-+].*\)//gp;q}')"
	DATE="$(date +%Y/%m/%d -d "$DATE")"
fi
YEAR="${DATE%%/*}"

OUTPUT="$DIR/mail-haproxy-$NEWVER.txt"
HTML="$DIR/web-haproxy-$NEWVER.html"

[ -z "$FORCE" ] || rm -f "${OUTPUT}" "${HTML}"

if [ -e "$OUTPUT" ]; then
	die "${OUTPUT##*/} already exists, please remove it or retry with -f."
fi

if [ -e "$HTML" ]; then
	die "$HTML already exists, please remove it or retry with -f."
fi

(
 echo "# Send this using:"
 echo "#   mutt -H <(tail -n +4 ${OUTPUT##*/}) -s \"[ANNOUNCE] haproxy-$NEWVER\" haproxy@formilux.org"
) >> "$OUTPUT"

(echo
 echo "Hi,"
 echo
 echo -n "HAProxy $NEWVER was released on $DATE. It added "
 echo -n $(git log --oneline --reverse --format="%s" "v$OLD".."$LASTCOM" | wc -l)
 echo " new commits"
 echo "after version $OLD."
 echo
 echo "- per tag :"
 git log --oneline --reverse --format="%s" "v$OLD".."$LASTCOM" | cut -f1 -d':' | sort | uniq -c
 echo
 echo "major commits :"
 git log --oneline --reverse --format="  - %s" "v$OLD".."$LASTCOM" | grep MAJOR
 echo
 echo "- per file :"
 git show "v$OLD".."$LASTCOM" -- src/ | grep ^diff | awk '{ print substr($3,7)}' | sort | uniq -c | sort -nr | head -15
 echo
 echo "- per topic :"
 git log --oneline --reverse --format="%s" "v$OLD".."$LASTCOM" | cut -f2 -d':' | awk '{sub("s$","",$1); print $1}' | sort | uniq -c
 echo
 echo "- sorted changelog :"
 git log --oneline --reverse --format="%s" "v$OLD".."$LASTCOM" | sort
 echo
 echo "#############################################################################################"
) >> "$OUTPUT"

# report the download paths
if [ -z "${NEWVER##*-dev*}" ]; then
	gitdir="haproxy.git"
else
	gitdir="haproxy-$BRANCH.git"
fi

(echo "Please find the usual URLs below :"
 echo "   Site index       : http://www.haproxy.org/"
 echo "   Discourse        : http://discourse.haproxy.org/"
 echo "   Slack channel    : https://slack.haproxy.org/"
 echo "   Issue tracker    : https://github.com/haproxy/haproxy/issues"
 echo "   Wiki             : https://github.com/haproxy/wiki/wiki"
 echo "   Sources          : http://www.haproxy.org/download/${BRANCH}/src/"
 echo "   Git repository   : http://git.haproxy.org/git/${gitdir}/"
 echo "   Git Web browsing : http://git.haproxy.org/?p=${gitdir}"
 echo "   Changelog        : http://www.haproxy.org/download/${BRANCH}/src/CHANGELOG"
 echo "   Cyril's HTML doc : http://cbonte.github.io/haproxy-dconv/"
) >> "$OUTPUT"

# sign
(echo
 echo "${GIT_COMMITTER_NAME% *}"
) >> "$OUTPUT"

(echo "---"
 echo "Complete changelog :"
 git shortlog "v$OLD".."$LASTCOM"
 echo "---"
) >> "$OUTPUT"


# prepare the HTML update
set -- $(date +%e -d "$DATE")
case "$1" in
	11|12|13) day="${1}th" ;;
	*1)       day="${1}st" ;;
	*2)       day="${2}nd" ;;
	*3)       day="${1}rd" ;;
	*)        day="${1}th" ;;
esac

humandate=$(date "+%B, $day, %Y" -d "$DATE")
(echo "$humandate</b> : <i>$NEWVER</i>"
 echo "         <p>"
 echo "           <ul>"
 echo "<--------------------------- edit contents below --------------------------->"
 echo "- per tag :"
 git log --oneline --reverse --format="%s" "v$OLD".."$LASTCOM" | cut -f1 -d':' | sort | uniq -c
 echo
 echo "- per topic :"
 git log --oneline --reverse --format="%s" "v$OLD".."$LASTCOM" | cut -f2 -d':' | awk '{sub("s$","",$1); print $1}' | sort | uniq -c
 echo
 echo "major commits :"
 git log --oneline --reverse --format="  - %s" "v$OLD".."$LASTCOM" | grep MAJOR
 echo
 echo "<--------------------------------------------------------------------------->"
 echo "             Code and changelog are available <a href=\"/download/${BRANCH}/src/\">here</a> as usual."
 echo "           </ul>"
 echo "         <p>"
 echo "           <b>"
) >> "$HTML"

echo "The announce was emitted into file $OUTPUT."
echo "You can edit it and send it this way :"
echo
echo "   mutt -H <(tail -n +4 ${OUTPUT##*/}) -s \"[ANNOUNCE] haproxy-$NEWVER\" haproxy@formilux.org"
echo
echo "The HTML block was emitted into $HTML and needs to be finished by hand."
echo
