#!/bin/sh
set -eu

usage() {
	cat <<-'EOF'
		Usage:
		  without-env ENVVAR PATH COMMAND...
		  without-env -h
	EOF
}

help() {
	cat <<-'EOF'


		Options:
		  -h, --help    show this message

		  ENVVAR        the name of the environment variable to be modifed
		  PATH          section to be excluded from ENVVAR
		  COMMAND       command to be wrapped


		Execute COMMAND, but changing the variable ENVVAR by excluding
		PATH from it.


		Examples:

		  Execute "command -V" filtering ~/bin, to get where "w3m" is
		  in $PATH, other than ~/bin:

		    $ without-env PATH ~/bin -- command -v w3m


		  Compile foo.c, excluding ~/.local/include
		  from $C_INCLUDE_PATH:

		    $ without-env C_INCLUDE_PATH ~/.local/include -- cc -co foo.o foo.c
	EOF
}

for flag in "$@"; do
	case "$flag" in
		(--)
			break
			;;
		(--help)
			usage
			help
			exit
			;;
		(*)
			;;
	esac
done

while getopts 'h' flag; do
	case "$flag" in
		(h)
			usage
			help
			exit
			;;
		(*)
			usage >&2
			exit 2
			;;
	esac
done
shift $((OPTIND - 1))

eval "$(assert-arg -- "${1:-}" 'ENVVAR')"
eval "$(assert-arg -- "${2:-}" 'PATH')"

eval "export $1=\"\$(echo \"\$$1\" | sed \"s|\$2||g\")\""
shift # drop $1
shift # drop $2
if [ "${1:-}" = '--' ]; then
	shift # drop --
fi

"$@"
