Skip to content

Instantly share code, notes, and snippets.

@kirillkh
Created July 30, 2015 22:35
Show Gist options
  • Save kirillkh/a9ba2e00ef2e901f13bf to your computer and use it in GitHub Desktop.
Save kirillkh/a9ba2e00ef2e901f13bf to your computer and use it in GitHub Desktop.

Revisions

  1. kirillkh created this gist Jul 30, 2015.
    222 changes: 222 additions & 0 deletions scala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,222 @@
    #!/usr/bin/env bash
    #
    ##############################################################################
    # Copyright 2002-2013 LAMP/EPFL
    #
    # This is free software; see the distribution for copying conditions.
    # There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    # PARTICULAR PURPOSE.
    ##############################################################################

    findScalaHome () {
    # see SI-2092 and SI-5792
    local source="${BASH_SOURCE[0]}"
    while [ -h "$source" ] ; do
    local linked="$(readlink "$source")"
    local dir="$( cd -P $(dirname "$source") && cd -P $(dirname "$linked") && pwd )"
    source="$dir/$(basename "$linked")"
    done
    ( cd -P "$(dirname "$source")/.." && pwd )
    }
    execCommand () {
    [[ -n $SCALA_RUNNER_DEBUG ]] && echo "" && for arg in "$@"; do echo "$arg"; done && echo "";
    "$@"
    }

    # Not sure what the right default is here: trying nonzero.
    scala_exit_status=127
    saved_stty=""

    # restore stty settings (echo in particular)
    function restoreSttySettings() {
    if [[ -n $SCALA_RUNNER_DEBUG ]]; then
    echo "restoring stty:"
    echo "$saved_stty"
    fi

    stty $saved_stty
    saved_stty=""
    }

    function onExit() {
    [[ "$saved_stty" != "" ]] && restoreSttySettings
    exit $scala_exit_status
    }

    # to reenable echo if we are interrupted before completing.
    trap onExit INT

    # save terminal settings
    saved_stty=$(stty -g 2>/dev/null)
    # clear on error so we don't later try to restore them
    if [[ ! $? ]]; then
    saved_stty=""
    fi
    if [[ -n $SCALA_RUNNER_DEBUG ]]; then
    echo "saved stty:"
    echo "$saved_stty"
    fi

    unset cygwin
    if uname | grep -q ^CYGWIN; then
    cygwin="$(uname)"
    fi

    unset mingw
    if uname | grep -q ^MINGW; then
    mingw="$(uname)"
    fi

    unset msys
    if uname | grep -q ^MSYS; then
    msys="$(uname)"
    fi

    # Finding the root folder for this Scala distribution
    SCALA_HOME="$(findScalaHome)"
    SEP=":"

    # Possible additional command line options
    WINDOWS_OPT=""
    EMACS_OPT="-Denv.emacs=$EMACS"

    # Remove spaces from SCALA_HOME on windows
    if [[ -n "$cygwin" ]]; then
    SCALA_HOME="$(shome="$(cygpath --windows --short-name "$SCALA_HOME")" ; cygpath --unix "$shome")"
    # elif uname |grep -q ^MINGW; then
    # SEP=";"
    fi

    # Constructing the extension classpath
    TOOL_CLASSPATH=""
    if [[ -z "$TOOL_CLASSPATH" ]]; then
    for ext in "$SCALA_HOME"/lib/* ; do
    file_extension="${ext##*.}"
    # SI-8967 Only consider directories and files named '*.jar'
    if [[ -d "$ext" || $file_extension == "jar" ]]; then
    if [[ -z "$TOOL_CLASSPATH" ]]; then
    TOOL_CLASSPATH="$ext"
    else
    TOOL_CLASSPATH="${TOOL_CLASSPATH}${SEP}${ext}"
    fi
    fi
    done
    fi

    if [[ -n "$cygwin" ]]; then
    if [[ "$OS" = "Windows_NT" ]] && cygpath -m .>/dev/null 2>/dev/null ; then
    format=mixed
    else
    format=windows
    fi
    SCALA_HOME="$(cygpath --$format "$SCALA_HOME")"
    if [[ -n "$JAVA_HOME" ]]; then
    JAVA_HOME="$(cygpath --$format "$JAVA_HOME")"
    fi
    TOOL_CLASSPATH="$(cygpath --path --$format "$TOOL_CLASSPATH")"
    fi

    if [[ -n "$cygwin$mingw$msys" ]]; then
    case "$TERM" in
    rxvt* | xterm*)
    stty -icanon min 1 -echo
    WINDOWS_OPT="-Djline.terminal=unix"
    ;;
    esac
    fi

    [[ -n "$JAVA_OPTS" ]] || JAVA_OPTS="-Xmx256M -Xms32M"

    # break out -D and -J options and add them to JAVA_OPTS as well
    # so they reach the underlying JVM in time to do some good. The
    # -D options will be available as system properties.
    declare -a java_args
    declare -a scala_args

    # SI-8358, SI-8368 -- the default should really be false,
    # but I don't want to flip the default during 2.11's RC cycle
    OVERRIDE_USEJAVACP="-Dscala.usejavacp=true"

    while [[ $# -gt 0 ]]; do
    case "$1" in
    -D*)
    # pass to scala as well: otherwise we lose it sometimes when we
    # need it, e.g. communicating with a server compiler.
    java_args+=("$1")
    scala_args+=("$1")
    # respect user-supplied -Dscala.usejavacp
    case "$1" in -Dscala.usejavacp*) OVERRIDE_USEJAVACP="";; esac
    shift
    ;;
    -J*)
    # as with -D, pass to scala even though it will almost
    # never be used.
    java_args+=("${1:2}")
    scala_args+=("$1")
    shift
    ;;
    -toolcp)
    TOOL_CLASSPATH="${TOOL_CLASSPATH}${SEP}${2}"
    shift 2
    ;;
    -nobootcp)
    unset usebootcp
    shift
    ;;
    -usebootcp)
    usebootcp="true"
    shift
    ;;
    -debug)
    SCALA_RUNNER_DEBUG=1
    shift
    ;;
    *)
    scala_args+=("$1")
    shift
    ;;
    esac
    done

    # reset "$@" to the remaining args
    set -- "${scala_args[@]}"

    if [[ -z "$JAVACMD" && -n "$JAVA_HOME" && -x "$JAVA_HOME/bin/java" ]]; then
    JAVACMD="$JAVA_HOME/bin/java"
    fi

    declare -a classpath_args

    # default to the boot classpath for speed, except on cygwin/mingw/msys because
    # JLine on Windows requires a custom DLL to be loaded.
    unset usebootcp
    if [[ -z "$cygwin$mingw$msys" ]]; then
    usebootcp="true"
    fi

    # If using the boot classpath, also pass an empty classpath
    # to java to suppress "." from materializing.
    if [[ -n $usebootcp ]]; then
    classpath_args=("-Xbootclasspath/a:$TOOL_CLASSPATH" -classpath "\"\"")
    else
    classpath_args=(-classpath "$TOOL_CLASSPATH")
    fi

    # note that variables which may intentionally be empty must not
    # be quoted: otherwise an empty string will appear as a command line
    # argument, and java will think that is the program to run.
    execCommand \
    "${JAVACMD:=java}" \
    $JAVA_OPTS \
    "${java_args[@]}" \
    "${classpath_args[@]}" \
    -Dscala.home="$SCALA_HOME" \
    $OVERRIDE_USEJAVACP \
    "$EMACS_OPT" \
    $WINDOWS_OPT \
    scala.tools.nsc.MainGenericRunner "$@"

    # record the exit status lest it be overwritten:
    # then reenable echo and propagate the code.
    scala_exit_status=$?
    onExit