#!/bin/sh

set -e

. /etc/pkgos/pkgos.conf

if [ -z "${SALSA_TOKEN}" ] ; then
        echo "The \$SALSA_TOKEN variable is empty. Please export it with" >/dev/stderr
        echo "a valid salsa.debian.org token as content." >/dev/stderr
        exit 1
fi

ME=$(basename $0)

usage () {
	echo "$ME --openstack-release OPENSTACK_RELEASE --debian-release <debian-release> --project-name PROJECT_NAME [--project-id PROJECT_ID] [--jenkins-token JENKINS_TOKEN]"
	exit 1
}

DEBUG=no
for i in $@ ; do
	case "${1}" in
	"--openstack-release")
		if [ -z "${2}" ] ; then
			echo "No parameter defining the OpenStack release."
			usage
		fi
		NEW_RELEASE=${2}
		shift
		shift
	;;
	"--project-id")
		if [ -z "${2}" ] ; then
			echo "No parameter defining the project ID."
			usage
		fi
		PROJECT_ID=${2}
		shift
		shift
	;;
	"--project-name")
		if [ -z "${2}" ] ; then
			echo "No parameter defining the project name."
			usage
		fi
		PROJECT_NAME=${2}
		shift
		shift
	;;
	"--debian-release")
		if [ -z "${2}" ] ; then
			echo "No parameter defining the Debian release"
			usage
		fi
		DEBIAN_RELEASE=${2}
		shift
		shift
	;;
	"--jenkins-token")
		if [ -z "${2}" ] ; then
			echo "No parameter defining the Jenkins token"
			usage
		fi
		JENKINS_TOKEN=${2}
		shift
		shift
	;;
	"--debug")
		DEBUG=yes
		shift
	;;
	*)
	;;
	esac
done

if [ -z "${NEW_RELEASE}" ] ; then
	CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)
	case "${CURRENT_BRANCH}" in
	debian/*)
		CANDIDATE_RELEASE=${CURRENT_BRANCH#debian/}
		if [ ! -r /etc/pkgos/openstack-release.txt ] || grep -q "^${CANDIDATE_RELEASE}$" /etc/pkgos/openstack-release.txt ; then
			NEW_RELEASE=${CANDIDATE_RELEASE}
		fi
	;;
	esac
fi

if [ -z "${PROJECT_NAME}" ] ; then
	GIT_TOPLEVEL=$(git rev-parse --show-toplevel 2>/dev/null || true)
	if [ -n "${GIT_TOPLEVEL}" ] ; then
		PROJECT_NAME=$(basename "${GIT_TOPLEVEL}")
	fi
fi

if [ -z "${NEW_RELEASE}" ] ; then
	echo "No OpenStack release defined."
	usage
fi
if [ -z "${PROJECT_NAME}" ] ; then
	echo "No PROJECT_NAME defined."
	usage
fi

if [ -z "${PROJECT_ID}" ] ; then
	PROJECT_ID=$(pkgos-salsa-get-project-id --project-name ${PROJECT_NAME})
	if [ -z "${PROJECT_ID}" ] ; then
		echo "Cannot find project id for ${PROJECT_NAME}"
		exit 1
	fi
fi

if [ -z "${DEBIAN_RELEASE}" ] ; then
	DEBIAN_RELEASE_CANDIDATES=$(awk -v rel="${NEW_RELEASE}" \
		'$1 == rel { out = "" ; for (i = 2; i <= NF; i++) out = out (out == "" ? "" : " ") $i ; print out }' \
		/etc/pkgos/openstack-debian-release.txt 2>/dev/null || true)
	set -- ${DEBIAN_RELEASE_CANDIDATES}
	if [ $# -eq 1 ] ; then
		DEBIAN_RELEASE=${1}
		echo "Guessed --debian-release ${1} for ${NEW_RELEASE} from /etc/pkgos/openstack-debian-release.txt"
	elif [ $# -gt 1 ] ; then
		echo "${NEW_RELEASE} is available on several Debian releases (${DEBIAN_RELEASE_CANDIDATES}): please pass --debian-release explicitly" >/dev/stderr
		usage
	else
		echo "No DEBIAN_RELEASE defined."
		usage
	fi
fi
if [ -z "${JENKINS_TOKEN}" ] ; then
	echo "No JENKINS_TOKEN defined."
	usage
fi

URL=$(urlencode "https://${DEBIAN_RELEASE}-${NEW_RELEASE}.debian.net/project/${PROJECT_NAME}")

DEFAULT_BRANCH=$(curl -s -H "PRIVATE-TOKEN: ${SALSA_TOKEN}" \
	"https://salsa.debian.org/api/v4/projects/${PROJECT_ID}" | jq -r '.default_branch // ""')
case "${DEFAULT_BRANCH}" in
debian/*)
	ENCODED_BRANCH=$(urlencode "debian/${NEW_RELEASE}")
	BRANCH_FILTER="&push_events_branch_filter=${ENCODED_BRANCH}"
;;
*)
	if [ -n "${DEFAULT_BRANCH}" ] ; then
		echo "${YELLOW}   Project default branch is ${DEFAULT_BRANCH}, which isn't the debian/<release> schema: the webhook will trigger on all branches (branch_filter_strategy=all_branches)${NO_COL}"
		BRANCH_FILTER="&branch_filter_strategy=all_branches"
	else
		echo "Could not read the default branch of ${PROJECT_NAME} from the GitLab API" >/dev/stderr
		exit 1
	fi
;;
esac

    BLUE="\033[1;34m"
   LGRAY="\033[0;37m"
  NO_COL="\033[0m"
   LBLUE="\033[1;36m"
     RED="\033[1;31m"
   GREEN="\033[1;32m"
   WHITE="\033[1;37m"
  YELLOW="\033[1;33m"
LINEWRAP="\033[7h"
      UP="\033[1A"
    DOWN="\033[1B"
      NL="\033[1E"
      RN="\033[1S"

echo "${YELLOW}-> New webhook for ${PROJECT_NAME}, ${DEBIAN_RELEASE} and ${NEW_RELEASE}${NO_COL}"
if [ "${DEBUG}" = "yes" ] ; then
	echo "Posting to: https://salsa.debian.org/api/v4/projects/${PROJECT_ID}/hooks?push_events=true&url=${URL}&token=${JENKINS_TOKEN}${BRANCH_FILTER}"
	CURL_OPT="-i"
else
	CURL_OPT="-s"
fi
if [ "${DEBUG}" = "no" ] ; then
	curl ${CURL_OPT} -X POST -H "PRIVATE-TOKEN: ${SALSA_TOKEN}" \
		"https://salsa.debian.org/api/v4/projects/${PROJECT_ID}/hooks?push_events=true&url=${URL}&token=${JENKINS_TOKEN}${BRANCH_FILTER}"
	echo ""
fi
