diff --git a/.tangled/workflows/build.yml b/.tangled/workflows/build.yml index 9595223..89c1222 100644 --- a/.tangled/workflows/build.yml +++ b/.tangled/workflows/build.yml @@ -9,26 +9,28 @@ dependencies: nixpkgs: - curl - dart-sass - - mise - zip environment: ZIG_VERSION: "0.15.1" steps: - - name: Setup Zig + - name: Setup mise command: | - mise trust - mise doctor - mise exec zig -- zig version - MISE_VERBOSE=1 mise exec bun -- bun -v + ./bin/mise install + ./bin/mise trust + ./bin/mise doctor + - name: Setup Zig + Bun + command: | + ./bin/mise exec zig -- zig version + ./bin/mise exec bun -- bun -v - name: Download statichost cli command: | curl -so shcli https://www.statichost.eu/shcli chmod +x shcli - name: Build website command: | - mise dist + ./bin/mise dist - name: Upload command: | ./shcli altagos-dev ./zig-out/website diff --git a/bin/mise b/bin/mise new file mode 100755 index 0000000..6e630d1 --- /dev/null +++ b/bin/mise @@ -0,0 +1,339 @@ +#!/usr/bin/env bash +set -eu + +__mise_bootstrap() { + local script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + local project_dir=$( cd -- "$( dirname -- "$script_dir" )" &> /dev/null && pwd ) + export MISE_BOOTSTRAP_PROJECT_DIR="$project_dir" + local localized_dir="$project_dir/.mise" + export MISE_BOOTSTRAP_PROJECT_DIR="$project_dir" + export MISE_DATA_DIR="$localized_dir" + export MISE_CONFIG_DIR="$localized_dir" + export MISE_CACHE_DIR="$localized_dir/cache" + export MISE_STATE_DIR="$localized_dir/state" + export MISE_INSTALL_PATH="$localized_dir/mise-2025.11.11" + export MISE_TRUSTED_CONFIG_PATHS="$project_dir${MISE_TRUSTED_CONFIG_PATHS:+:$MISE_TRUSTED_CONFIG_PATHS}" + export MISE_IGNORED_CONFIG_PATHS="$HOME/.config/mise${MISE_IGNORED_CONFIG_PATHS:+:$MISE_IGNORED_CONFIG_PATHS}" + install() { + #!/bin/sh + set -eu + + #region logging setup + if [ "${MISE_DEBUG-}" = "true" ] || [ "${MISE_DEBUG-}" = "1" ]; then + debug() { + echo "$@" >&2 + } + else + debug() { + : + } + fi + + if [ "${MISE_QUIET-}" = "1" ] || [ "${MISE_QUIET-}" = "true" ]; then + info() { + : + } + else + info() { + echo "$@" >&2 + } + fi + + error() { + echo "$@" >&2 + exit 1 + } + #endregion + + #region environment setup + get_os() { + os="$(uname -s)" + if [ "$os" = Darwin ]; then + echo "macos" + elif [ "$os" = Linux ]; then + echo "linux" + else + error "unsupported OS: $os" + fi + } + + get_arch() { + musl="" + if type ldd >/dev/null 2>/dev/null; then + if [ "${MISE_INSTALL_MUSL-}" = "1" ] || [ "${MISE_INSTALL_MUSL-}" = "true" ]; then + musl="-musl" + elif [ "$(uname -o)" = "Android" ]; then + # Android (Termux) always uses musl + musl="-musl" + else + libc=$(ldd /bin/ls | grep 'musl' | head -1 | cut -d ' ' -f1) + if [ -n "$libc" ]; then + musl="-musl" + fi + fi + fi + arch="$(uname -m)" + if [ "$arch" = x86_64 ]; then + echo "x64$musl" + elif [ "$arch" = aarch64 ] || [ "$arch" = arm64 ]; then + echo "arm64$musl" + elif [ "$arch" = armv7l ]; then + echo "armv7$musl" + else + error "unsupported architecture: $arch" + fi + } + + get_ext() { + if [ -n "${MISE_INSTALL_EXT:-}" ]; then + echo "$MISE_INSTALL_EXT" + elif [ -n "${MISE_VERSION:-}" ] && echo "$MISE_VERSION" | grep -q '^v2024'; then + # 2024 versions don't have zstd tarballs + echo "tar.gz" + elif tar_supports_zstd; then + echo "tar.zst" + elif command -v zstd >/dev/null 2>&1; then + echo "tar.zst" + else + echo "tar.gz" + fi + } + + tar_supports_zstd() { + # tar is bsdtar or version is >= 1.31 + if tar --version | grep -q 'bsdtar' && command -v zstd >/dev/null 2>&1; then + true + elif tar --version | grep -q '1\.(3[1-9]|[4-9][0-9]'; then + true + else + false + fi + } + + shasum_bin() { + if command -v shasum >/dev/null 2>&1; then + echo "shasum" + elif command -v sha256sum >/dev/null 2>&1; then + echo "sha256sum" + else + error "mise install requires shasum or sha256sum but neither is installed. Aborting." + fi + } + + get_checksum() { + version=$1 + os=$2 + arch=$3 + ext=$4 + url="https://github.com/jdx/mise/releases/download/v${version}/SHASUMS256.txt" + + # For current version use static checksum otherwise + # use checksum from releases + if [ "$version" = "v2025.11.11" ]; then + checksum_linux_x86_64="f1ba51b26998d5d75fe14c74e16f8a66a13bf2a403f5ca97e3efb1f952ee5bf7 ./mise-v2025.11.11-linux-x64.tar.gz" + checksum_linux_x86_64_musl="b3d0ada98b5319ca9e1095d8761ab10c8854fdd5c7487e85cbb7e6972a69ffea ./mise-v2025.11.11-linux-x64-musl.tar.gz" + checksum_linux_arm64="2d9e3e27da8323d331ed01c0424dfc282856c1124626eb3f1ad79a1588e33763 ./mise-v2025.11.11-linux-arm64.tar.gz" + checksum_linux_arm64_musl="502059f4c449e7a18f4994ceba8c91c27f05364bb80b14c51f19be03a8f267d0 ./mise-v2025.11.11-linux-arm64-musl.tar.gz" + checksum_linux_armv7="2be7aec10ec9a79fcede2b930fcfbf1a5e755900a4861c01ba4a3ceef2d516a8 ./mise-v2025.11.11-linux-armv7.tar.gz" + checksum_linux_armv7_musl="293c94b0cedf2fb53c6fea7f7149e2217d53c0dddb6aea1692c56c6bbcb3159f ./mise-v2025.11.11-linux-armv7-musl.tar.gz" + checksum_macos_x86_64="c64c00028db0bbb73d4a9801a2ecb68f9cf5927c4e53740871e5d7ba8ab0b3c7 ./mise-v2025.11.11-macos-x64.tar.gz" + checksum_macos_arm64="afbf065a2759dcbee8fc56b7afa0324c5f76e09b7bac245284a5f8b8d4bb1d81 ./mise-v2025.11.11-macos-arm64.tar.gz" + checksum_linux_x86_64_zstd="9fefbbef115f9dad3ed3068edd52bcdd27a04d4829a63d4917ddd20c14367c11 ./mise-v2025.11.11-linux-x64.tar.zst" + checksum_linux_x86_64_musl_zstd="59e9267bb388784ff17dbf99104e1d8f03aaafae6e84e4eeb8437ebe683b27a3 ./mise-v2025.11.11-linux-x64-musl.tar.zst" + checksum_linux_arm64_zstd="3d6242e5296292a1aa4d42cfd8631ef12a3cf9f3c7cc5eb39a102896d93e0784 ./mise-v2025.11.11-linux-arm64.tar.zst" + checksum_linux_arm64_musl_zstd="2f4116d30bd99e3eb9b3fe949c02d46d99339d3e573bd824ecd0185a69367275 ./mise-v2025.11.11-linux-arm64-musl.tar.zst" + checksum_linux_armv7_zstd="f00100833cc08aa854b2af77dd559191cc1c7d54a32ff8121170dbc8c965e62b ./mise-v2025.11.11-linux-armv7.tar.zst" + checksum_linux_armv7_musl_zstd="96afb1ccc771b7310f870a1df7699f9601da0fe5083fbb0a0f760ecbe66a697c ./mise-v2025.11.11-linux-armv7-musl.tar.zst" + checksum_macos_x86_64_zstd="f5ffcf4c2263bcdce78ae5344f4ccc4bbf0e93f7619799cac140079a50bbb37a ./mise-v2025.11.11-macos-x64.tar.zst" + checksum_macos_arm64_zstd="c07ca98edb30062879b47e5eb46f31d86b71cbd88f62d3350236178e5a8552a9 ./mise-v2025.11.11-macos-arm64.tar.zst" + + # TODO: refactor this, it's a bit messy + if [ "$ext" = "tar.zst" ]; then + if [ "$os" = "linux" ]; then + if [ "$arch" = "x64" ]; then + echo "$checksum_linux_x86_64_zstd" + elif [ "$arch" = "x64-musl" ]; then + echo "$checksum_linux_x86_64_musl_zstd" + elif [ "$arch" = "arm64" ]; then + echo "$checksum_linux_arm64_zstd" + elif [ "$arch" = "arm64-musl" ]; then + echo "$checksum_linux_arm64_musl_zstd" + elif [ "$arch" = "armv7" ]; then + echo "$checksum_linux_armv7_zstd" + elif [ "$arch" = "armv7-musl" ]; then + echo "$checksum_linux_armv7_musl_zstd" + else + warn "no checksum for $os-$arch" + fi + elif [ "$os" = "macos" ]; then + if [ "$arch" = "x64" ]; then + echo "$checksum_macos_x86_64_zstd" + elif [ "$arch" = "arm64" ]; then + echo "$checksum_macos_arm64_zstd" + else + warn "no checksum for $os-$arch" + fi + else + warn "no checksum for $os-$arch" + fi + else + if [ "$os" = "linux" ]; then + if [ "$arch" = "x64" ]; then + echo "$checksum_linux_x86_64" + elif [ "$arch" = "x64-musl" ]; then + echo "$checksum_linux_x86_64_musl" + elif [ "$arch" = "arm64" ]; then + echo "$checksum_linux_arm64" + elif [ "$arch" = "arm64-musl" ]; then + echo "$checksum_linux_arm64_musl" + elif [ "$arch" = "armv7" ]; then + echo "$checksum_linux_armv7" + elif [ "$arch" = "armv7-musl" ]; then + echo "$checksum_linux_armv7_musl" + else + warn "no checksum for $os-$arch" + fi + elif [ "$os" = "macos" ]; then + if [ "$arch" = "x64" ]; then + echo "$checksum_macos_x86_64" + elif [ "$arch" = "arm64" ]; then + echo "$checksum_macos_arm64" + else + warn "no checksum for $os-$arch" + fi + else + warn "no checksum for $os-$arch" + fi + fi + else + if command -v curl >/dev/null 2>&1; then + debug ">" curl -fsSL "$url" + checksums="$(curl --compressed -fsSL "$url")" + else + if command -v wget >/dev/null 2>&1; then + debug ">" wget -qO - "$url" + checksums="$(wget -qO - "$url")" + else + error "mise standalone install specific version requires curl or wget but neither is installed. Aborting." + fi + fi + # TODO: verify with minisign or gpg if available + + checksum="$(echo "$checksums" | grep "$os-$arch.$ext")" + if ! echo "$checksum" | grep -Eq "^([0-9a-f]{32}|[0-9a-f]{64})"; then + warn "no checksum for mise $version and $os-$arch" + else + echo "$checksum" + fi + fi + } + + #endregion + + download_file() { + url="$1" + download_dir="$2" + filename="$(basename "$url")" + file="$download_dir/$filename" + + info "mise: installing mise..." + + if command -v curl >/dev/null 2>&1; then + debug ">" curl -#fLo "$file" "$url" + curl -#fLo "$file" "$url" + else + if command -v wget >/dev/null 2>&1; then + debug ">" wget -qO "$file" "$url" + stderr=$(mktemp) + wget -O "$file" "$url" >"$stderr" 2>&1 || error "wget failed: $(cat "$stderr")" + rm "$stderr" + else + error "mise standalone install requires curl or wget but neither is installed. Aborting." + fi + fi + + echo "$file" + } + + install_mise() { + version="${MISE_VERSION:-v2025.11.11}" + version="${version#v}" + os="${MISE_INSTALL_OS:-$(get_os)}" + arch="${MISE_INSTALL_ARCH:-$(get_arch)}" + ext="${MISE_INSTALL_EXT:-$(get_ext)}" + install_path="${MISE_INSTALL_PATH:-$HOME/.local/bin/mise}" + install_dir="$(dirname "$install_path")" + install_from_github="${MISE_INSTALL_FROM_GITHUB:-}" + if [ "$version" != "v2025.11.11" ] || [ "$install_from_github" = "1" ] || [ "$install_from_github" = "true" ]; then + tarball_url="https://github.com/jdx/mise/releases/download/v${version}/mise-v${version}-${os}-${arch}.${ext}" + elif [ -n "${MISE_TARBALL_URL-}" ]; then + tarball_url="$MISE_TARBALL_URL" + else + tarball_url="https://mise.jdx.dev/v${version}/mise-v${version}-${os}-${arch}.${ext}" + fi + + download_dir="$(mktemp -d)" + cache_file=$(download_file "$tarball_url" "$download_dir") + debug "mise-setup: tarball=$cache_file" + + debug "validating checksum" + cd "$(dirname "$cache_file")" && get_checksum "$version" "$os" "$arch" "$ext" | "$(shasum_bin)" -c >/dev/null + + # extract tarball + mkdir -p "$install_dir" + rm -rf "$install_path" + extract_dir="$(mktemp -d)" + cd "$extract_dir" + if [ "$ext" = "tar.zst" ] && ! tar_supports_zstd; then + zstd -d -c "$cache_file" | tar -xf - + else + tar -xf "$cache_file" + fi + mv mise/bin/mise "$install_path" + + # cleanup + cd / # Move out of $extract_dir before removing it + rm -rf "$download_dir" + rm -rf "$extract_dir" + + info "mise: installed successfully to $install_path" + } + + after_finish_help() { + case "${SHELL:-}" in + */zsh) + info "mise: run the following to activate mise in your shell:" + info "echo \"eval \\\"\\\$($install_path activate zsh)\\\"\" >> \"${ZDOTDIR-$HOME}/.zshrc\"" + info "" + info "mise: run \`mise doctor\` to verify this is setup correctly" + ;; + */bash) + info "mise: run the following to activate mise in your shell:" + info "echo \"eval \\\"\\\$($install_path activate bash)\\\"\" >> ~/.bashrc" + info "" + info "mise: run \`mise doctor\` to verify this is setup correctly" + ;; + */fish) + info "mise: run the following to activate mise in your shell:" + info "echo \"$install_path activate fish | source\" >> ~/.config/fish/config.fish" + info "" + info "mise: run \`mise doctor\` to verify this is setup correctly" + ;; + *) + info "mise: run \`$install_path --help\` to get started" + ;; + esac + } + + install_mise + if [ "${MISE_INSTALL_HELP-}" != 0 ]; then + after_finish_help + fi + + cd "$MISE_BOOTSTRAP_PROJECT_DIR" + } + local MISE_INSTALL_HELP=0 + test -f "$MISE_INSTALL_PATH" || install +} +__mise_bootstrap +exec "$MISE_INSTALL_PATH" "$@" \ No newline at end of file diff --git a/zig/.gitignore b/zig/.gitignore deleted file mode 100644 index 3799b77..0000000 --- a/zig/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -* -!download.sh -!.gitignore diff --git a/zig/download.sh b/zig/download.sh deleted file mode 100755 index 9661c56..0000000 --- a/zig/download.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env bash -set -e - -[ -z "$ZIG_VERSION" ] && ZIG_VERSION="0.15.1" -[ -z "$ZIG_PUBLIC_KEY" ] && ZIG_PUBLIC_KEY="RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U" - -command -v jq >/dev/null || { echo "jq required"; exit 1; } -command -v minisign >/dev/null || { echo "minisign required"; exit 1; } - -# Clean up previous installation -if [ -L "zig/zig" ]; then - prev_dir=$(readlink zig/zig | cut -d '/' -f 2) - [ -d "zig/$prev_dir" ] && rm -rf "zig/$prev_dir" - rm -f "zig/zig" -fi - -case "$(uname -s)" in - Linux) - case "$(uname -m)" in - x86_64) p="x86_64-linux" ;; - aarch64) p="aarch64-linux" ;; - armv7l) p="arm-linux" ;; - i686) p="x86-linux" ;; - *) echo "Arch unsupported"; exit 1 ;; - esac - ;; - Darwin) - case "$(uname -m)" in - x86_64) p="x86_64-macos" ;; - arm64) p="aarch64-macos" ;; - *) echo "Arch unsupported"; exit 1 ;; - esac - ;; - *) echo "OS unsupported"; exit 1 ;; -esac - -u=$(curl -s https://ziglang.org/download/index.json | jq -r ".\"$ZIG_VERSION\".\"$p\".tarball") -[ -z "$u" ] && { echo "Version not found"; exit 1; } - -f=$(basename "$u") -curl -sfL "$u" -o "zig/$f" || { echo "Download failed"; exit 1; } -curl -sfL "$u.minisig" -o "zig/$f.minisig" || { echo "Sig download failed"; exit 1; } -minisign -Vm "zig/$f" -P "$ZIG_PUBLIC_KEY" || { echo "Sig verification failed"; exit 1; } - -# Extract directly to zig folder -if [[ "$f" == *.zip ]]; then - unzip -q "zig/$f" -d zig -else - tar -xJf "zig/$f" --no-same-owner -C zig -fi - -# Derive directory name -d=$(echo "$f" | sed -E 's/\.(tar\.xz|tar\.gz|zip|tgz|tar)$//') - -# Verify binary exists -[ ! -f "zig/$d/zig" ] && { echo "Binary not found"; exit 1; } - -# Create symlink with absolute paths -ln -sf "$(pwd)/zig/$d/zig" "$(pwd)/zig/zig" - -# Cleanup -rm -f "zig/$f" "zig/$f.minisig" - -echo "Zig installed successfully"