Files
Web_FreeCAD_Bitbybit/scripts/bootstrap-node.sh

91 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
repo_dir="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd -P)"
# shellcheck disable=SC1091
. "$repo_dir/config/node-runtime.env"
runtime_root="$repo_dir/.runtime"
mkdir -p "$runtime_root/downloads"
os_name="$(uname -s)"
cpu_name="$(uname -m)"
case "$os_name:$cpu_name" in
Linux:x86_64|Linux:amd64) platform=linux; arch=x64; archive_ext=tar.xz; checksum="$NODE_LINUX_X64_SHA256" ;;
Linux:aarch64|Linux:arm64) platform=linux; arch=arm64; archive_ext=tar.xz; checksum="$NODE_LINUX_ARM64_SHA256" ;;
Darwin:x86_64|Darwin:amd64) platform=darwin; arch=x64; archive_ext=tar.gz; checksum="$NODE_DARWIN_X64_SHA256" ;;
Darwin:arm64|Darwin:aarch64) platform=darwin; arch=arm64; archive_ext=tar.gz; checksum="$NODE_DARWIN_ARM64_SHA256" ;;
*)
echo "Unsupported project runtime platform: $os_name/$cpu_name (use Node $NODE_VERSION manually on this host)." >&2
exit 2
;;
esac
archive_name="node-v${NODE_VERSION}-${platform}-${arch}.${archive_ext}"
archive_path="$runtime_root/downloads/$archive_name"
runtime_dir="$runtime_root/node-v${NODE_VERSION}-${platform}-${arch}"
if [ -x "$runtime_dir/bin/node" ] && [ "$($runtime_dir/bin/node --version)" = "v$NODE_VERSION" ]; then
printf '%s\n' "$runtime_dir"
exit 0
fi
if [ -e "$archive_path" ]; then
if command -v sha256sum >/dev/null 2>&1; then
actual_checksum="$(sha256sum "$archive_path" | awk '{print $1}')"
else
actual_checksum="$(shasum -a 256 "$archive_path" | awk '{print $1}')"
fi
if [ "$actual_checksum" != "$checksum" ]; then
rm -f "$archive_path"
fi
fi
if [ ! -e "$archive_path" ]; then
temp_archive="$archive_path.part"
rm -f "$temp_archive"
if ! command -v curl >/dev/null 2>&1; then
echo "curl is required to bootstrap the project-local Node runtime." >&2
exit 2
fi
curl --fail --location --retry 3 --output "$temp_archive" "$NODE_DIST_BASE/$archive_name"
if command -v sha256sum >/dev/null 2>&1; then
actual_checksum="$(sha256sum "$temp_archive" | awk '{print $1}')"
else
actual_checksum="$(shasum -a 256 "$temp_archive" | awk '{print $1}')"
fi
if [ "$actual_checksum" != "$checksum" ]; then
rm -f "$temp_archive"
echo "SHA-256 verification failed for $archive_name." >&2
exit 3
fi
mv "$temp_archive" "$archive_path"
fi
if command -v sha256sum >/dev/null 2>&1; then
actual_checksum="$(sha256sum "$archive_path" | awk '{print $1}')"
else
actual_checksum="$(shasum -a 256 "$archive_path" | awk '{print $1}')"
fi
if [ "$actual_checksum" != "$checksum" ]; then
echo "Cached Node archive checksum does not match the pinned value." >&2
exit 3
fi
extract_dir="$(mktemp -d "$runtime_root/extract.XXXXXX")"
cleanup() { rm -rf "$extract_dir"; }
trap cleanup EXIT
tar -xf "$archive_path" -C "$extract_dir"
extracted_dir="$extract_dir/node-v${NODE_VERSION}-${platform}-${arch}"
if [ ! -x "$extracted_dir/bin/node" ]; then
echo "Node archive did not contain the expected executable." >&2
exit 4
fi
rm -rf "$runtime_dir"
mv "$extracted_dir" "$runtime_dir"
if [ "$($runtime_dir/bin/node --version)" != "v$NODE_VERSION" ]; then
echo "Bootstrapped Node version is not v$NODE_VERSION." >&2
exit 4
fi
printf '%s\n' "$runtime_dir"