#!/bin/sh

# NOTAG   -- tagge nicht
# NOPUT   -- sende die gebauten Pakete nicht ins Archiv
# NOGIT   -- greife nicht auf git zu
# NOTEST  -- führe keine Testläufe durch
# NOMAIL  -- schicke keine Mails
# NOCLEAN -- putze die temporären Dateien nicht weg
set -e

export DEBIAN_SCRIPT_DEBUG=y

#NEWDIST=lenny

. ${POPHOME:-@POPHOME@}/lib/pop_conf_sh

test -n "$GPGKEY" || GPGKEY=6D322C97

export LANG=C
export LC_ALL=C
export TICKET_API_USER=monitor # siehe Ticket 10155455

LOG=$(tempfile) # Mail

TEMPS="$LOG" # Liste temporärer Dateien
if test -z "$NOMAIL" ; then
	exec >$LOG 2>&1
fi

set -x

cd $HOME

if ! cd $HOME/kunde ; then
	echo "keine kunde-Source gefunden" >&2
	exit 1
fi

dest="qsu";
if test -n "$1" ; then
	dest=$1
	NOTAG=1
	NOMAIL=1
fi

DINSTALL=/var/lib/debarchiver
DINST_IN=$DINSTALL/incoming

LOCK=/var/lock/kunde/builder

if ! shlock $LOCK ; then
	rm -f $LOG
	exit 0
fi


trap 'echo GESTORBEN; test -n "$NOCLEAN" || rm -rf $TEMPS $LOCK' 1 2 15
if test -z "$NOMAIL" ; then
trap 'mail -a "X-Autoreply: no" -s "kunde-builder: Problem auf QSU" entwicklung+queue=entwicklung/kunde@ticket.noris.net < $LOG; test -n "$NOCLEAN" || rm -rf $TEMPS $LOCK ' 0
else
trap 'echo GESTORBEN; test -n "$NOCLEAN" || rm -rf $TEMPS $LOCK' 0
fi

if test -z "$NOGIT" ; then
	LAST=$(git rev-parse --verify $dest)
	THIS=$(git rev-parse --verify HEAD)
	# wiederhole, falls Verbindungsfehler
	git fetch -f origin $dest:$dest || \
	git fetch -f origin $dest:$dest
	NOW=$(git rev-parse --verify $dest)
	if test -z "$NOUPDATE" -a "$NOW" = "$LAST" ; then trap '' 0; test -n "$NOCLEAN" || rm -rf $TEMPS $LOCK; exit 0; fi

	if test $LAST != $THIS ; then
		echo "Der aktuelle Zweig stimmt nicht mit $dest ueberein! Schande!" >&2
		exit 1
	fi
fi

cd ..
rm -f *.* || true
cd kunde

if test -s /usr/pop/VERSION ; then
	OLD_V=$(cat /usr/pop/VERSION)
else
	OLD_V=$(dpkg-parsechangelog | sed -ne 's/^Version: //p')
fi
test -n "$NOGIT" || git reset --hard $dest --
NEW_V=$(dpkg-parsechangelog | sed -ne 's/^Version: //p')

trap 'set +e; test -n "$NOMAIL" && echo GESTORBEN || mail -a "X-Autoreply: no" -s "kunde $NEW_V: Problem auf QSU" entwicklung+queue=entwicklung/kunde@ticket.noris.net < $LOG; test -n "$NOCLEAN" || rm -rf $TEMPS $LOCK ' 0

DIST=$(dpkg-parsechangelog | sed -ne 's/^Distribution: //p')

if test -z "$NOPUT" -a $(cd $DINST_IN/$DIST; ls | grep ^kunde | wc -l) -gt 0 ; then
	echo "im debarchiver-incoming liegt Kram rum" >&2
	exit 1
fi


## Aufruf aus trap: uninstall_kunde PFAD_ZU_SOURCEN
uninstall_kunde() {
	sudo apt-get -o 'DPkg::Options::=--force-confold' -y --force-yes install kunde-common=$OLD_V $(sed -ne 's/^Package: \(.*\)/\1='"$OLD_V/p" < $1/debian/control | egrep -v "kunde-(32-bin|64-bin|common)=")
}

if test "$OLD_V" = "$NEW_V" ; then
	echo "Du willst die Version '$NEW_V' recyceln. Schäm dich." >&2
	exit 1
fi

if test -z "$NOGIT" ; then
	NEW_T="kunde_$(echo $NEW_V | sed -e 'y/./_/')"
	if git rev-parse --verify $NEW_T 2>/dev/null >/dev/null ; then
		echo "Du willst die Version '$NEW_T' recyceln. Schäm dich." >&2
		exit 1
	fi
fi

dpkg-buildpackage -rfakeroot -S -sa -us -uc -I.git || \
dpkg-buildpackage -rfakeroot -S -sa -us -uc -I.git 
# Manchmal fliegt das mit einem tar-Fehler auf die Nase. RT#418564
# Die eigentliche Ursache ist noch unbekannt. -- smurf

