#!/bin/sh
set -e
set -x

# À FAIRE: gestion des dépendances entre incréments.

# À FAIRE: gérer les renommages de fichiers, voire leur déplacement s'ils étaient initialement dans un dossier au-dessus (donc non pris en compte par le tar). Peut-être par introduction d'une phase manuelle qui permettrait de prendre la main sur le processus automatique, par exemple en darcs addant le fichier (non vu par l'auto) dans son nommage originale, puis court-circuitant le darcs add auto du fichier dans son nommage définitif par un darcs mv manuel.

# Utilisation: extractiondarcs <destination> <fichier>*
# N.B.: si un des fichiers à reprendre a eu un autre nom, il faut le spécifier sous son ancien et son nouveau nom.

T=/tmp/temp.$$
mkdir $T

dest="$1"
shift

# Calcul d'où on est par rapport à _darcs.

ici="`pwd`"
descente=
until [ -d "_darcs" ]
do
	descente="`basename "$ici"`/$descente"
	cd ..
	ici="`pwd`"
done
format="`grep darcs- _darcs/format`"
cd "$ici"

# Création des dossiers de travail.

mkdir $T/src
mkdir $T/dst

[ $format = darcs-2 ] || type=--hashed
( cd $T/src && darcs init $type )
( cd $T/dst && darcs init )

# darcs changes pour pipe
dcp()
{
	darcs changes "$@" --xml | awk \
'
/<patch /{
	d = $0;
	gsub(/.* date=['\''"]/, "", d); gsub(/['\''"].*/, "", d);
	print d;
	a = $0;
	gsub(/.* author=['\''"]/, "", a); gsub(/['\''"].*/, "", a);
	print a;
}
/<name>/{ gsub(/[ 	]*<[^>]*>[ 	]*/, ""); print; }
/<comment>/{ sub(/.*<comment>/, ""); dedans = 1; }
/<\/comment>/{ sub(/<\/comment>.*/, ""); dedans = 2; }
/^Ignore-this: /{ next; }
dedans{ print; }
dedans==2{ dedans = 0; }
' \
	| php -r 'foreach(explode("\n", trim(stream_get_contents(STDIN))) as $l) { $ic = iconv("utf-8", "cp1252//IGNORE", $l); if($l == @iconv("cp1252", "utf-8", iconv("cp1252", "utf-8", iconv("utf-8", "cp1252//IGNORE", $ic)))) $l = $ic; echo "$l\n"; }' \
	| php -r 'echo trim(html_entity_decode(stream_get_contents(STDIN), ENT_QUOTES|ENT_HTML5));'
}

	( cd "$ici/$descente" && darcs log "$@" ) | grep -n '^patch ' | sort -nr | while read blabla id
do
		echo a | darcs push -h "$id" $T/src
	mv $T/src/_darcs $T/src_darcs
	mv $T/dst/_darcs $T/dst_darcs
	rm -R $T/dst
	mkdir $T/dst
	( cd $T/src/$descente && tar cf - . ) | ( cd $T/dst && tar xf - ) || true
	mv $T/dst_darcs $T/dst/_darcs
	mv $T/src_darcs $T/src/_darcs
		( cd $T/dst && for f in "$@" ; do [ ! -e "$f" ] || darcs add -r "$f" ; done ) || true
		( cd $T/src && dcp --last=1 ) | ( cd $T/dst && darcs record -a --pipe )
done

rm -Rf "$dest" # Euh est-ce une bonne idée? Ne devrait-on pas demander un -f pour ce faire?
mv $T/dst "$dest"

rm -R $T
