#! /bin/sh

# Run standard scripts.
t=__wt.$$
t_pfx=__s_all_tmp_
trap 'rm -f $t *.pyc __tmp __wt.* __s_all_tmp*' 0 1 2 3 13 15

# We require python which may not be installed.
type python > /dev/null 2>&1 || {
	echo 's_all: python not found'
	exit 1
}

echo 'dist/s_all run started...'

force=
reconf=0
errmode=0
errfound=0
while :
	do case "$1" in
	-A)	# Reconfigure the library build.
		reconf=1
		shift;;
	-E)	# Return an error code on failure
		errmode=1
		shift;;
	-f)	# Force versions to be updated
		force="-f"
		shift;;
	*)
		break;;
	esac
done

echo "Updating files that include the package version" &&
    sh ./s_version $force

test "$reconf" -eq 0 || {
	(echo "Rebuilding GNU tools library support" &&
	    cd ../build_posix && 2>&1 sh ./reconf | sed -e 's/^/    /')
}

errchk()
{
	if ! `test -s $2`; then
		return
	fi

	# Return if evergreen validate runs sucessfully.
	if echo "$1" | grep -q evergreen && [ "$(cat "$2")" = "../test/evergreen.yml is valid" ] ; then
		rm -f "$2"
		return
	fi

	echo "####################### MESSAGE ############################"
	echo "s_all run of: \"$1\" resulted in:"
	sed -e 's/^/    /' $2
	echo "#######################"

	# If the test was skipped, ignore the failure.
	if ! `grep "$1.*skipped" $2 > /dev/null`; then
	    errfound=1;
	fi

	rm -f $2
}

run()
{
	2>&1 $1 > $t
	errchk "$1" $t
}

# Non parallelizable scripts The following scripts either modify files or
# already parallelize internally.
run "sh ./s_readme $force"
run "sh ./s_install $force"
run "python api_config_gen.py"
run "python api_err.py"
run "python flags.py"
run "python log.py"
run "python stat.py"
run "sh ./s_copyright"
run "sh ./s_style"
run "./s_clang-format"
run "python prototypes.py"
run "sh ./s_typedef -b"
run "python test_tag.py"
if command -v evergreen > /dev/null; then
	run "evergreen validate ../test/evergreen.yml"
fi

COMMANDS="
2>&1 ./s_define > ${t_pfx}s_define
2>&1 ./s_docs > ${t_pfx}s_docs
2>&1 ./s_evergreen > ${t_pfx}s_evergreen
2>&1 ./s_export > ${t_pfx}s_export
2>&1 ./s_funcs > ${t_pfx}s_funcs
2>&1 ./s_function > ${t_pfx}s_function
2>&1 ./s_getopt > ${t_pfx}s_getopt
2>&1 ./s_lang > ${t_pfx}s_lang
2>&1 ./s_longlines > ${t_pfx}s_longlines
2>&1 ./s_python > ${t_pfx}s_python
2>&1 ./s_stat > ${t_pfx}_stat
2>&1 ./s_string > ${t_pfx}s_string
2>&1 ./s_tags > ${t_pfx}tags
2>&1 ./s_typedef -c > ${t_pfx}s_typedef_c
2>&1 ./s_visibility_checks > ${t_pfx}s_visibility_checks
2>&1 ./s_void > ${t_pfx}s_void
2>&1 ./s_whitespace > ${t_pfx}s_whitespace
2>&1 ./s_win > ${t_pfx}s_win
2>&1 python function.py > ${t_pfx}py_function
2>&1 python style.py > ${t_pfx}py_style"

# Parallelize if possible.
xp=""
echo date | xargs -P 20 >/dev/null 2>&1
if test $? -eq 0; then
	xp="-P 20"
fi
echo "$COMMANDS" | xargs $xp -I{} /bin/sh -c {}

for f in `find . -name ${t_pfx}\*`; do
	if `test -s $f`; then
		LOCAL_NAME=`basename $f`
		# Find original command and trim redirect garbage
		FAILED_CMD=`echo "$COMMANDS" | grep $LOCAL_NAME | \
		    sed -e 's/ >.*//' -e 's/.* //'`
		errchk "$FAILED_CMD" $f
	fi
done

echo 'dist/s_all run finished'
if test $errmode -ne 0; then
	exit $errfound;
fi
exit 0