test -z "$NEWDIST" || dpkg-genchanges -S -sa -DDistribution=$NEWDIST >../kunde_${NEW_V}_new_source.changes

if test -z "$NOPUT" ; then
	cd ..
	debsign -k$GPGKEY kunde_${NEW_V}_source.changes
	#debsign -k$GPGKEY kunde_${NEW_V}_new_source.changes

	cat kunde_${NEW_V}_source.changes
	#dput -f local kunde_${NEW_V}_source.changes
	cp kunde_${NEW_V}.tar.gz kunde_${NEW_V}.dsc $DINST_IN/$DIST
	cp kunde_${NEW_V}_source.changes $DINST_IN/$DIST
	sleep 10
	if test -n "$NEWDIST" ; then
		cp kunde_${NEW_V}.tar.gz kunde_${NEW_V}.dsc $DINST_IN/$NEWDIST
		cp kunde_${NEW_V}_new_source.changes $DINST_IN/$NEWDIST
		sleep 10
	fi
	cd kunde

	X=0
	while test $(cd $DINST_IN/$DIST; ls | grep ^kunde | wc -l) -gt 0 ; do
		X=$(($X + 1))
		if test $X = 10 ; then
			echo "dinstall läuft nicht?" >&2
			exit 1
		fi
		sleep 10
	done

	sleep 10
	X=0
	while : ; do
		sudo apt-get update || continue
		if grep-available -sVersion -n -P -X kunde /var/lib/apt/lists/_var_lib_debarchiver_dists_${DIST}_noris_source_Sources | fgrep -xsq $NEW_V
		then break ; fi
		sleep 10
		X=$(($X + 1))
		if test $X = 10 ; then
			echo "dinstall hat 'Sources' nicht neu gebaut?" >&2
			exit 1
		fi
	done
	sudo apt-get -y build-dep kunde || true
fi

if test -z "$NOTEST" ; then
	if ! make test ; then
		echo "Du willst deine Software vernünftig testen ('make test'). Schäm dich." >&2
		exit 1
	fi
fi

if test -z "$NOTEST" ; then
	env POPHOME=$POPHOME qsu/test.ticketgen
	if test $? != 0 ; then
		echo "ticketgen-Test (vorher) nicht erfolgreich!" >&2
		exit 1
	fi

	RUN1=$(sh qsu/gen_tests /usr/pop/bin qsu/tests $OLD_V /usr/share/doc/kunde)
	TEMPS="$TEMPS $RUN1"
	if test $? != 0 ; then
		echo "Testlauf 1 (vorher) nicht erfolgreich!" >&2
		cat $RUN1/err
		exit 1
	fi
fi
	

env DEB_BUILD_OPTIONS=release \
dpkg-buildpackage -rfakeroot -b -us -uc
test -z "$NEWDIST" || dpkg-genchanges -DDistribution=$NEWDIST -b > ../kunde_${NEW_V}_new_$(dpkg --print-architecture).changes

if test -z "$NOPUT"; then
	cd ..

	# 
	debsign -k$GPGKEY kunde_${NEW_V}_$(dpkg --print-architecture).changes
	test -z "$NEWDIST" || debsign -k$GPGKEY kunde_${NEW_V}_new_$(dpkg --print-architecture).changes

	dput -f local kunde_${NEW_V}_$(dpkg --print-architecture).changes
	# das _new_-Ding dputten wir etwas später

	X=0
	while test $(cd $DINST_IN/$DIST; ls | grep ^kunde | wc -l) -gt 0 ; do
		X=$(($X + 1))
		if test $X = 10 ; then
			echo "dinstall läuft nicht?" >&2
			exit 1
		fi
		sleep 10
	done
	X=0
	while test $DINSTALL/dists/$DIST/noris/binary-$(dpkg --print-architecture)/Packages -ot kunde_${NEW_V}_$(dpkg --print-architecture).changes ; do
		X=$(($X + 1))
		if test $X = 10 ; then
			echo "dinstall hat 'Packages' nicht neu gebaut?" >&2
			exit 1
		fi
		sleep 10
	done
	
	sleep 10
	X=0
	while : ; do
		sudo apt-get update || continue
