Created
November 6, 2025 12:20
-
-
Save skatkov/bf2e4747bb5054769299af6bc707b7eb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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" | |
| 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.2" ]; then | |
| checksum_linux_x86_64="6ab4f376893a5114b0dac06e765b7f68967cfed9a0ddc0f93f267ff7a403f30b ./mise-v2025.11.2-linux-x64.tar.gz" | |
| checksum_linux_x86_64_musl="e00811c66fa8ec2f5033b4ce92ca6166e861b5c428dbbf4d056995fd15029c8b ./mise-v2025.11.2-linux-x64-musl.tar.gz" | |
| checksum_linux_arm64="672879c78a086b8bbe62c18d6946929005689908283a2e2f94667cad40a1adc1 ./mise-v2025.11.2-linux-arm64.tar.gz" | |
| checksum_linux_arm64_musl="245b009fad7c8c6b5d32c6a4027189428b89d79cd5919f0962f1fcce6eea454a ./mise-v2025.11.2-linux-arm64-musl.tar.gz" | |
| checksum_linux_armv7="8c20a0a3c164072576422fbfbe04563672a9f21a11194b39b112b694ce7a758c ./mise-v2025.11.2-linux-armv7.tar.gz" | |
| checksum_linux_armv7_musl="b088252e11dc540f6facf348d71770d251211b49a2b943d787adf335ac2a14d7 ./mise-v2025.11.2-linux-armv7-musl.tar.gz" | |
| checksum_macos_x86_64="8843e32d7c013b21ba998ff49e814a1f8efd2676812a3a552db4c0ffd692d2a4 ./mise-v2025.11.2-macos-x64.tar.gz" | |
| checksum_macos_arm64="6c7e7f44dd9936926dd35e6b9feb3365f4c14343cecf1b27e3c34b2fff42e849 ./mise-v2025.11.2-macos-arm64.tar.gz" | |
| checksum_linux_x86_64_zstd="3cc57ad6ea39fdc40e269138e4d378e9d3c7e56cd2d44460915344bd2d5a99c4 ./mise-v2025.11.2-linux-x64.tar.zst" | |
| checksum_linux_x86_64_musl_zstd="c7e5403c4baeefdf7cbe5fb35eecf79ae9e6f8c1eec7476fb79ef3fb2e7398ee ./mise-v2025.11.2-linux-x64-musl.tar.zst" | |
| checksum_linux_arm64_zstd="11512dde3a27c30cad1e3ec4f7136b4ebf2a95350965f9f132a5bd102911fd8f ./mise-v2025.11.2-linux-arm64.tar.zst" | |
| checksum_linux_arm64_musl_zstd="a232b047ea175ae41c021167f6c5b79321f107a0810eca6c439054c8d1769031 ./mise-v2025.11.2-linux-arm64-musl.tar.zst" | |
| checksum_linux_armv7_zstd="d381c93135c440ec87cf7e2deed514672e1f77cb4b024b1db3d20c34d07b824f ./mise-v2025.11.2-linux-armv7.tar.zst" | |
| checksum_linux_armv7_musl_zstd="3393fdaa8a9c0585ba6d4615b4a6eaa22902992188e0b151c3d3457c66e26cc7 ./mise-v2025.11.2-linux-armv7-musl.tar.zst" | |
| checksum_macos_x86_64_zstd="33f66812515a818c6b1459842ed285fc11d0295c82cab6b834ee6bd781f997e0 ./mise-v2025.11.2-macos-x64.tar.zst" | |
| checksum_macos_arm64_zstd="319feb987d287ad6b61b9e9216005842b74881e22468e7b4224981f1317146e4 ./mise-v2025.11.2-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" | |
| stderr=$(mktemp) | |
| 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" | |
| filename="$(basename "$url")" | |
| cache_dir="$(mktemp -d)" | |
| file="$cache_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")" | |
| 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.2}" | |
| 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.2" ] || [ "$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 | |
| cache_file=$(download_file "$tarball_url") | |
| 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" | |
| cd "$(mktemp -d)" | |
| 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" | |
| 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment