1
0
Fork 0
gnu-plus-dotfiles/dot_local/bin/update-neovim.sh
rain 5ce06f98de Fix neovim symlink target: was basename(tarball), now explicit NVIM_EXTRACT_DIR
The tarball filename is nvim-linux-arm64.tar.gz but the extracted
directory inside it is also named nvim-linux-arm64. However, my
original code did $(basename nvim.tar.gz .tar.gz) which returns 'nvim'
(strips both the directory and the suffix), creating a symlink to
/opt/nvim/bin/nvim that pointed to a non-existent path.

Discovered on rye after the bootstrap appeared to succeed but nvim
wasn't findable. Fixed by hardcoding the extracted directory name
based on the arch case:

  x86_64:   nvim-linux64.tar.gz  ->  nvim-linux64
  aarch64:  nvim-linux-arm64.tar.gz -> nvim-linux-arm64

Same fix applied to:
- run_once_20-install-user-packages.sh.tmpl (initial install)
- dot_local/bin/update-neovim.sh (topgrade-time updates)

Verified on rye: /usr/local/bin/nvim -> /opt/nvim-linux-arm64/bin/nvim,
'nvim --version' returns 'NVIM v0.11.4'.
2026-06-21 21:31:44 -04:00

58 lines
No EOL
1.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# =============================================================================
# update-neovim.sh — chezmoi-managed, deployed to ~/.local/bin/update-neovim.sh
#
# Installs or upgrades neovim from the official binary tarball.
# Bump NVIM_TARGET_VERSION to upgrade. Topgrade calls this via
# ~/.config/topgrade.toml.
#
# Idempotent: no-op if installed version matches target.
# =============================================================================
set -euo pipefail
NVIM_TARGET_VERSION="v0.11.4"
ARCH="$(uname -m)"
case "$ARCH" in
x86_64)
NVIM_TARBALL="nvim-linux64.tar.gz"
NVIM_EXTRACT_DIR="nvim-linux64"
;;
aarch64|arm64)
NVIM_TARBALL="nvim-linux-arm64.tar.gz"
NVIM_EXTRACT_DIR="nvim-linux-arm64"
;;
*)
echo "unsupported arch: $ARCH" >&2
exit 1
;;
esac
if command -v nvim >/dev/null 2>&1; then
INSTALLED_VER="$(nvim --version 2>/dev/null | head -1 | awk '{print $2}')"
if [[ "$INSTALLED_VER" == "$NVIM_TARGET_VERSION" ]]; then
echo "neovim $INSTALLED_VER matches target — no action"
exit 0
fi
echo "neovim $INSTALLED_VER -> $NVIM_TARGET_VERSION"
else
echo "installing neovim $NVIM_TARGET_VERSION"
fi
cd /tmp
TMP_TARBALL="$(mktemp /tmp/nvim-update.XXXXXX.tar.gz)"
trap 'rm -f "$TMP_TARBALL"' EXIT
if ! curl -fL --retry 3 \
"https://github.com/neovim/neovim/releases/download/${NVIM_TARGET_VERSION}/${NVIM_TARBALL}" \
-o "$TMP_TARBALL"; then
echo "failed to download $NVIM_TARBALL" >&2
exit 1
fi
sudo rm -rf /opt/nvim-linux* /usr/local/bin/nvim
sudo tar -xzf "$TMP_TARBALL" -C /opt/
sudo ln -sf "/opt/${NVIM_EXTRACT_DIR}/bin/nvim" /usr/local/bin/nvim
echo "neovim $NVIM_TARGET_VERSION installed"
nvim --version | head -1