#		if grep-available -sVersion -n -P -X kunde /var/lib/apt/lists/_var_lib_debarchiver_${DIST}_stable_noris_binary-i386_Packages | fgrep -xsq $NEW_V
#		then break ; fi
		if apt-cache show kunde-common | fgrep -xsq "Version: $NEW_V"
		then break ; fi
		X=$(($X + 1))
		if test $X = 10 ; then
			echo "'Packages' wurde nicht geupdatet? (2)" >&2
			exit 1
		fi
		sleep 10
	done

	#dput -f local kunde_${NEW_V}_new_$(dpkg --print-architecture).changes

	sudo /usr/local/bin/debconf_off || true
	sudo apt-get  -o 'DPkg::Options::=--force-confold' -y --force-yes install kunde-common=$NEW_V $(sed -ne 's/^Package: \(.*\)/\1='"$NEW_V/p" < kunde/debian/control | egrep -v "kunde-(32-bin|64-bin|common)=")
	trap 'set +e; test -n "$NOMAIL" && echo GESTORBEN || mail -a "X-Autoreply: no" -s "kunde $NEW_V: Problem auf QSU" entwicklung+queue=entwicklung/kunde@ticket.noris.net < $LOG; uninstall_kunde kunde; test -n "$NOCLEAN" || rm -rf $TEMPS $LOCK' 0
	sudo /usr/local/bin/debconf_on || true

	echo "# Na, das scheint ja funktioniert zu haben."
	echo "# Jetzt schauen wir mal, ob die Datenstruktur auf QSU aktuell ist."
	set +e
	$POPHOME/bin/dbdiff -q
	case $? in
		0) echo "# ... ist sie." ;;
		1) echo "# Fehler."
		   exit 1 ;;
		2) rlres="DB-Unterschiede" ;;
		*) echo "## unbekannter Exitcode $?"
		   exit 1 ;;
	esac
	set -e
	echo "# Jetzt noch der Rechnungslauf-Test..."
	echo "# TODO: sonstige Testläufe an Echtdaten?"

	RLLOG=/tmp/rllog.$$
	TEMPS="$TEMPS $RLLOG"
	exec 4>&1 5>&2 >>$RLLOG 2>&1
	set +e
	$POPHOME/bin/db.rechlauf $POPHOME/bin/gen.testrechnungsdiff
	res=$?
	set -e
	exec 1>&4 2>&5 4>&- 5>&-

	cat $RLLOG
	echo "# Ende Rechnungslauf"
	echo ""
	if fgrep -sq "*** Fehlermeldungen:" $RLLOG ; then
		echo "RL-Testlauf mit Fehlern abgebrochen" >&2
		exit 1
	elif [ $res = 0 ] ; then
		echo "RL-Testlauf OK"
		rlres="$rlres${rlres:+"; "}RL-Testlauf OK"
	else
		echo "RL-Testlauf *NICHT* OK, bitte manuell prüfen!"
		rlres="$rlres${rlres:+"; "}Rechnungslauf nicht OK: prüfen!"
	fi

	cd kunde
	trap 'set +e; test -n "$NOMAIL" && echo GESTORBEN || mail -a "X-Autoreply: no" -s "kunde $NEW_V: Problem auf QSU" entwicklung+queue=entwicklung/kunde@ticket.noris.net < $LOG; uninstall_kunde .; test -n "$NOCLEAN" || rm -rf $TEMPS $LOCK' 0

	if test -z "$NOTEST" ; then
		if ! make rrtest ; then
			echo "Du willst deine Software vernünftig testen ('make rrtest'). Schäm dich." >&2
			exit 1
		fi
	fi

	env POPHOME=$POPHOME qsu/test.ticketgen
	if test $? != 0 ; then
		echo "ticketgen-Test (nachher) nicht erfolgreich!" >&2
		exit 1
	fi

	RUN2=$(sh qsu/gen_tests /usr/pop/bin qsu/tests $OLD_V $(pwd))
	TEMPS="$TEMPS $RUN2"
	if test $? != 0 ; then
		echo "Testlauf 2 (nachher) nicht erfolgreich!" >&2
		cat $RUN2/err
		exit 1
	fi
	
	echo "Vergleiche Testläufe..."
	if ! diff -uNr $RUN1 $RUN2 ; then 
		echo "Testläufe unterschiedlich." >&2
		exit 1
	fi

else
	echo "keine Installation: RL-Test übersprungen."
	rlres="Rechnungslauf übersprungen"
fi

# fertig
if test -z "$NOTAG$NOTEST$NOGIT" ; then
	git tag -a -m "Kunde-Release, auto-getaggt" kunde_$NEW_V
	git push origin kunde_$NEW_V
fi

trap '' 0

rlres=$(perl -Mlib=$POPHOME/lib -MMIME::Words=encode_mimewords -MUTFkram=decode_anything -e "print encode_mimewords(decode_anything('$rlres'))")

if test -z "$NOMAIL" ; then
( cat <<END
From: qsu@qsu.office.noris.de
To: entwicklung+queue=entwicklung/kunde@ticket.noris.net
Subject: Kunde $NEW_V: $dest: neue Version $NEW_V gebaut
X-noris-Ticket-Info: $rlres
X-noris-Ticket-Queue: ew::kunde
X-Autoreply: no

END
  cat $LOG
) | /usr/sbin/sendmail entwicklung+queue=entwicklung/kunde@ticket.noris.net
fi

rm -rf $TEMPS $LOCK
