#!/bin/bash

# no undefined
set -u
# no failures
set -e

CMD=
#echo

family=$1
dist=$2
arch=$3      # limit to 1 for now

dscfile=$4
dscfilef=$(readlink -f $dscfile)
dscfilef_base=${dscfilef%%.dsc}

pkg=${dscfile%_*}

#? TODO -- should be a parameter as well?

testdir=${dscfilef_base}_$arch.testrdepends.$family-$dist
secdir=${dscfilef_base}_$arch.testrdepends.$family-$dist.secure
bindir=$testdir/bin
debdir=$testdir/debs
srcdir=$testdir/srcs
oldbuildsdir=$srcdir/old
newbuildsdir=$srcdir/new

echo "I: Updating target chroot $family $dist"
$CMD nd_updatedist $family $dist $arch

mkdir -p $debdir $srcdir $bindir $secdir

echo "I: Building the new package for $pkg"
$CMD nd_build $family $dist $arch $dscfile --buildresult=$debdir

echo "I: Initiating the repository"
cd $debdir
dpkg-scanpackages . >| Packages
apt-ftparchive release . >| Release

# With GPG 2.1 things became over-complicated, require interaction with
# gpg-agent, previous options for secring are ignored, and GNUPGHOME cannot
# point to a directory somewhere deep, so we will just reuse this one
export GNUPGHOME=/root/rdepends-gpg

gpgargs=""
#--no-default-keyring --secret-keyring $secdir/keyring.sec --keyring $secdir/keyring.pub"
if [ ! -e $GNUPGHOME/trustdb.gpg ]; then
	# Generate a key to sign the Release file
	cat >| $secdir/keyring.gen <<EOF
%echo Generating a standard key
Key-Type: 1
Key-Length: 2048
Subkey-Type: 1
Subkey-Length: 2048
Name-Real: NeuroDebian Tester
Name-Comment: Temporary key
Name-Email: team@neuro.debian.net
Expire-Date: 0
# Do a commit here, so that we can later print "done" :-)
%commit
%echo done
EOF

	#gpg --batch --gen-key $secdir/keyring.gen
	gpg  --gen-key --batch --yes  --no-tty --pinentry-mode loopback --passphrase ''   $secdir/keyring.gen
	#gpg $gpgargs --list-secret-keys
fi

echo "I: signing Release file"
gpg --list-secret-keys
gpg --yes -abs -u "NeuroDebian Tester" \
    -o Release.gpg Release
pubkey=$(gpg $gpgargs -a --export -u "NeuroDebian Tester")

# All binary packages produced
# XXXX manual override since pkg was renamed etc
#pkgs="python-dicom"
pkgs=$(awk '/^Package:/{print $2;}' Packages)
cd - > /dev/null

echo "I: Fetching all bdepends for $pkgs in $family $dist under $arch"
# need first to provide the necessary scripts out there
cp -p $(dirname $0)/nd_fetch_bdepends $bindir
$CMD nd_execute $family $dist $arch --bindmounts $testdir $bindir/nd_fetch_bdepends $dist $srcdir $pkgs

echo "I: preparing the hook"
cat << EOF >| $bindir/D00add_custom_repo
echo 'deb file://$debdir ./' >| /etc/apt/sources.list.d/custom.list
echo "$pubkey" | apt-key add -
apt-get update || /bin/bash < /dev/tty > /dev/tty 2> /dev/tty
EOF
chmod a+x $bindir/D00add_custom_repo

echo "I: Going throught the packages and testing the builds"
cd $srcdir
summary_file=${testdir}.summary
echo -e "\nTesting builds against $dscfile" >> $summary_file
for dsc in *.dsc; do
	echo " I: Building $dsc with native versions"
	src=${dsc%%_*}
	dscbase=${dsc%%.dsc}
	nd_build $family $dist $arch $dsc --buildresult=$oldbuildsdir \
		&& old=ok || old=FAILED
	mv ${dscbase}_$arch.build $oldbuildsdir
	echo " I: Building $dsc with new versions"
	nd_build $family $dist $arch $dsc --buildresult=$newbuildsdir \
		--hookdir=$bindir --bindmount=$testdir \
		&& new=ok || new="FAILED $newbuildsdir/${dscbase}_$arch.build"
	mv ${dscbase}_$arch.build $newbuildsdir
	printf '%-40s\t%5s\t%5s\n' $dsc "$old" "$new" >> $summary_file
done
