123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- #!/usr/bin/env bash
- # Ensure this file is executable via `chmod a+x lein`, then place it
- # somewhere on your $PATH, like ~/bin. The rest of Leiningen will be
- # installed upon first run into the ~/.lein/self-installs directory.
- export LEIN_VERSION="2.8.1"
- case $LEIN_VERSION in
- *SNAPSHOT) SNAPSHOT="YES" ;;
- *) SNAPSHOT="NO" ;;
- esac
- if [[ "$CLASSPATH" != "" ]]; then
- echo "WARNING: You have \$CLASSPATH set, probably by accident."
- echo "It is strongly recommended to unset this before proceeding."
- fi
- if [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]]; then
- delimiter=";"
- else
- delimiter=":"
- fi
- if [[ "$OSTYPE" == "cygwin" ]]; then
- cygwin=true
- else
- cygwin=false
- fi
- function command_not_found {
- >&2 echo "Leiningen couldn't find $1 in your \$PATH ($PATH), which is required."
- exit 1
- }
- function make_native_path {
- # ensure we have native paths
- if $cygwin && [[ "$1" == /* ]]; then
- echo -n "$(cygpath -wp "$1")"
- elif [[ "$OSTYPE" == "msys" && "$1" == /?/* ]]; then
- echo -n "$(sh -c "(cd $1 2</dev/null && pwd -W) || echo $1 | sed 's/^\\/\([a-z]\)/\\1:/g'")"
- else
- echo -n "$1"
- fi
- }
- # usage : add_path PATH_VAR [PATH]...
- function add_path {
- local path_var="$1"
- shift
- while [ -n "$1" ];do
- # http://bashify.com/?Useful_Techniques:Indirect_Variables:Indirect_Assignment
- if [[ -z ${!path_var} ]]; then
- export ${path_var}="$(make_native_path "$1")"
- else
- export ${path_var}="${!path_var}${delimiter}$(make_native_path "$1")"
- fi
- shift
- done
- }
- function download_failed_message {
- echo "Failed to download $1 (exit code $2)"
- echo "It's possible your HTTP client's certificate store does not have the"
- echo "correct certificate authority needed. This is often caused by an"
- echo "out-of-date version of libssl. It's also possible that you're behind a"
- echo "firewall and haven't set HTTP_PROXY and HTTPS_PROXY."
- }
- function self_install {
- if [ -r "$LEIN_JAR" ]; then
- echo "The self-install jar already exists at $LEIN_JAR."
- echo "If you wish to re-download, delete it and rerun \"$0 self-install\"."
- exit 1
- fi
- echo "Downloading Leiningen to $LEIN_JAR now..."
- mkdir -p "$(dirname "$LEIN_JAR")"
- LEIN_URL="https://github.com/technomancy/leiningen/releases/download/$LEIN_VERSION/leiningen-$LEIN_VERSION-standalone.zip"
- $HTTP_CLIENT "$LEIN_JAR.pending" "$LEIN_URL"
- local exit_code=$?
- if [ $exit_code == 0 ]; then
- # TODO: checksum
- mv -f "$LEIN_JAR.pending" "$LEIN_JAR"
- else
- rm "$LEIN_JAR.pending" 2> /dev/null
- download_failed_message "$LEIN_URL" "$exit_code"
- exit 1
- fi
- }
- NOT_FOUND=1
- ORIGINAL_PWD="$PWD"
- while [ ! -r "$PWD/project.clj" ] && [ "$PWD" != "/" ] && [ $NOT_FOUND -ne 0 ]
- do
- cd ..
- if [ "$(dirname "$PWD")" = "/" ]; then
- NOT_FOUND=0
- cd "$ORIGINAL_PWD"
- fi
- done
- export LEIN_HOME="${LEIN_HOME:-"$HOME/.lein"}"
- for f in "/etc/leinrc" "$LEIN_HOME/leinrc" ".leinrc"; do
- if [ -e "$f" ]; then
- source "$f"
- fi
- done
- if $cygwin; then
- export LEIN_HOME=$(cygpath -w "$LEIN_HOME")
- fi
- LEIN_JAR="$LEIN_HOME/self-installs/leiningen-$LEIN_VERSION-standalone.jar"
- # normalize $0 on certain BSDs
- if [ "$(dirname "$0")" = "." ]; then
- SCRIPT="$(which "$(basename "$0")")"
- if [ -z "$SCRIPT" ]; then
- SCRIPT="$0"
- fi
- else
- SCRIPT="$0"
- fi
- # resolve symlinks to the script itself portably
- while [ -h "$SCRIPT" ] ; do
- ls=$(ls -ld "$SCRIPT")
- link=$(expr "$ls" : '.*-> \(.*\)$')
- if expr "$link" : '/.*' > /dev/null; then
- SCRIPT="$link"
- else
- SCRIPT="$(dirname "$SCRIPT"$)/$link"
- fi
- done
- BIN_DIR="$(dirname "$SCRIPT")"
- export LEIN_JVM_OPTS="${LEIN_JVM_OPTS-"-Xverify:none -XX:+TieredCompilation -XX:TieredStopAtLevel=1"}"
- # This needs to be defined before we call HTTP_CLIENT below
- if [ "$HTTP_CLIENT" = "" ]; then
- if type -p curl >/dev/null 2>&1; then
- if [ "$https_proxy" != "" ]; then
- CURL_PROXY="-x $https_proxy"
- fi
- HTTP_CLIENT="curl $CURL_PROXY -f -L -o"
- else
- HTTP_CLIENT="wget -O"
- fi
- fi
- # When :eval-in :classloader we need more memory
- grep -E -q '^\s*:eval-in\s+:classloader\s*$' project.clj 2> /dev/null && \
- export LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Xms64m -Xmx512m"
- if [ -r "$BIN_DIR/../src/leiningen/version.clj" ]; then
- # Running from source checkout
- LEIN_DIR="$(dirname "$BIN_DIR")"
- # Need to use lein release to bootstrap the leiningen-core library (for aether)
- if [ ! -r "$LEIN_DIR/leiningen-core/.lein-bootstrap" ]; then
- echo "Leiningen is missing its dependencies."
- echo "Please run \"lein bootstrap\" in the leiningen-core/ directory"
- echo "with a stable release of Leiningen. See CONTRIBUTING.md for details."
- exit 1
- fi
- # If project.clj for lein or leiningen-core changes, we must recalculate
- LAST_PROJECT_CHECKSUM=$(cat "$LEIN_DIR/.lein-project-checksum" 2> /dev/null)
- PROJECT_CHECKSUM=$(sum "$LEIN_DIR/project.clj" "$LEIN_DIR/leiningen-core/project.clj")
- if [ "$PROJECT_CHECKSUM" != "$LAST_PROJECT_CHECKSUM" ]; then
- if [ -r "$LEIN_DIR/.lein-classpath" ]; then
- rm "$LEIN_DIR/.lein-classpath"
- fi
- fi
- # Use bin/lein to calculate its own classpath.
- if [ ! -r "$LEIN_DIR/.lein-classpath" ] && [ "$1" != "classpath" ]; then
- echo "Recalculating Leiningen's classpath."
- ORIG_PWD="$PWD"
- cd "$LEIN_DIR"
- LEIN_NO_USER_PROFILES=1 $0 classpath .lein-classpath
- sum "$LEIN_DIR/project.clj" "$LEIN_DIR/leiningen-core/project.clj" > \
- .lein-project-checksum
- cd "$ORIG_PWD"
- fi
- mkdir -p "$LEIN_DIR/target/classes"
- export LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Dclojure.compile.path=$LEIN_DIR/target/classes"
- add_path CLASSPATH "$LEIN_DIR/leiningen-core/src/" "$LEIN_DIR/leiningen-core/resources/" \
- "$LEIN_DIR/test:$LEIN_DIR/target/classes" "$LEIN_DIR/src" ":$LEIN_DIR/resources"
- if [ -r "$LEIN_DIR/.lein-classpath" ]; then
- add_path CLASSPATH "$(cat "$LEIN_DIR/.lein-classpath" 2> /dev/null)"
- else
- add_path CLASSPATH "$(cat "$LEIN_DIR/leiningen-core/.lein-bootstrap" 2> /dev/null)"
- fi
- else # Not running from a checkout
- add_path CLASSPATH "$LEIN_JAR"
- if [ "$LEIN_USE_BOOTCLASSPATH" != "" ]; then
- LEIN_JVM_OPTS="-Xbootclasspath/a:$LEIN_JAR $LEIN_JVM_OPTS"
- fi
- if [ ! -r "$LEIN_JAR" -a "$1" != "self-install" ]; then
- self_install
- fi
- fi
- if [ ! -x "$JAVA_CMD" ] && ! type -f java >/dev/null
- then
- >&2 echo "Leiningen couldn't find 'java' executable, which is required."
- >&2 echo "Please either set JAVA_CMD or put java (>=1.6) in your \$PATH ($PATH)."
- exit 1
- fi
- export LEIN_JAVA_CMD="${LEIN_JAVA_CMD:-${JAVA_CMD:-java}}"
- if [[ -z "${DRIP_INIT+x}" && "$(basename "$LEIN_JAVA_CMD")" == *drip* ]]; then
- export DRIP_INIT="$(printf -- '-e\n(require (quote leiningen.repl))')"
- export DRIP_INIT_CLASS="clojure.main"
- fi
- # Support $JAVA_OPTS for backwards-compatibility.
- export JVM_OPTS="${JVM_OPTS:-"$JAVA_OPTS"}"
- # Handle jline issue with cygwin not propagating OSTYPE through java subprocesses: https://github.com/jline/jline2/issues/62
- cygterm=false
- if $cygwin; then
- case "$TERM" in
- rxvt* | xterm* | vt*) cygterm=true ;;
- esac
- fi
- if $cygterm; then
- LEIN_JVM_OPTS="$LEIN_JVM_OPTS -Djline.terminal=jline.UnixTerminal"
- stty -icanon min 1 -echo > /dev/null 2>&1
- fi
- # TODO: investigate http://skife.org/java/unix/2011/06/20/really_executable_jars.html
- # If you're packaging this for a package manager (.deb, homebrew, etc)
- # you need to remove the self-install and upgrade functionality or see lein-pkg.
- if [ "$1" = "self-install" ]; then
- if [ -r "$BIN_DIR/../src/leiningen/version.clj" ]; then
- echo "Running self-install from a checkout is not supported."
- echo "See CONTRIBUTING.md for SNAPSHOT-specific build instructions."
- exit 1
- fi
- echo "Manual self-install is deprecated; it will run automatically when necessary."
- self_install
- elif [ "$1" = "upgrade" ] || [ "$1" = "downgrade" ]; then
- if [ "$LEIN_DIR" != "" ]; then
- echo "The upgrade task is not meant to be run from a checkout."
- exit 1
- fi
- if [ $SNAPSHOT = "YES" ]; then
- echo "The upgrade task is only meant for stable releases."
- echo "See the \"Bootstrapping\" section of CONTRIBUTING.md."
- exit 1
- fi
- if [ ! -w "$SCRIPT" ]; then
- echo "You do not have permission to upgrade the installation in $SCRIPT"
- exit 1
- else
- TARGET_VERSION="${2:-stable}"
- echo "The script at $SCRIPT will be upgraded to the latest $TARGET_VERSION version."
- echo -n "Do you want to continue [Y/n]? "
- read RESP
- case "$RESP" in
- y|Y|"")
- echo
- echo "Upgrading..."
- TARGET="/tmp/lein-${$}-upgrade"
- if $cygwin; then
- TARGET=$(cygpath -w "$TARGET")
- fi
- LEIN_SCRIPT_URL="https://github.com/technomancy/leiningen/raw/$TARGET_VERSION/bin/lein"
- $HTTP_CLIENT "$TARGET" "$LEIN_SCRIPT_URL"
- if [ $? == 0 ]; then
- cmp -s "$TARGET" "$SCRIPT"
- if [ $? == 0 ]; then
- echo "Leiningen is already up-to-date."
- fi
- mv "$TARGET" "$SCRIPT" && chmod +x "$SCRIPT"
- exec "$SCRIPT" version
- else
- download_failed_message "$LEIN_SCRIPT_URL"
- fi;;
- *)
- echo "Aborted."
- exit 1;;
- esac
- fi
- else
- if $cygwin; then
- # When running on Cygwin, use Windows-style paths for java
- ORIGINAL_PWD=$(cygpath -w "$ORIGINAL_PWD")
- fi
- # apply context specific CLASSPATH entries
- if [ -f .lein-classpath ]; then
- add_path CLASSPATH "$(cat .lein-classpath)"
- fi
- if [ -n "$DEBUG" ]; then
- echo "Leiningen's classpath: $CLASSPATH"
- fi
- if [ -r .lein-fast-trampoline ]; then
- export LEIN_FAST_TRAMPOLINE='y'
- fi
- if [ "$LEIN_FAST_TRAMPOLINE" != "" ] && [ -r project.clj ]; then
- INPUTS="$* $(cat project.clj) $LEIN_VERSION $(test -f "$LEIN_HOME/profiles.clj" && cat "$LEIN_HOME/profiles.clj")"
- if command -v shasum >/dev/null 2>&1; then
- SUM="shasum"
- elif command -v sha1sum >/dev/null 2>&1; then
- SUM="sha1sum"
- else
- command_not_found "sha1sum or shasum"
- fi
- export INPUT_CHECKSUM=$(echo "$INPUTS" | $SUM | cut -f 1 -d " ")
- # Just don't change :target-path in project.clj, mkay?
- TRAMPOLINE_FILE="target/trampolines/$INPUT_CHECKSUM"
- else
- if hash mktemp 2>/dev/null; then
- # Check if mktemp is available before using it
- TRAMPOLINE_FILE="$(mktemp /tmp/lein-trampoline-XXXXXXXXXXXXX)"
- else
- TRAMPOLINE_FILE="/tmp/lein-trampoline-$$"
- fi
- trap 'rm -f $TRAMPOLINE_FILE' EXIT
- fi
- if $cygwin; then
- TRAMPOLINE_FILE=$(cygpath -w "$TRAMPOLINE_FILE")
- fi
- if [ "$INPUT_CHECKSUM" != "" ] && [ -r "$TRAMPOLINE_FILE" ]; then
- if [ -n "$DEBUG" ]; then
- echo "Fast trampoline with $TRAMPOLINE_FILE."
- fi
- exec sh -c "exec $(cat "$TRAMPOLINE_FILE")"
- else
- export TRAMPOLINE_FILE
- "$LEIN_JAVA_CMD" \
- -Dfile.encoding=UTF-8 \
- -Dmaven.wagon.http.ssl.easy=false \
- -Dmaven.wagon.rto=10000 \
- $LEIN_JVM_OPTS \
- -Dleiningen.original.pwd="$ORIGINAL_PWD" \
- -Dleiningen.script="$SCRIPT" \
- -classpath "$CLASSPATH" \
- clojure.main -m leiningen.core.main "$@"
- EXIT_CODE=$?
- if $cygterm ; then
- stty icanon echo > /dev/null 2>&1
- fi
- if [ -r "$TRAMPOLINE_FILE" ] && [ "$LEIN_TRAMPOLINE_WARMUP" = "" ]; then
- TRAMPOLINE="$(cat "$TRAMPOLINE_FILE")"
- if [ "$INPUT_CHECKSUM" = "" ]; then # not using fast trampoline
- rm "$TRAMPOLINE_FILE"
- fi
- if [ "$TRAMPOLINE" = "" ]; then
- exit $EXIT_CODE
- else
- exec sh -c "exec $TRAMPOLINE"
- fi
- else
- exit $EXIT_CODE
- fi
- fi
- fi
|