|  | #!/bin/sh | 
|  |  | 
|  | # Modern Linux and macOS systems commonly only have a thing called `python3` and | 
|  | # not `python`, while Windows commonly does not have `python3`, so we cannot | 
|  | # directly use python in the x.py shebang and have it consistently work. Instead we | 
|  | # have a shell script to look for a python to run x.py. | 
|  |  | 
|  | set -eu | 
|  |  | 
|  | # syntax check | 
|  | sh -n "$0" | 
|  |  | 
|  | realpath() { | 
|  | local path="$1" | 
|  | if [ -L "$path" ]; then | 
|  | readlink -f "$path" | 
|  | elif [ -d "$path" ]; then | 
|  | (cd -P "$path" && pwd) | 
|  | else | 
|  | echo "$(realpath "$(dirname "$path")")/$(basename "$path")" | 
|  | fi | 
|  | } | 
|  |  | 
|  | xpy=$(dirname "$(realpath "$0")")/x.py | 
|  |  | 
|  | # On Windows, `py -3` sometimes works. We need to try it first because `python3` | 
|  | # sometimes tries to launch the app store on Windows. | 
|  | # On MacOS, `py` tries to install "Developer command line tools". Try `python3` first. | 
|  | # NOTE: running `bash -c ./x` from Windows doesn't set OSTYPE. | 
|  | case ${OSTYPE:-} in | 
|  | cygwin*|msys*) SEARCH="py python3 python python2";; | 
|  | *) SEARCH="python3 python py python2";; | 
|  | esac | 
|  | for SEARCH_PYTHON in $SEARCH; do | 
|  | if python=$(command -v $SEARCH_PYTHON) && [ -x "$python" ]; then | 
|  | if [ $SEARCH_PYTHON = py ]; then | 
|  | extra_arg="-3" | 
|  | else | 
|  | extra_arg="" | 
|  | fi | 
|  | exec "$python" $extra_arg "$xpy" "$@" | 
|  | fi | 
|  | done | 
|  |  | 
|  | python=$(bash -c "compgen -c python" | grep '^python[2-3]\.[0-9]+$' | head -n1) | 
|  | if ! [ "$python" = "" ]; then | 
|  | exec "$python" "$xpy" "$@" | 
|  | fi | 
|  |  | 
|  | echo "$0: error: did not find python installed" >&2 | 
|  | exit 1 |