#! /mit/gnu/bin/bash -norc
#
# add <addargs> <-a attachargs> <lockername> <lockername> ...
#
#       -v      verbose
#       -v0     verbose w/o debugging
#       -d      debugging
#       -n      specify new attach behavior
#       -f      add lockers to the front of the path
#	-r	remove lockers from path
#       -p      print path environment filtered
#       -w      give warning for adds with no bindirs (currently unimplemented)
#       -e      perform operations for the .environment file (changing
#                 $athena_path, $athena_manpath instead of $PATH, etc.)
#       -a      pass further options to attach
#	-l	flush added volumes
#	-s	safer: move . to end of $PATH.
#
# alias add 'source ~/add.sh'

add_vars="add_oldOPTIND add_oldOPTARG add_opt add_badopt add_verbose" 
add_vars="$add_vars add_verb2 add_debug add_new add_front add_print add_warn"
add_vars="$add_vars add_env add_dirs add_bin add_man add_d add_path add_pend"
add_vars="$add_vars add_manpath add_d2 add_oldIFS add_flush add_safer"
add_vars="$add_vars add_remove add_notremoved"
for add_x in $add_vars; do
    unset $add_x
done

add_pend=append

if [ $# -eq 0 ]; then
    add_print=1;
else
    if [ "${OPTIND+x}" = x ]; then
	add_oldOPTIND=$OPTIND
    fi
    if [ "${OPTARG+x}" = x ]; then
	add_oldOPTARG=$OPTARG
    fi
    unset OPTIND OPTARG
    while getopts "v0dnfpwelsra:" add_opt; do
	case "$add_opt" in 
	    \?) add_badopt=1; break ;;
	    v) add_verbose=1; add_verb2=1 ;;
	    0) unset add_verb2 ;;
	    d) add_debug=1 ;;
	    n) add_new=1 ;;
	    f) add_front=1; add_pend=prepend ;;
	    p) add_print=1 ;;
	    w) add_warn=1 ;;
	    e) add_env=1 ;;
	    l) add_flush=1 ;;
	    s) add_safer=1 ;;
	    r) add_remove=1 ;;
	    a) break ;;
	esac
    done
    shift $[$OPTIND-1]
fi

if [ -n "$add_badopt" ]; then
    echo "Usage: add [-v[0]dnfpwelsr] [-a attachflags] [lockername]..."
else
    if [ -n "$add_verb2" -a -z "$add_new" ]; then
	add_debug=1
    fi
    if [ -n "$add_print" ]; then
#	echo $PATH | sed -e "s-/mit/\([^/]*\)/${add_bindir}-{add \1}-g" \
#			 -e "s-/mit/\([^/]*\)/$bindir-{add \1}-g"
	add_oldIFS="$IFS"
	IFS="$IFS:"
	for add_d in $PATH; do
	    case $add_d in 
		/mit/*/*)
		    add_d2=`expr $add_d ':' '/mit/\([^/]*\)'`
		    if [ "$add_d" = "`athdir /mit/$add_d2 bin`" ]; then
			echo -n "{add $add_d2}:"
		    else
			echo -n "$add_d:"
		    fi;;
		*)
		    echo -n "$add_d:" ;;
	    esac
	done
	IFS="$add_oldIFS"
	echo
    else
	if [ -n "$add_new" ]; then
	    if [ -n "$add_verbose" ]; then
		attach "$@"
		add_dirs="$(attach -h -p $@ || attach -h -n -p $@)"
	    else
		add_dirs="$(attach -p $@ || attach -n -p $@)"
	    fi
	else
	    if [ -n "$add_verbose" ]; then
		attach -n -h "$@"
	    fi
	    add_dirs="$(attach -p $@ || attach -n -p $@)"
	fi
	if [ -z "$add_env" ]; then
	    add_path="$PATH"
	    add_manpath="$MANPATH"
	else
	    add_path="$athena_path"
	    add_manpath="$athena_manpath"
	fi

	if [ -n "$add_flush" ]; then
	    for add_d in $add_dirs; do
		fs flushv "$add_d/"
	    done
	fi

# Grr.  The add_env test interacts poorly with my dotfiles.
#	if [ -z "$add_env" -a -n "$add_front$add_remove" ]; then
	if [ -n "$add_front$add_remove" ]; then
	    # This isn't quite right.  Oh well.
	    for add_bin in `athdir -t bin -p $add_dirs`; do
		unset add_notremoved
		case "$add_path" in
		    *":$add_bin") add_path="${add_path%:$add_bin}" ;;
		    "$add_bin:"*) add_path="${add_path#$add_bin:}" ;;
		    *":$add_bin:"*)
			add_path="${add_path%:$add_bin:*}:${add_path#*:$add_bin:}"
			;;
		    *) add_notremoved=1
		esac
		if [ -n "$add_debug" -a -z "$add_notremoved" ]; then
		    echo "$add_bin" removed from path.
		fi
	    done
	    for add_man in `athdir -t man -p $add_dirs`; do
		unset add_notremoved
		case "$add_manpath" in
		    *":$add_man") add_manpath="${add_manpath%:$add_man}" ;;
		    "$add_man:"*) add_manpath="${add_manpath#:$add_man}" ;;
		    *":$add_man:"*)
			add_manpath="${add_manpath%:$add_man:*}:${add_manpath#*:$add_man:}"
			;;
		    *) add_notremoved=1
		esac
		if [ -n "$add_debug" -a -z "$add_notremoved" ]; then
		    echo "$add_man" removed from manpath.
		fi
	    done
	fi

	if [ -z "$add_remove" ]; then
	    for add_bin in `athdir -t bin -p $add_dirs`; do
		case ":$add_path:" in 
		    *":$add_bin:"*) ;;
		    *)
			if [ -n "$add_debug" ]; then
			    echo $add_bin ${add_pend}ed to path
			fi
			if [ -z "$add_front" ]; then
				add_path="$add_path:$add_bin"
			else
			    add_path="$add_bin:$add_path"
			fi
			;;
		esac
	    done
	    
	    for add_man in `athdir -t man -p $add_dirs`; do
		case ":$add_manpath:" in 
		    *":$add_man:"*) ;;
		    *)
			if [ -n "$add_debug" ]; then
			    echo $add_man ${add_pend}ed to manpath
			fi
			if [ -z "$add_front" ]; then
				add_manpath="$add_manpath:$add_man"
			else
			    add_manpath="$add_man:$add_manpath"
			fi
			;;
		esac
	    done
	fi


	if [ -z "$add_env" ]; then
	    PATH="$add_path"
	    MANPATH="$add_manpath"
	    if [ -z "$add_front" -a -n "$add_safer" ] && \
	      echo $PATH | fgrep -q :.:; then
	        PATH=$(echo $PATH | sed -e 's/:\.:/:/'):.
	    fi
	else
	    athena_path="$add_path"
	    athena_manpath="$add_manpath"
	fi
    fi
fi

if [ "${add_oldOPTIND+x}" = x ]; then
    OPTIND=$add_oldOPTIND
fi
if [ "${add_oldOPTARG+x}" = x ]; then
    OPTARG=$add_oldOPTARG
fi

for add_x in $add_vars; do
    unset $add_x
done
unset add_x add_vars
