#!/bin/bash

set -e
set -x

cd /builds/worker

mkdir a b

# Until https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=879010 is
# implemented, it's better to first manually extract the data.
# Plus dmg files are not supported yet.

case "$ORIG_URL" in
*/target.zip|*/target.apk)
	curl -L "$ORIG_URL" > a.zip
	curl -L "$NEW_URL" > b.zip
	unzip -d a a.zip
	unzip -d b b.zip
	;;
*/target.tar.bz2)
	curl -L "$ORIG_URL" | tar -C a -jxf -
	curl -L "$NEW_URL" | tar -C b -jxf -
	;;
*/target.dmg)
	for tool in lipo otool; do
		ln -s $MOZ_FETCHES_DIR/cctools/bin/x86_64-apple-darwin*-$tool bin/$tool
	done
	export PATH=$PATH:/builds/worker/bin
	curl -L "$ORIG_URL" > a.dmg
	curl -L "$NEW_URL" > b.dmg
	for i in a b; do
		$MOZ_FETCHES_DIR/dmg/dmg extract $i.dmg $i.hfs
		$MOZ_FETCHES_DIR/dmg/hfsplus $i.hfs extractall / $i
	done
	;;
*)
	ARTIFACT=$(basename "${ORIG_URL}")
	curl -L "$ORIG_URL" > "a/${ARTIFACT}"
	curl -L "$NEW_URL" > "b/${ARTIFACT}"
esac

case "$ORIG_URL" in
*/target.apk)
	OMNIJAR=assets/omni.ja
	;;
*)
	OMNIJAR=omni.ja
	;;
esac

report_error() {
	# We "parse" the diff output, so we look at the lines that contain a "tee", like:
	# ├── firefox
	# │ ├── libxul.so
	# │ │ ├── readelf --wide --notes {}
	# We ignore lines like the last one, to only report file names. And we ignore
	# lines for directories such as the first one, but still look at them to report
	# full paths.
	python3 <<-EOF
		TEE = '├──'
		paths = set()
		path = []
		with open("$1.txt") as fh:
		    for l in fh:
		        if TEE not in l:
		            continue
		        fields = l.split()
		        # We rely on the number of │ to figure out at what level the file
		        # name applies.
		        if fields[-2:-1] == [TEE]:
		            path[len(fields) - 2:] = [fields[-1]]
		        else:
		            # Align path length to match the number of │
		            path.append(None)
		        path_ = [p for p in path if p]
		        full_path = '/'.join(path_)
		        parent_path = '/'.join(path_[:-1])
		        if parent_path in paths:
		            paths.remove(parent_path)
		        if full_path:
		            paths.add(full_path)

		for p in sorted(paths):
		    print('TEST-UNEXPECTED-FAIL | {} differs. See the $1.html or $1.txt artifact'.format(p))
	EOF
}

# Builds are 99% of the time differing in some small ways, so it's not
# really useful to report a failure (at least not until we actually
# care about the builds being 100% identical).
POST=true

fail() {
	exit 1
}

for option; do
	case "$option" in
	--unpack)
		CURDIR=$PWD
		for dir in a b; do
			# Need to run mach python from inside the gecko source.
			# See bug #1533642.
			(cd $GECKO_PATH && ./mach python --no-virtualenv toolkit/mozapps/installer/unpack.py --omnijar $OMNIJAR $CURDIR/$dir)
		done
		;;
	--fail)
		POST="fail"
		;;
	*)
		echo "Unsupported option: $option" >&2
		exit 1
	esac
done

if [ -n "$PRE_DIFF" ]; then
	eval $PRE_DIFF
fi

if diffoscope \
	--html diff.html \
	--text diff.txt \
	--progress \
	$DIFFOSCOPE_ARGS \
	a b
then
	# Ok
	:
else
	report_error diff
	$POST
fi
