#

exec 2>&1
set -x

root=`pwd`
troot=$root/tests
testname="${0##*/}"

tmp=$ADTTMP
if [ x"$tmp" = x ]; then
	mkdir -p tests/tmp
	tmp=tests/tmp/$testname
	rm -rf $tmp
	mkdir $tmp
fi
cd $tmp
tmp=`pwd`
export DGIT_TEST_DUMMY_DIR=$tmp
ln $troot/ssh ssh

mkdir $tmp/gnupg
cp $troot/gnupg/* $tmp/gnupg
chmod go-rw $tmp/gnupg/*
export GNUPGHOME=$tmp/gnupg

mkdir $tmp/incoming
cat <<END >$tmp/dput.cf
[test-dummy]
method			= local
incoming		= $tmp/incoming
run_dinstall		= 0
END

fail () {
	echo >&2 "failed: $*"
	exit 1
}

t-worktree () {
	rm -rf $p
	tar xf $troot/worktrees/${p}_$1.tar
}

t-git () {
	p=$1
	v=$2
	mkdir -p $tmp/git
	(set -e; cd $tmp/git; tar xf $troot/git-srcs/${p}_$v.git.tar)
}

t-git-none () {
	mkdir -p $tmp/git
	(set -e; cd $tmp/git; tar xf $troot/git-template.tar)
}

t-has-ancestor () {
	local now=`git rev-parse HEAD`
	local ancestor=`git rev-parse $1^{}`
	local mbase=`git merge-base $ancestor $now`
	if [ x$mbase != x$ancestor ]; then
		fail "not ff $ancestor..$now, $mbase != $ancestor"
	fi
}	

t-archive-none () {
	p=$1
	mkdir -p $tmp/aq $tmp/mirror
	echo sid >$tmp/aq/suite.unstable
}

t-archive () {
	t-archive-none $1
	v=$2
	local dscf=${p}_$2.dsc
	rm -f $tmp/mirror/${p}_*
	ln $troot/pkg-srcs/${p}_${2%-*}* $tmp/mirror/
	echo "$2 $dscf" >>$tmp/aq/package.sid.${p}
	rm -rf $tmp/extract
	mkdir $tmp/extract
	(set -e; cd $tmp/extract; dpkg-source -x ../mirror/$dscf)
}

t-dgit () {
	: '{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{'
	${DGIT_TEST-dgit} --dget:-u --dput:--config=$tmp/dput.cf \
		-dtest-dummy -D -k39B13D8A "$@"
	: '}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}'
}

t-diff-nogit () {
	diff --exclude=.git -ruN $*
}

t-cloned-fetched-good () {
	t-diff-nogit ../extract/$p-${v%-*} .
	t-clean-on-branch dgit/sid
	t-refs-same-start
	t-refs-same \
		refs/heads/dgit/sid \
		refs/remotes/dgit/dgit/sid
	t-refs-notexist dgit/unstable remotes/dgit/dgit/unstable
}

t-output () {
	printf "%s\n" "$1" >$tmp/t.want
	shift
	"$@" >$tmp/t.got
	diff $tmp/t.want $tmp/t.got
}

t-clean-on-branch () {
	t-output "## $1" git status -b --porcelain
}

t-git-get-ref () {
	local ref=$1
	git show-ref -d $1 | perl -ne '
		$x = $1 if m#^(\w+) \Q'$1'\E(?:\^\{\})?$#;
		END { print "$x\n" if length $x; }
	'
}

t-ref-same () {
	local name="$1"
	local val=`t-git-get-ref $name`
	t-ref-same-val "$name" $val
}

t-ref-head () {
	local val=`git rev-parse HEAD`
	t-ref-same-val HEAD $val
}

t-ref-same-val () {
	local name="$1"
	local val=$2
	case "$t_ref_val" in
	'')		;;
	"$val")		;;
	*)		fail "ref varies: $name: $val != $t_ref_val" ;;
	esac
	t_ref_val="$val"
}

t-refs-same-start () {
	t_ref_val=''
}

t-refs-same () {
	local g
	for g in $*; do
		t-ref-same $g
	done
}

t-refs-notexist () {
	local val
	for g in $*; do
		val=`t-git-get-ref $g >$tmp/t.refx`
		if [ "x$val" != x ]; then
			fail "ref $g unexpectedly exists ($val)"
		fi
	done
}

t-v-tag () {
	echo refs/tags/debian/${v//\~/_}
}

t-pushed-good () {
	local branch=$1
	t-ref-dsc-dgit
	t-refs-same \
		refs/heads/$branch \
		`t-v-tag` \
		refs/remotes/dgit/dgit/sid
	t-refs-notexist \
		refs/heads/dgit/unstable \
		refs/remotes/dgit/dgit/unstable
	(set -e; cd $tmp/git/$p.git
	 t-refs-same \
		refs/dgit/sid \
		`t-v-tag`
	 t-refs-notexist \
		refs/dgit/unstable
	)
	git verify-tag `t-v-tag`
}

t-822-field () {
	local file=$1
	local field=$2
	perl -e '
		use Dpkg::Control::Hash;
		my $h = new Dpkg::Control::Hash allow_pgp=>1;
		$h->parse(\*STDIN,"'"$file"'");
		my $val = $h->{"'$field'"},"\n";
		die "'"$file $field"'" unless defined $val;
		print $val,"\n";
	' <$file
}

t-ref-dsc-dgit () {
	local dsc=${p}_${v}.dsc
	local val=`t-822-field $tmp/incoming/$dsc Dgit`
	perl -e '$_=shift @ARGV; die "$dsc Dgit $_ ?" unless m/^\w+\b/;' "$val"
	t-ref-same-val $dsc "$val"
}

t-apply-diff () {
	local v1=$1
	local v2=$2
	(cd $troot/pkg-srcs; debdiff ${p}_${v1}.dsc ${p}_${v2}.dsc) \
		| patch -p1 -u
}
