#!/bin/sh
set -e

[ -z "$SOURCE_DATE_EPOCH" ] || {
	PYTHONHASHSEED="$SOURCE_DATE_EPOCH"
	export PYTHONHASHSEED
}

process_filespec() {
	local src_dir="$1"
	local dst_dir="$2"
	local filespec="$3"
	echo "$filespec" | (
	IFS='|'
	while read fop fspec fperm; do
		local fop=`echo "$fop" | tr -d ' \t\n'`
		if [ "$fop" = "+" ]; then
			if [ ! -e "${src_dir}${fspec}" ]; then
				echo "File not found '${src_dir}${fspec}'"
				exit 1
			fi
			dpath=`dirname "$fspec"`
			if [ -z "$fperm" ]; then
				dperm=`stat -c "%a" ${src_dir}${dpath}`
			fi
			mkdir -p -m$dperm ${dst_dir}${dpath}
			echo "copying: '$fspec'"
			cp -fpR ${src_dir}${fspec} ${dst_dir}${dpath}/
			if [ -n "$fperm" ]; then
				chmod -R $fperm ${dst_dir}${fspec}
			fi
		elif [ "$fop" = "-" ]; then
			echo "removing: '$fspec'"
			rm -fR ${dst_dir}${fspec}
		elif [ "$fop" = "=" ]; then
			echo "setting permissions: '$fperm' on '$fspec'"
			chmod -R $fperm ${dst_dir}${fspec}
		fi
	done
	)
}

ver="$1"
src_dir="$2"
dst_dir="$3"
python="$4"
mode="$5"
filespec="$6"

SED="${SED:-sed -e}"

process_filespec "$src_dir" "$dst_dir" "$filespec" || {
	echo "process filespec error-ed"
	exit 1
}

usr_bin_dir="$dst_dir/usr/bin"

if [ -d "$usr_bin_dir" ] ; then
	$SED "1"'!'"b;s,^#"'!'".*python.*,#"'!'"/usr/bin/python${ver}," -i --follow-symlinks $usr_bin_dir/*
fi

if [ "$mode" == "sources" ] ; then
	# Copy only python source files
	find $dst_dir -not -type d -not -name "*\.py" | xargs rm -f

	# Delete empty folders (if the case)
	if [ -d "$dst_dir/usr" ] ; then
		find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
		rmdir --ignore-fail-on-non-empty $dst_dir/usr
	fi
	exit 0
fi

legacy=
[ "$ver" == "3" ] && legacy="-b"

# XXX [So that you won't goof as I did]
# Note: Yes, I tried to use the -O & -OO flags here.
#       However the generated byte-codes were not portable.
#       So, we just stuck to un-optimized byte-codes,
#       which is still way better/faster than running
#       Python sources all the time.
$python -m compileall $legacy -d '/' $dst_dir || {
	echo "python -m compileall err-ed"
	exit 1
}

# Delete source files and pyc [ un-optimized bytecode files ]
# We may want to make this optimization thing configurable later, but not sure atm
find $dst_dir -type f -name "*\.py" | xargs rm -f

# Delete empty folders (if the case)
if [ -d "$dst_dir/usr" ] ; then
	find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
	rmdir --ignore-fail-on-non-empty $dst_dir/usr
fi

exit 0
