#!/bin/sh
# Enregistre dans le Passé
# Destiné à être inclus dans un shell (pour mémorisation du "début de session").

# Darcs 2.10 et suivants gèrent différemment le commentaire de rustine de son titre. Le titre est pris dans l'encodage 'locale', le commentaire interprété comme du CP1252. On convertit donc pour lui plaire.
# Darcs 2.14 corrige la chose.
case `darcs --version` in
	2.1[0-2].*) ep_filtrage="iconv -f utf-8 -t cp1252" ;; # Attention, ce n'est pas impeccable: grosso modo, seuls les caractères ISO8859-1 sont pris en compte; ainsi le é uC3A9, devenu cE9 via l'iconv, est bien retransformé en uC3A9 dans la rustine; par contre l'œ uC593, devenu c9C, reste u9C (invalide) dans la rustine; mais si l'on décide de laisser l'œ sous forme de cC593, darcs pour le coup le reconvertit en uC385C293 (iconv ISO8859-1 -> UTF-8 transforme C5 en C385 et 93 en C293)
	*) ep_filtrage=cat ;;
esac

tifs()
{
	unset IFS
	set +o noglob
	"$@"
}

ep_init()
{
	ep_dateRef="`darcs changes --xml . | head -3 | sed -e '/ date=/!d' -e "s/.* date='//" -e "s/'.*//"`"
	ep_dateRef="`TZ=GMT datedens "$ep_dateRef"`"
	
	pp_decalage
	
	ep_chemin="`pwd`"
	while [ "$ep_chemin" != / -a ! -e "$ep_chemin/_darcs/prefs/author" ]
	do
		ep_chemin="`dirname "$ep_chemin"`"
	done
	ep_auteur="`darcs changes --last=1 | grep ^Author: | cut -d ' ' -f 2-`"
	[ ! -z "$ep_auteur" ] || ep_auteur="`sed -e 's/ *#.*//' < "$ep_chemin/_darcs/prefs/author" | grep -v ^$ | head -1`"
	if [ -z "$ep_auteur" ]
	then
		printf "Auteur? "
		read ep_auteur
	fi
}

paramsOmp()
{
	while [ $# -gt 0 ]
	do
		paramsOmp="$paramsOmp$1$sep"
		shift
	done
}

_epomp()
{
	local paramsOmp= sep="`printf '\003'`"
	while [ $# -gt 0 ]
	do
		case "$1" in
			-d) paramsOmp -e 'What is the date? ' $ep_maintenant ;; # Date
			-a) paramsOmp -e 'Who is the author? ' "$ep_auteur" ;; # Auteur
			-t) paramsOmp -e 'What is the patch name? ' "$ep_nom" ;; # Titre
			-e) [ -n "$comm" ] || comm="`printf '\004'`" ; paramsOmp -e 'What is the log?' "$comm" ;; # Explication
			*) break ;;
		esac
		shift
	done
	set -o noglob # Sur un bash 4.2.45, sans cette option, les ? et * de $paramsOmp sont interprétés. Bien dommage quand le propre de notre omp est de répondre à des questions.
	IFS="$sep"
	tifs omp - $paramsOmp . "$@"
}

ep()
{
	local tiquette=
	[ "x$1" = x-t ] && tiquette=1 && shift || true
	ep_nom="$1" ; shift
	ep_descr="$1" ; shift
	[ ! -z "$ep_decalage" ] || ep_init
	local ep_maintenant="`pp_maintenant`"
	ep_maintenant="`TZ=GMT datesend $ep_maintenant +%Y%m%d%H%M%S`"
	local s3="`printf '\003'`"
	local comm="`echo "$ep_descr" | sed -e 's/\([^\]\)|/\1'"$s3"'/g' -e 's/[\]|/|/g' | tr "$s3" '\012' | $ep_filtrage`"
	if [ -z "$tiquette" ]
	then
		_epomp -d -a -t -e darcs record --pipe "$@"
	else
		_epomp -d -a -e darcs tag --pipe "$ep_nom" "$@"
	fi
}

#--- pp ---

testi_darcs_pp()
{
	pp_decalage=
	ep_decalage=
	
	# Pousse-projet, ou pousse-passé.
	pp()
	{
		memeprojet || { [ $? = 2 ] && pp "$@" ; return ; }
		
		ep "$@"
	}
}

DANSPROJET_TESTI_DARCS="$DANSPROJET_TESTI_DARCS testi_darcs_pp"
