fix: add zsh step, use arty completion zsh --install
- Add ensure_zsh step (step 3 of 7): installs zsh via apt/brew if missing, sets it as default shell via chsh - Replace manual completion write with arty completion zsh --install - Extend PATH with ~/.local/bin and ~/go/bin before completion step so yq installed by arty deps (in a subshell) is found - Renumber all steps 1-7 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -8,11 +8,11 @@
|
|||||||
#
|
#
|
||||||
# What this script does:
|
# What this script does:
|
||||||
# 1. Re-execs itself with bash (curl|sh consumes stdin, so bash -c re-fetch is required)
|
# 1. Re-execs itself with bash (curl|sh consumes stdin, so bash -c re-fetch is required)
|
||||||
# 2. Detects OS (Debian/Ubuntu, macOS, other Linux)
|
# 2. Detects OS, installs git if missing — apt-get on Debian/Ubuntu, xcode-select on macOS
|
||||||
# 3. Installs git if missing — apt-get on Debian/Ubuntu, xcode-select on macOS
|
# 3. Installs zsh if missing, sets it as the default shell
|
||||||
# 4. Clones this dotfiles repo into ~ via HTTPS (or pulls if already present)
|
# 4. Clones this dotfiles repo into ~ via HTTPS (or pulls if already present)
|
||||||
# 5. Runs arty deps — oh-my-zsh, p10k, nvm, rbenv, pyenv, zsh plugins
|
# 5. Runs arty deps — oh-my-zsh, p10k, nvm, rbenv, pyenv, zsh plugins
|
||||||
# 6. Installs arty zsh completion to ~/.zsh/completions/_arty
|
# 6. Installs arty zsh completion via: arty completion zsh --install
|
||||||
# 7. Prints next steps
|
# 7. Prints next steps
|
||||||
|
|
||||||
# ─── Step 0: Re-exec with bash ────────────────────────────────────────────────
|
# ─── Step 0: Re-exec with bash ────────────────────────────────────────────────
|
||||||
@@ -116,7 +116,7 @@ check_prerequisites() {
|
|||||||
|
|
||||||
# ─── Step 2: Ensure git ───────────────────────────────────────────────────────
|
# ─── Step 2: Ensure git ───────────────────────────────────────────────────────
|
||||||
ensure_git() {
|
ensure_git() {
|
||||||
step_header "Step 2 of 6 — Git"
|
step_header "Step 2 of 7 — Git"
|
||||||
|
|
||||||
if command -v git >/dev/null 2>&1; then
|
if command -v git >/dev/null 2>&1; then
|
||||||
log_success "git $(git --version | awk '{print $3}')"
|
log_success "git $(git --version | awk '{print $3}')"
|
||||||
@@ -155,9 +155,66 @@ ensure_git() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
# ─── Step 3: Clone or update dotfiles ─────────────────────────────────────────
|
# ─── Step 3: Ensure zsh ───────────────────────────────────────────────────────
|
||||||
|
ensure_zsh() {
|
||||||
|
step_header "Step 3 of 7 — Zsh"
|
||||||
|
|
||||||
|
if command -v zsh >/dev/null 2>&1; then
|
||||||
|
log_success "zsh $(zsh --version | awk '{print $2}')"
|
||||||
|
else
|
||||||
|
log_warn "zsh not found — installing for OS: $OS"
|
||||||
|
case "$OS" in
|
||||||
|
debian)
|
||||||
|
if ! command -v sudo >/dev/null 2>&1; then
|
||||||
|
log_error "sudo is required to install zsh on Debian/Ubuntu."
|
||||||
|
log_error "Run as root: apt-get install -y zsh — then re-run this script."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sudo apt-get update -qq
|
||||||
|
sudo apt-get install -y zsh
|
||||||
|
log_success "zsh installed: $(zsh --version | awk '{print $2}')"
|
||||||
|
;;
|
||||||
|
macos)
|
||||||
|
if command -v brew >/dev/null 2>&1; then
|
||||||
|
brew install zsh
|
||||||
|
log_success "zsh installed: $(zsh --version | awk '{print $2}')"
|
||||||
|
else
|
||||||
|
log_warn "zsh not found and Homebrew is not available."
|
||||||
|
log_warn "Install zsh manually: https://www.zsh.org"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_warn "Cannot install zsh automatically on OS: $OS"
|
||||||
|
log_warn "Please install zsh manually, then re-run this script."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set zsh as the default shell if it isn't already.
|
||||||
|
local zsh_path
|
||||||
|
zsh_path="$(command -v zsh 2>/dev/null || true)"
|
||||||
|
if [[ -n "$zsh_path" && "$SHELL" != "$zsh_path" ]]; then
|
||||||
|
log_info "Setting zsh as default shell..."
|
||||||
|
if command -v chsh >/dev/null 2>&1; then
|
||||||
|
# Add zsh to /etc/shells if missing (required by chsh).
|
||||||
|
if ! grep -qx "$zsh_path" /etc/shells 2>/dev/null; then
|
||||||
|
echo "$zsh_path" | sudo tee -a /etc/shells >/dev/null
|
||||||
|
fi
|
||||||
|
if sudo chsh -s "$zsh_path" "$USER" 2>/dev/null || chsh -s "$zsh_path" 2>/dev/null; then
|
||||||
|
log_success "Default shell set to zsh (takes effect on next login)"
|
||||||
|
else
|
||||||
|
log_warn "Could not set default shell automatically."
|
||||||
|
log_warn "Run manually: chsh -s $zsh_path"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_warn "chsh not available — set your default shell manually: chsh -s $zsh_path"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ─── Step 4: Clone or update dotfiles ─────────────────────────────────────────
|
||||||
setup_dotfiles() {
|
setup_dotfiles() {
|
||||||
step_header "Step 3 of 6 — Dotfiles"
|
step_header "Step 4 of 7 — Dotfiles"
|
||||||
|
|
||||||
local is_git_repo=0
|
local is_git_repo=0
|
||||||
local is_this_repo=0
|
local is_this_repo=0
|
||||||
@@ -215,9 +272,9 @@ setup_dotfiles() {
|
|||||||
log_success "Dotfiles cloned into $HOME"
|
log_success "Dotfiles cloned into $HOME"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ─── Step 4: Install dependencies via arty ────────────────────────────────────
|
# ─── Step 5: Install dependencies via arty ────────────────────────────────────
|
||||||
install_deps() {
|
install_deps() {
|
||||||
step_header "Step 4 of 6 — Dependencies (arty deps)"
|
step_header "Step 5 of 7 — Dependencies (arty deps)"
|
||||||
|
|
||||||
local arty_bin="$HOME/bin/arty"
|
local arty_bin="$HOME/bin/arty"
|
||||||
|
|
||||||
@@ -241,38 +298,26 @@ install_deps() {
|
|||||||
log_success "All dependencies installed"
|
log_success "All dependencies installed"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ─── Step 5: Install arty zsh completion ──────────────────────────────────────
|
# ─── Step 6: Install arty zsh completion ──────────────────────────────────────
|
||||||
install_completion() {
|
install_completion() {
|
||||||
step_header "Step 5 of 6 — Zsh completion"
|
step_header "Step 6 of 7 — Zsh completion"
|
||||||
|
|
||||||
local arty_bin="$HOME/bin/arty"
|
local arty_bin="$HOME/bin/arty"
|
||||||
local completion_content
|
|
||||||
|
|
||||||
if ! completion_content="$(cd "$HOME" && "$arty_bin" completion zsh 2>/dev/null)"; then
|
# Ensure tools that arty deps may have installed (yq, etc.) are on PATH.
|
||||||
log_warn "arty completion zsh failed — skipping."
|
# arty deps runs in a subshell — its PATH exports don't survive back here.
|
||||||
return 0
|
export PATH="$HOME/.local/bin:$HOME/go/bin:$PATH"
|
||||||
|
|
||||||
|
# arty completion zsh --install writes to the first writable fpath dir,
|
||||||
|
# defaulting to ~/.zsh/completions/_arty (which .zshenv/oh-my-zsh picks up).
|
||||||
|
if ! (cd "$HOME" && "$arty_bin" completion zsh --install); then
|
||||||
|
log_warn "arty completion zsh --install failed — skipping."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Sanity-check: a valid zsh completion file starts with #compdef.
|
|
||||||
if ! echo "$completion_content" | head -1 | grep -q "#compdef"; then
|
|
||||||
log_warn "arty completion output is not a valid zsh completion — skipping."
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Target: ~/.zsh/completions/_arty
|
|
||||||
# .zshenv sets ZSH_CUSTOM="$HOME/.zsh"; oh-my-zsh adds $ZSH_CUSTOM/completions
|
|
||||||
# to fpath automatically — this is the correct path for this configuration.
|
|
||||||
local comp_dir="$HOME/.zsh/completions"
|
|
||||||
local comp_dest="$comp_dir/_arty"
|
|
||||||
|
|
||||||
mkdir -p "$comp_dir"
|
|
||||||
printf '%s\n' "$completion_content" > "$comp_dest"
|
|
||||||
log_success "Completion installed: $comp_dest"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ─── Step 6: Post-install summary ─────────────────────────────────────────────
|
# ─── Step 7: Post-install summary ─────────────────────────────────────────────
|
||||||
post_install() {
|
post_install() {
|
||||||
step_header "Step 6 of 6 — Done"
|
step_header "Step 7 of 7 — Done"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo -e "${GREEN}${BOLD}Setup complete.${NC} Next steps:"
|
echo -e "${GREEN}${BOLD}Setup complete.${NC} Next steps:"
|
||||||
@@ -300,10 +345,11 @@ main() {
|
|||||||
|
|
||||||
check_prerequisites # Step 1
|
check_prerequisites # Step 1
|
||||||
ensure_git # Step 2
|
ensure_git # Step 2
|
||||||
setup_dotfiles # Step 3
|
ensure_zsh # Step 3
|
||||||
install_deps # Step 4
|
setup_dotfiles # Step 4
|
||||||
install_completion # Step 5
|
install_deps # Step 5
|
||||||
post_install # Step 6
|
install_completion # Step 6
|
||||||
|
post_install # Step 7
|
||||||
}
|
}
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
|||||||
Reference in New Issue
Block a user