#!/usr/bin/env bash
set -e -u

GIT_LOCAL_DIR=/run/shm/live555-archive
GIT_RAYL_DIR=/tmp/rayl-live555
GIT_XANVIEW_DIR=/tmp/xanview-live555
ARCHIVE_DIR=/var/www/wx3sweden.se/live555-archive
# The official changelog.txt is broken in at least two places:
# - the first '2004.03.27' should be '2004.03.31'
# - the first '2003.11.06' should be '2003.11.06a'
# This needs to be fixed before this tool is run.
CHANGELOG="$ARCHIVE_DIR"/changelog.txt

# Return sorted list of release dates
function get_release_dates()
{
	egrep '^[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+[a-z]?:' "$CHANGELOG"|cut -d: -f1|sort
}

# Extract commit hash, assumes master branch
function get_git_rayl_commit()
{
	local RELEASE_DATE=$1
	# 8a2ba84 Import live.2014.02.26.tar.gz
	(cd "$GIT_RAYL_DIR" && git log --oneline |grep "live.${RELEASE_DATE}.tar.gz"|cut -d' ' -f1|tail -n1)
}
function get_git_xanview_commit()
{
	local RELEASE_DATE=$1
	# 0a066bb Bump to 2015.05.03
	(cd "$GIT_XANVIEW_DIR" && git log --oneline |grep "Bump to ${RELEASE_DATE}"|cut -d' ' -f1|tail -n1)
}

# Return next release date
function next_release_date()
{
	local RELEASE_DATE=$1
	local ENTRY=1
	if [ -n "$2" ]; then
		ENTRY=$2
	fi
	get_release_dates |grep -A"$ENTRY" "$RELEASE_DATE"|tail -n1
}

FMT="%-6s\t%-23s\t%-36s\t%-8s\t%-12s\n"
function print_header()
{
	printf "$FMT" "Status" "Original tarball" "Local filename" "rayl git" "xanview git"
}

