#!/usr/bin/env bash

set -eux

rm -rf save-dir-*
rm -rf restore-dir-*

rm -f to-be-saved/half-full
if ! ln to-be-saved/half-empty to-be-saved/half-full > /dev/null 2>&1
then
	# EG, Haiku R1 alpha 3's BFS does not support hardlinks - in fact, BFS's on-disk
	# datastructures don't allow storing hardlinks, so adding them would be an
	# extension to the filesystem, on-disk.  Frankly, I don't miss them; they're
	# too obscure.
	echo "$0: Your OS (filesystem) does not support hardlinks?" 1>&2
	exit 0
fi

hn=$(set -eu; hostname)

(find ./to-be-saved -name .svn -prune -o -type f -print0 | xargs -0 md5sum -b | sort -k 2) > to-be-saved.md5sums

for record in $(../../this-interpreter --variety all)
do
	pyver=$(echo "$record" | awk -F'%' ' { print $1 }')
	interp=$(echo "$record" | awk -F'%' ' { print $2 }')

	rm -rf save-dir-$pyver

	find to-be-saved -name .svn -prune -o -print0 | \
		"$interp" ../../backshift \
			--save-directory save-dir-"$pyver" \
			--backup \
			--hostname "$hn" \
			--subset test \
			--init-savedir

	backup_id=$(set -eu; "$interp" ../../backshift --save-directory save-dir-"$pyver" --list-backups | \
		tail -1 | \
		sed 's/ .*$//')

	rm -rf restore-dir-$"pyver"
	mkdir -p restore-dir-"$pyver"

	"$interp" ../../backshift \
		--save-directory save-dir-"$pyver" \
		--produce-tar \
		--backup-id "$backup_id" | \
		(cd restore-dir-"$pyver" && tar xvf -)

	(
		tbs=$(pwd)
		cd restore-dir-"$pyver" && \
			mv ./"$tbs"/to-be-saved .
	)

	(cd restore-dir-"$pyver" && find . -type f -print0 | xargs -0 md5sum -b | sort -k 2) > restore-dir-"$pyver".md5sums

	echo Diffing "$pyver"
	diff -C8 -b to-be-saved.md5sums restore-dir-"$pyver".md5sums

	pre_uniques=$(set -eu; find restore-dir-"$pyver"/to-be-saved -name .svn -prune -o -type f -print | ../equivs3e --skip-duplicates | sort)
	pre_duplicates=$(set -eu; find restore-dir-"$pyver"/to-be-saved -name .svn -prune -o -type f -print | ../equivs3e --skip-uniques | tr ' ' '\012' | sort)

	(
		# We add a unique line to each line.  In the the case of a 3-way hardlink, we add 3 lines.
		cd restore-dir-"$pyver"/to-be-saved
		for file in *
		do
			echo "$file" >> "$file"
		done
	)

	# Now we make sure things are still the same
	post_uniques=$(set -eu; find restore-dir-"$pyver"/to-be-saved -name .svn -prune -o -type f -print | ../equivs3e --skip-duplicates | sort)
	post_duplicates=$(set -eu; find restore-dir-"$pyver"/to-be-saved -name .svn -prune -o -type f -print | ../equivs3e --skip-uniques | tr ' ' '\012' | sort)

	if [ "$pre_uniques" != "$post_uniques" ]
	then
		(
			echo "$0: Unique files changed:"
			echo "$pre_uniques"
			echo
			echo "$post_uniques"
		)
		exit 1
	fi

	if [ "$pre_duplicates" != "$post_duplicates" ]
	then
		(
			echo "$0: Unique files changed:"
			echo "$pre_duplicates"
			echo
			echo "$post_duplicates"
		)
		exit 1
	fi

	if [ $(echo "$post_uniques" | wc -l) != 3 ]
	then
		echo "$0: Bad number of uniques" 1>&2
		exit 1
	fi

	if [ $(echo "$post_duplicates" | wc -l) != 2 ]
	then
		echo "$0: Bad number of duplicates" 1>&2
		exit 1
	fi
done