Skip to content

Instantly share code, notes, and snippets.

@skatkov
Created November 6, 2025 12:20
Show Gist options
  • Save skatkov/bf2e4747bb5054769299af6bc707b7eb to your computer and use it in GitHub Desktop.
Save skatkov/bf2e4747bb5054769299af6bc707b7eb to your computer and use it in GitHub Desktop.
#!/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