function handle_release()
{
	test -n "$DO_AVAILABILITY" && printf "$FMT" "$STATUS" "$FILENAME" "$TARBALL" "$GIT_RAYL_COMMIT" "$GIT_XANVIEW_COMMIT"
	test -z "$DO_GIT_REPO" && return 0

	if [ ! -e "$GIT_LOCAL_DIR" ]; then
		mkdir -p "$GIT_LOCAL_DIR"
		(cd "$GIT_LOCAL_DIR" && git init)
	fi
	if [ ! -d "$GIT_LOCAL_DIR/.git" ]; then
		echo "Error: Expected a git repo: $GIT_LOCAL_DIR"
		exit 1
	fi
	export GIT_AUTHOR_NAME="Ross Finlayson"
	export GIT_AUTHOR_EMAIL="finlayson@live555.com"
	export GIT_AUTHOR_DATE=$(echo "${RELEASE_DATE}"|sed 's,a$,,')T00:00:00Z
	export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
	export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
	export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"

	# Clean up git directory before update
	(test -d "$GIT_LOCAL_DIR/.git" && rm --one-file-system -rf -- "${GIT_LOCAL_DIR}"/*)

	# Set default commit message
	COMMIT_MSG="Import $FILENAME"
	test "$FILENAME" != "$TARBALL" && COMMIT_MSG="$COMMIT_MSG ($TARBALL)"
	# Copy release files
	if [ -n "$TARBALL" ]; then
		tar zxf "$ARCHIVE_DIR/$TARBALL" -C "$GIT_LOCAL_DIR" --strip-components=1
	elif [ -n "$GIT_RAYL_COMMIT" ]; then
		(cd "$GIT_RAYL_DIR" && git checkout -q "$GIT_RAYL_COMMIT")
		COMMIT_MSG=$(GIT_DIR="$GIT_RAYL_DIR"/.git git log --format=%B -n 1)
		cp -a "$GIT_RAYL_DIR"/* "$GIT_LOCAL_DIR"
		(cd "$GIT_RAYL_DIR" && git checkout -q master)
	elif [ -n "$GIT_XANVIEW_COMMIT" ]; then
		(cd "$GIT_XANVIEW_DIR" && git checkout -q "$GIT_XANVIEW_COMMIT")
		COMMIT_MSG=$(GIT_DIR="$GIT_XANVIEW_DIR"/.git git log --format=%B -n 1)
		cp -a "$GIT_XANVIEW_DIR"/* "$GIT_LOCAL_DIR"
		(cd "$GIT_XANVIEW_DIR" && git checkout -q master)
	else
		# Untracked release
		return 0
	fi
	# Import to local repo
	(cd "$GIT_LOCAL_DIR" && git add --all . && git commit -q -m "$COMMIT_MSG" -a)
}

DO_AVAILABILITY=
DO_GIT_REPO=
if [ $# -lt 1 ]; then
	echo "Usage: $0 [-a] [-g]"
	echo "   -a    Print availability status of releases"
	echo "   -g    Create git repo"
	exit 0
fi
for ARG in $@; do
	test "$ARG" = "-a" && DO_AVAILABILITY=yes
	test "$ARG" = "-g" && DO_GIT_REPO=yes
done

if [ ! -d "$ARCHIVE_DIR" ]; then
	echo "Error: archive directory not found: $ARCHIVE_DIR" >&2
	exit 1
fi
if [ ! -f "$CHANGELOG" ]; then
	echo "Error: Changelog file not found: $CHANGELOG" >&2
	exit 1
fi

# Clone known github archives
if [ ! -d "$GIT_RAYL_DIR" ]; then
	GIT_REPO=https://github.com/rayl/live555
	git clone "$GIT_REPO" "$GIT_RAYL_DIR"
else
	(cd "$GIT_RAYL_DIR" && git checkout -q master)
fi
if [ ! -d "$GIT_XANVIEW_DIR" ]; then
	GIT_REPO=https://github.com/xanview/live555
	git clone "$GIT_REPO" "$GIT_XANVIEW_DIR"

else
	(cd "$GIT_XANVIEW_DIR" && git checkout -q master)
fi

# Print header for handle_release() output
print_header

# Loop over releases in changelog
get_release_dates | while read RELEASE_DATE; do 
	NEXT_REL_DATE=$(next_release_date $RELEASE_DATE 1)
	NEXT2_REL_DATE=$(next_release_date $RELEASE_DATE 2)

	TARBALL=
	FILENAME="live.${RELEASE_DATE}.tar.gz"
	test -f "$ARCHIVE_DIR/$FILENAME" && TARBALL="$FILENAME"
	if [ -z "$TARBALL" ]; then
		for VARIANT_FILENAME in "liblivemedia-${RELEASE_DATE}.orig.tar.gz" "liblivemedia-dmo_${RELEASE_DATE}.tar.gz" "liblivemedia-dmo_${RELEASE_DATE}.orig.tar.gz"; do
			test -f "$ARCHIVE_DIR/$VARIANT_FILENAME" && TARBALL="$VARIANT_FILENAME"
		done
	fi
	GIT_RAYL_COMMIT=$(get_git_rayl_commit "${RELEASE_DATE}")
	GIT_XANVIEW_COMMIT=$(get_git_xanview_commit "${RELEASE_DATE}")
	STATUS="- lost"
	if [ -n "$TARBALL" -o -n "$GIT_RAYL_COMMIT" -o -n "$GIT_XANVIEW_COMMIT" ]; then
		STATUS="+ ok"
	fi
	handle_release

#	# Handle 'a' releases
#	TARBALL=
#	FILENAME="live.${RELEASE_DATE}a.tar.gz"
#	test -f "$ARCHIVE_DIR/$FILENAME" && TARBALL="$FILENAME"
#	GIT_RAYL_COMMIT=$(get_git_rayl_commit "${RELEASE_DATE}a")
#	GIT_XANVIEW_COMMIT=$(get_git_xanview_commit "${RELEASE_DATE}a")
#	if [ -n "$TARBALL" -o -n "$GIT_RAYL_COMMIT" -o -n "$GIT_XANVIEW_COMMIT" ]; then
#		STATUS="+ ok"
#		handle_release
#	fi
done
