#!/bin/sh

# Entrypoint script for migrations. If provided with a database URI as
# an argument, just runs `sqitch deploy` against that URI. Otherwise,
# it uses five "PGDB_" env vars to determine the database location,
# waits for that database to be available, and then runs `sqitch
# deploy`.

# set -x

TIMEOUT=15
SQITCH_COMMAND=deploy

echoerr() {
		printf "%s\n" "$*" 1>&2
}

usage() {
		exitcode="$1"
		cat << USAGE >&2
Usage:
  $cmdname [-u database_uri ] [-c command] [-- deploy_args]
  -u DATABASE_URI | --uri=database_uri   URI of database to migrate
  -c COMMAND | --command=sqitch_comand   Sqitch command to run; defaults to deploy
  -- DEPLOY_ARGS                         Additional args to pass to sqitch deploy

  If a DATABASE_URI is not provided, database URI will be constructed
  from the env vars POSTGRES_HOST, POSTGRES_DB, POSTGRES_PASSWORD, POSTGRES_PORT, and
  POSTGRES_USER.

  If a DATABASE_URI is provided, it will be assumed to already be
  available, and sqitch deploy will be run immediately without
  waiting.
USAGE
		exit "$exitcode"
}

wait_for() {
		for i in `seq $TIMEOUT` ; do
				nc -z "$1" "${2:-5432}"

				result=$?
				if [ $result -eq 0 ]; then
						return 0
				fi
				sleep 1
		done
		echo "Operation timed out" >&2
		exit 1
}

construct_uri() {
		# db:pg://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB
		user_part="${POSTGRES_USER}${POSTGRES_PASSWORD:+:${POSTGRES_PASSWORD}}"
		host_part="${POSTGRES_HOST}${POSTGRES_PORT:+:${POSTGRES_PORT}}"
		name_part="${POSTGRES_DB:+/${POSTGRES_DB}}"
		echo "db:pg://${user_part:+${user_part}@}${host_part}${name_part}"
}

entrypoint() {
		if [ -z "$DB_URI" ]; then
				if [ -n "$POSTGRES_HOST" ]; then
						wait_for "$POSTGRES_HOST" "$POSTGRES_PORT"
				fi
				DB_URI=$(construct_uri)
		fi
		sqitch "$SQITCH_COMMAND" "$DB_URI" $@
}

while [ $# -gt 0 ]
do
		case "$1" in
				-q | --quiet)
						QUIET=1
						shift 1
						;;
        -t)
						TIMEOUT="$2"
						if [ "$TIMEOUT" = "" ]; then break; fi
						shift 2
						;;
        --timeout=*)
						TIMEOUT="${1#*=}"
						shift 1
						;;
			  -c)
						SQITCH_COMMAND="$2"
						shift 2
						;;
			  --command=*)
						SQITCH_COMMAND="${1#*=}"
						shift 1
						;;
			  -u)
						DB_URI=$2
						shift 2
						;;
			  --uri=*)
						DB_URI="${1#*=}"
						shift 1
						;;
			  --)
						shift
						break
						;;
			  --help)
						usage 0
						;;
				*)
						echoerr "Unknown argument: $1"
						usage 1
						;;
		esac
done

entrypoint "$@"
