#!/bin/sh # bootstrap/node # # Node-finding script for all `sh` environments, including Linux, MSYS2, # Git for Windows, and GitHub Desktop. Invokable from CLI or automation. # # If a node.exe installed by `node_.ps1` is present, it will be used. # Otherwise, this script requires a system `node` to be provided. set -e # Convenience variables Bootstrap="$(dirname "$0")" Cache="$Bootstrap/.cache" if [ "$TG_BOOTSTRAP_CACHE" ]; then Cache="$TG_BOOTSTRAP_CACHE" fi OldPWD="$PWD" cd "$Bootstrap/../.." . ./dependencies.sh # sets NODE_VERSION_PRECISE cd "$OldPWD" NodeVersion="$NODE_VERSION_PRECISE" NodeFullVersion="node-v$NodeVersion-win-x64" NodeDir="$Cache/$NodeFullVersion" NodeExe="$NodeDir/node.exe" Log="$Cache/last-command.log" # If a bootstrapped Node is not present, search on $PATH. if [ "$(uname)" = "Linux" ] || [ ! -f "$NodeExe" ]; then if [ "$TG_BOOTSTRAP_NODE_LINUX" ]; then NodeFullVersion="node-v$NodeVersion-linux-x64" NodeDir="$Cache/$NodeFullVersion/bin" NodeExe="$NodeDir/node" if [ ! -f "$NodeExe" ]; then mkdir -p "$Cache" Archive="$(realpath "$Cache/node-v$NodeVersion.tar.gz")" curl "https://nodejs.org/download/release/v$NodeVersion/$NodeFullVersion.tar.gz" -o "$Archive" (cd "$Cache" && tar xf "$Archive") fi elif command -v node >/dev/null 2>&1; then NodeExe="node" else echo if command -v apt-get >/dev/null 2>&1; then # Ubuntu advice echo "Please install Node using your system's package manager:" echo " sudo apt-get install nodejs" elif uname | grep -q MSYS; then # MSYS2 (not packaged) or Git for Windows advice echo "Please run bootstrap/node.bat instead of bootstrap/node once" echo "to install Node automatically, or install it from https://nodejs.org/" elif command -v pacman >/dev/null 2>&1; then # Arch advice echo "Please install Node using your system's package manager:" echo " sudo pacman -S nodejs" else # Generic advice echo "Please install Node from https://nodejs.org/ or using your system's package manager." fi echo exit 1 fi fi # Cheap shell function if tee.exe is not available if ! command -v tee >/dev/null 2>&1; then tee() { # Fudge: assume $1 is always "-a" while read -r line; do echo "$line" >> "$2" echo "$line" done } fi # Invoke Node with all command-line arguments mkdir -p "$Cache" printf '%s\n' "$NodeExe" "$@" > "$Log" printf -- '---\n' >> "$Log" exec 4>&1 PATH="$(readlink -f "$NodeDir"):$PATH" # Set PATH so that recursive calls find it exitstatus=$({ { set +e; "$NodeExe" "$@" 2>&1 3>&-; printf %s $? >&3; } 4>&- | tee -a "$Log" 1>&4; } 3>&1) exec 4>&- exit "$exitstatus"