#!/bin/sh

set -eu

PRG=$(basename "$0")

showhelp() {
	cat <<EOF
Usage: $PRG PROJECT [GIT_REPO [SSH_CONN [GIT_REMOTE]]]

Initialize remote git, push local git, and set as default remote.

    PROJECT     basename or relative path for remote git project

    GIT_REPO    hostname for public git access, or absolute basepath
                default: "source." + current domainname

    SSH_CONN    hostname for ssh, optionally with user + "@" prepended
                default: GIT_REPO unless it starts with "/"

    GIT_REMOTE  name for local repository set
                default: "origin"

Full remote path becomes SSH_USER@SSH_HOST:BASEPATH/PROJECT.git
where BASEPATH is resolved as "/srv/git/" + GIT_REPO
or simply GIT_REPO when it begins with "/".

When local repository set is "origin" it is marked as default remote.

Examples:
  $PRG myproject
  $PRG some/subproject git.example.org me@shell.example.org
  $PRG some/subproject /private/path/on/ssh/host me.example.org backup
  $PRG some/subproject /private/path/on/local/host

EOF
}

exit1() {
	echo >&2 "${1:+ERROR: }${1:-Internal error!}"
	exit 1
}

# parse cmdline options
TEMP="`getopt -s sh -o h -l help -n "$PRG" -- "$@"`" || exit1
eval set -- "$TEMP"
while true; do
	case "$1" in
		-h|--help) showhelp; exit;;
		--) shift; break;;
		*) exit1;;
	esac
done

PROJECT=${1-$(showhelp; exit1 "project name missing")}
GIT_REPO=${2:-source.$(dnsdomainname --domain)}
case "$GIT_REPO" in
  /*)
	BASEPATH=$GIT_REPO
	;;
  *)
	GIT_HOST=$GIT_REPO
	BASEPATH=/srv/git/"$GIT_REPO"
	;;
esac
SSH_CONN=${3:-$GIT_HOST}
GIT_REMOTE=${4:-origin}

[ origin != "$GIT_REMOTE" ] || ORIGIN_IS_DEFAULT=yes

# TODO: handle /~ BASEPATH specially and stop blindly ignore any error
[ -z "$SSH_CONN" ] || ssh "$SSH_CONN" git init --bare --shared "$BASEPATH"/"$PROJECT".git || true
git remote add "$GIT_REMOTE" "$SSH_CONN":"$BASEPATH"/"$PROJECT".git
git push ${ORIGIN_IS_DEFAULT:+--set-upstream} "$GIT_REMOTE" master