#!/bin/sh

moiGitHub=outtersg
racineComposer=gui
moiComposer="Guillaume Outters"

PACKAGIST_API_TOKEN=xxxxxxxxxxxxxxxxxxxx

set -e

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

nouvelleEtiquettePour()
{
	local prefixe="$1"
	local r="$2"
	
	if git tag -l --contains "$r" "$prefixe" "$prefixe.*" | grep -q .
	then
		return 1
	fi
	
	local nmax="`git tag -l "$prefixe" "$prefixe.*" | sed -e "s/^$prefixe//" -e 's/^$/.0/' | cut -d . -f 2 | sort -n | tail -1`"
	suffixe=
	[ -z "$nmax" ] || suffixe=".`expr "$nmax" + 1`"
	nouvelleEtiquette="$prefixe$suffixe" # Variable globale.
}

choperPrefixeVersion()
{
	local r
	if [ -f composer.json ]
	then
		r="`sed -E -e '/.*"version": *"([0-9]+(\.[0-9]+)*)\.x-dev".*/!d' -e 's//\1/' < composer.json | head -1`"
		if [ -n "$r" ]
		then
			echo "$r"
			return
		fi
	fi
}

daterVersionComposer()
{
	local prefixe="`choperPrefixeVersion`"
	[ -n "$prefixe" ] || return 0
	
	# Calcul de la date à coller commer version de rustine.
	
	local jourDernierMoins2000="`dateDernier`"
	
	# Parcours des étiquetages déjà effectués avec cette valeur.
	
	etiquette="$prefixe.$jourDernierMoins2000"
	
	if nouvelleEtiquettePour "$etiquette" "`git rev-list -n 1 master`"
	then
		local v="$nouvelleEtiquette"
		git checkout master
				git branch "$v"
				git checkout "$v"
		sed -E -e 's#("version": *")[^"]*"#\1'"$nouvelleEtiquette"'"#g' < composer.json > composer2.json && mv composer2.json composer.json
				git commit -m "composer.json: date du jour" composer.json
				git tag "$v"
				git checkout master
				git branch -D "$v"
	fi
}

dateDernier_git()
{
	git log -n 1 --date=format:%y%m%d --pretty=format:%cd
}

dateDernier_darcs()
{
	local dateDernier jourDernier heureDernier jourDernierMoins2000
	
		dateDernier="`darcs changes --last 1 --xml | sed -e '/ date=/!d' -e 's/.* date=//' -e 's/ .*//' | head -1 | tr -d \''"'`"
		case "$dateDernier" in
			20????????????)
				jourDernier="`echo "$dateDernier" | cut -c 1-8`"
				heureDernier="`echo "$dateDernier" | cut -c 9-`"
				jourDernierMoins2000="`expr "$jourDernier" - 20000000`"
				;;
		esac
	
	echo "$jourDernierMoins2000"
}

prefs()
{
	[ ! -e .git/prefs ] || . .git/prefs
	[ ! -z "$nomComp" ] || nomComp="$nom"
	[ ! -z "$PACKAGIST_URI" ] || PACKAGIST_URI=$racineComposer/$nomComp
}

d2g()
{
[ -d _darcs ] || err "Vous devez vous trouver dans un dossier racine darcsisé (_darcs doit exister)."

[ -e .git/index ] && err ".git contient déjà un dossier git. Je ne peux travailler dessus."
	
	dateDernier() { dateDernier_darcs "$@" ; }

d2g="`command -v darcs-to-git`"
[ 2 -eq "`grep Ignore-this: < "$d2g" | wc -l`" ] || err "Veuillez utiliser une version de darcs-to-git qui vire les Ignore-this:"

if [ ! -d .git ]
then
	mkdir .git
	touch .git/prefs
	mkdir .git/travail
fi
	
	prefs
	
cd .git

cd travail
if [ ! -f ../auteurs ]
then
	darcs-to-git ../.. --list-authors | sed -e '1,/^---$/s/^\([^#]\)/#- \1/' > ../auteurs && vi ../auteurs
fi
git checkout master || true
# Fichier sus différents entre darcs et git:
for f in composer.json
do
	[ -f "$f" ] && darcs revert -a "$f" || true
done
darcs-to-git ../.. --author-map ../auteurs || true
}

g2g()
{
	dateDernier() { dateDernier_git "$@" ; }
	
	prefs
}

faire()
{
	nom="`basename "$PWD"`"
	
	if [ -e .git/index -a ! -e _darcs ]
	then
		g2g
	else
		d2g
	fi
if ! grep -q remote.\*origin .git/config
then
	git remote add origin git@github.com:$moiGitHub/$nom.git
fi
# Y a-t-il de quoi générer une version?
daterVersionComposer
git push --tags -u origin master
# Le truc suivant n'est à appeler que si on n'a pas effectué le branchement github -> packagist.
curl -X POST -H 'Content-Type: application/json' "https://packagist.org/api/update-package?username=$moiComposer&apiToken=$PACKAGIST_API_TOKEN" -d '{"repository":{"url":"https://packagist.org/packages/'"$PACKAGIST_URI"'"}}'
# Sinon il faut paramétrer sous github un webhook https://github.com/outtersg/$nom/settings/hooks/new en:
#   https://packagist.org/api/github?username=Guillaume%20Outters
#   application/json
#   $PACKAGIST_API_TOKEN
}

faire "$@"
