#!/bin/bash
#
# Launcher script for Clojure programs. These environment variables can be
# used to configure the script:
#
#   CLOJURE_HOME
#       The root directory where Clojure is installed.
#   CLOJURE_JAVA
#       The name of the java executable used to run Clojure.
#   CLOJURE_JAVA_OPTS
#       Additional options to be passed to the java executable.
#   CLOJURE_CLASSPATH
#       A path to be added to Clojure's classpath.
#   CLOJURE_LIBRARY_PATH
#       A path to be searched for native code such as DLL's or JNI
#       libraries. This gets added to the Java options as
#       "-Djava.library.path=$CLOJURE_LIBRARY_PATH".
#   CLOJURE_LIB
#       This directory, and any jars inside it, will be automatically
#       added to Clojure's classpath.
#
#   CLOJURE_JLINE
#        This should be the path to Jline jar.
# TODO:
#   make CLOJURE_LIB a path instead of a single directory
#   allow for adding to CLOJURE_LIB from the command line

usage="\
usage: clojure [options] [file1 [file2] ...]

Options:
  --help, -h          show this message
  --java-cmd, -J      the Java executable to use
  --java-opts, -j     add options to be passed on to the JVM
  --classpath, -cp    add to Clojure's classpath
  --library-path, -L  add to the path to search for native libraries
  --verbose, -v       print initialization information
"
## read ~/.clojurerc for home configuration
[ -e ~/.clojurerc ] && . ~/.clojurerc

## read ./.clojurerc for project specific configuration
[ -e ./.clojurerc ] && . ./.clojurerc

if [ ! "$CLOJURE_HOME" ]; then
    # Find the real path to Clojure's home directory if $0 is a symlink
    #program="$0"
    #while [ -h "$program" ]; do
    #    ls=`ls -ld "$program"`
    #    link=`expr "$ls" : '.*-> \(.*\)$'`
    #    if expr "$link" : '.*/.*' >/dev/null; then
    #        program="$link"
    #    else
    #        program="`dirname $program`/$link"
    #    fi
    #done
    #script_dir=`dirname "$program"`
    #relative_clojure_home=`dirname "$script_dir"`
    #CLOJURE_HOME=`cd "$relative_clojure_home" && pwd`
    . /etc/profile.d/clojure.sh
fi

if [ ! "$CLOJURE_JAVA" ]; then
    CLOJURE_JAVA="java";
fi

if [ ! "$CLOJURE_JAVA_OPTS" ]; then
    CLOJURE_JAVA_OPTS="-Dpid=$$"; # set the pid for SLIME
fi

if [ ! "$CLOJURE_CLASSPATH" ]; then
    CLOJURE_CLASSPATH=".:/usr/share/java/asm-all-4.jar"
fi

##  Add Clojure home jars.
for jar in "$CLOJURE_HOME"/*.jar; do
    CLOJURE_CLASSPATH="$CLOJURE_CLASSPATH:$jar"
done

if [ -d "$CLOJURE_LIB" ]; then
    CLOJURE_CLASSPATH="$CLOJURE_CLASSPATH:$CLOJURE_LIB"
    for jar in "$CLOJURE_LIB"/*.jar; do
        CLOJURE_CLASSPATH="$CLOJURE_CLASSPATH:$jar"
    done
fi

# this is now the same for both the repl and for scripts
main="clojure.main"
repl=0
verbose=0

while true; do
    case $1 in
        -h|--help)
            echo "$usage"; exit 1;;
        -J|--java-cmd)
            CLOJURE_JAVA="$2"; shift; shift;;
        -j|--java-opts)
            CLOJURE_JAVA_OPTS="$CLOJURE_JAVA_OPTS $2"; shift; shift;;
        -cp|--classpath)
            CLOJURE_CLASSPATH="$CLOJURE_CLASSPATH:$2"; shift; shift;;
        -L|--library-path)
            if [ "$CLOJURE_LIBRARY_PATH" ]; then
                CLOJURE_LIBRARY_PATH="$CLOJURE_LIBRARY_PATH:$2";
            else
                CLOJURE_LIBRARY_PATH="$2";
            fi
            shift; shift;;
	-v|--verbose)
	    verbose=1; shift;;
        *) break;;
    esac
done

[ $verbose -eq 1 ] && echo "$CLOJURE_CLASSPATH"

# If we didn't get any files to load on the commandline, we want to run the
# repl, with command line editing if available.
[ $# -eq 0 ] && repl=1

# If the classpath contains the JLine jar, use the JLine console runner
if expr "$CLOJURE_CLASSPATH" : ".*jline.*\.jar" >/dev/null; then
    [ $repl -eq 1 ] && jline="jline.ConsoleRunner"
fi

# Enable rlwrap if present
if [ $repl -eq 1 ] && [ -z $jline ]; then
    rlwrap=`type -p rlwrap`
fi

## Add CLOJURE_LIBRARY_PATH to the Java options if necessary
if [ -n "$CLOJURE_LIBRARY_PATH" ]; then
    CLOJURE_JAVA_OPTS="$CLOJURE_JAVA_OPTS -Djava.library.path=$CLOJURE_LIBRARY_PATH"
fi

cmd=`echo $rlwrap "$CLOJURE_JAVA" "$CLOJURE_JAVA_OPTS" -cp "$CLOJURE_CLASSPATH" $jline $main`
[ $verbose -eq 1 ] && echo "$cmd" "$@"
exec `echo $cmd` "$@"