From 53eb3851d1115bc825bdf1c4d6f9407e8ff414d4 Mon Sep 17 00:00:00 2001 From: Anish Athalye Date: Tue, 18 Apr 2017 22:18:58 -0400 Subject: Make launcher find python binary --- bin/dotbot | 18 ++++++++++- test/tests/find-python-executable.bash | 58 ++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 test/tests/find-python-executable.bash diff --git a/bin/dotbot b/bin/dotbot index e9b432b..78a0725 100755 --- a/bin/dotbot +++ b/bin/dotbot @@ -1,4 +1,20 @@ -#!/usr/bin/env python +#!/usr/bin/env sh + +# This is a valid shell script and also a valid Python script. When this file +# is executed as a shell script, it finds a python binary and executes this +# file as a Python script, passing along all of the command line arguments. +# When this file is executed as a Python script, it loads and runs Dotbot. This +# is useful because we don't know the name of the python binary. + +''':' # begin python string; this line is interpreted by the shell as `:` +which python3 >/dev/null 2>&1 && exec python3 "$0" "$@" +which python >/dev/null 2>&1 && exec python "$0" "$@" +which python2 >/dev/null 2>&1 && exec python2 "$0" "$@" +>&2 echo "error: cannot find python" +return 1 +''' + +# python code import sys, os diff --git a/test/tests/find-python-executable.bash b/test/tests/find-python-executable.bash new file mode 100644 index 0000000..cc46724 --- /dev/null +++ b/test/tests/find-python-executable.bash @@ -0,0 +1,58 @@ +test_description='can find python executable with different names' +. '../test-lib.bash' + +# the test machine needs to have a binary named `python` +test_expect_success 'setup' ' +mkdir ~/tmp_bin && +( + IFS=: + for p in $PATH; do + find $p -maxdepth 1 -mindepth 1 -exec sh -c \ + '"'"'ln -sf {} $HOME/tmp_bin/$(basename {})'"'"' \; + done +) && +rm -f ~/tmp_bin/python && +rm -f ~/tmp_bin/python2 && +rm -f ~/tmp_bin/python3 +' + +test_expect_failure 'run' ' +PATH="$HOME/tmp_bin" run_dotbot <> ~/tmp_bin/python <