#!/bin/bash
# puts the public files online after a release
# Copyright (c) 2006-2016 Willy Tarreau <w@1wt.eu>
#
# In short :
#   - requires git
#   - no restriction to master, uses last tag
#   - copies & compresses files, changelog & docs to the final destination
#   - shows a listing of the final file

USAGE="Usage: ${0##*/} [-a] [-q] [-y] [-b branch] [-n newver] DIR"
TARGET_DIR=
OUTPUT=
SAYYES=
BRANCH=
DEVEL=
QUIET=
AUTO=
NEW=
DIR=
DOC=( )

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

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

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

while [ -n "$1" -a -z "${1##-*}" ]; do
	case "$1" in
		-a)        AUTO=1         ; shift   ;;
		-q)        QUIET=1        ; shift   ;;
		-y)        SAYYES=1       ; shift   ;;
		-b)        BRANCH="$2"    ; shift 2 ;;
		-n)        NEW="$2"       ; shift 2 ;;
		-h|--help) quit "$USAGE" ;;
		*)         die  "$USAGE" ;;
	esac
done

if [ $# -ne 1 ]; then
	die "$USAGE"
fi

DIR="$1" ; shift
if [ -z "$DIR" ]; then
	die "Missing target directory name."
fi

if [ -n "${DIR##/*}" ]; then
	DIR="$PWD/$DIR"
fi

if [ ! -d "$DIR/." ]; then
	die "Target directory doesn't exist : $DIR"
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
toplvl=$(git rev-parse --show-toplevel)
if [ -n "$toplvl" ]; then
	cd "$toplvl"
fi

# ensure that a master branch exists here
if [ -z "$(git rev-parse --verify -q master 2>/dev/null)" ]; then
	die "Current directory doesn't seem to be a valid git directory (no master branch)."
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 [ "$(git diff HEAD 2>/dev/null |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 "$NEW" -o -n "$AUTO" ]; then
	if [ -z "$NEW" ]; then
		NEW="$(git describe --tags HEAD --abbrev=0)"
		NEW="${NEW#v}"
		if [ -z "$NEW" ]; then
			die "Fatal: cannot determine new version, please specify it."
		fi
	fi

	if [ "$(git describe --tags HEAD)" != "v$NEW" ]; then
		if [ -n "$AUTO" ]; then
			quit "Not tagged, nothing to do."
		fi
		die "Current version doesn't seem tagged, it reports $(git describe --tags "v$NEW"). Did you release it ?"
	fi
fi

if ! git show-ref --tags "v$NEW" >/dev/null; then
	die "git tag v$NEW doesn't exist, did you create the release ?"
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

TARGET_DIR="$DIR/$BRANCH"
if [ ! -d "$TARGET_DIR/." ]; then
	die "Target directory doesn't contain branch $BRANCH. You may have to create it in $DIR."
fi

if [ -z "${NEW##*-dev*}" ]; then
	DEVEL="/devel"
fi

if [ -n "$AUTO" -a -e "$TARGET_DIR/src${DEVEL}/haproxy-$NEW.tar.gz.md5" ]; then
	quit "Version $NEW Already released."
fi

if ! mkdir -p "$TARGET_DIR/src$DEVEL" "$TARGET_DIR/doc"; then
	die "failed to create target directories."
fi

case "$BRANCH" in
	1.3) DOC=( doc/{haproxy-en,haproxy-fr,configuration,architecture}.txt )               ;;
	1.4) DOC=( doc/{haproxy-en,haproxy-fr,configuration}.txt )                            ;;
	1.5) DOC=( doc/{coding-style,configuration,proxy-protocol}.txt )                      ;;
	1.6) DOC=( doc/{coding-style,intro,management,configuration,proxy-protocol,lua}.txt ) ;;
	*)   DOC=( doc/{coding-style,intro,management,configuration,proxy-protocol,lua,SPOE}.txt ) ;;
esac

if [ -z "$AUTO" ]; then
	echo "Ready to produce the following files in $TARGET_DIR/ :"
	echo "    haproxy-$NEW.tar.gz -> src${DEVEL}/"
	echo "    CHANGELOG -> src/CHANGELOG"
	echo "    ${DOC[@]} -> doc/*{,.gz}"
	echo

	git ls-tree -l --abbrev=12 "v$NEW" -- CHANGELOG "${DOC[@]}"

	if [ -z "$SAYYES" ]; then
		echo "Press ENTER to continue or Ctrl-C to abort now!"
		read
	fi
fi

echo "Archiving sources for version $NEW ..."
rm -f "${TARGET_DIR}/src${DEVEL}/haproxy-${NEW}.tar.gz"{,.md5,.sha256}
if ! git archive --format=tar --prefix="haproxy-${NEW}/" "v$NEW" | \
     gzip -9 > "${TARGET_DIR}/src${DEVEL}/haproxy-${NEW}.tar.gz"; then
	die "Failed to produce the tar.gz archive"
fi

( cd "$TARGET_DIR/src${DEVEL}" ; \
  md5sum haproxy-$NEW.tar.gz > haproxy-$NEW.tar.gz.md5 ; \
  sha256sum haproxy-$NEW.tar.gz > haproxy-$NEW.tar.gz.sha256 )

echo "Extracting doc ..."
git show "v$NEW:CHANGELOG" > "$TARGET_DIR/src/CHANGELOG"

for i in "${DOC[@]}"; do
	git show "v$NEW:$i" > "$TARGET_DIR/doc/${i#doc/}"
	gzip -c9 < "$TARGET_DIR/doc/${i#doc/}" > "$TARGET_DIR/doc/${i#doc/}.gz"
done

echo "Done : ls -l ${TARGET_DIR}"
( cd "$TARGET_DIR" ;
  ls -l src/CHANGELOG "src${DEVEL}/haproxy-${NEW}".tar.gz{,.md5,.sha256} $(for i in "${DOC[@]}"; do echo "doc/${i#doc/}"{,.gz}; done)
)
echo
