- lib/distro.sh: add DISTRO_CODENAME from VERSION_CODENAME; remove unused REPO_ADD_RPM variable; export DISTRO_CODENAME - stages/01-repos.sh: replace repeated '. /etc/os-release' subshell calls with $DISTRO_CODENAME in Docker and Tailscale repo lines - stages/00-envcheck.sh: combine four mkdir -p calls into one - stages/02-packages.sh: remove identical if/else branches in fd symlink block; both branches were the same command - stages/03-toolchains.sh: set NVM_DIR once before the if/else instead of twice; remove dead commented-out duplicate curl line - stages/04-shell.sh: capture $(date +%Y%m%d) into _bak_date once per backup and reuse in cp and warn to avoid redundant forks - stages/06-scripts.sh: split 'export VAR=$(cmd)' into assignment + export to correctly propagate errors under set -euo pipefail - stages/07-uv-projects.sh: remove unused has_package_json field (always false, never read); fix stage completion message 06 -> 07 - stages/08-systemd.sh: remove mempi-sync.timer (deploy, enable, header comment); deploy mempi-sync.service only - stages/09-desktop.sh: remove duplicate mkdir -p in COSMIC section; remove unused repo_url parameter from install_nerd_font() - stages/12-other-apps.sh: replace manual distro branch for Nextcloud with pkg_install_mapped - config/scripts/bw-load-ssh.sh: split 'export BW_SESSION=$(cat ...)' into assignment + export - config/systemd/mempi-sync.timer: delete file
109 lines
4.2 KiB
Bash
Executable File
109 lines
4.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ===========================================================================
|
|
# Stage 04: Shell Configuration (zsh, oh-my-zsh, powerlevel10k)
|
|
# Deploys .zshrc, .p10k.zsh, and .zshrc.local (from config/shell/).
|
|
# ===========================================================================
|
|
# On the Pop machine, Julian uses:
|
|
# - zsh as default shell
|
|
# - oh-my-zsh with powerlevel10k theme (lean style, 1 line)
|
|
# - Plugin: git, zsh-autosuggestions
|
|
# - Custom aliases: bt-reset (Bluetooth)
|
|
# - 17 environment variables (API keys)
|
|
# - NVM integration
|
|
# - Ctrl+Backspace → backward-kill-word
|
|
#
|
|
# API keys go into ~/.zshrc.local (NOT tracked in this repo).
|
|
# See config/shell/zshrc.local.example for the template.
|
|
# ===========================================================================
|
|
|
|
# ---- Install zsh ----
|
|
info "Installing zsh..."
|
|
if command -v zsh &>/dev/null; then
|
|
ok "zsh already installed: $(zsh --version | head -1)"
|
|
else
|
|
pkg_install zsh 2>/dev/null
|
|
fi
|
|
|
|
# ---- Install oh-my-zsh ----
|
|
info "Installing Oh My Zsh..."
|
|
if [ -d "$HOME/.oh-my-zsh" ]; then
|
|
ok "Oh My Zsh already installed."
|
|
else
|
|
# Non-interactive install (no chsh prompt)
|
|
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended 2>/dev/null || {
|
|
warn "Oh My Zsh install failed; trying without unattended flag."
|
|
# Fallback: set ZSH and clone directly
|
|
export ZSH="$HOME/.oh-my-zsh"
|
|
git clone --depth=1 https://github.com/ohmyzsh/ohmyzsh.git "$ZSH" 2>/dev/null || true
|
|
}
|
|
ok "Oh My Zsh installed."
|
|
fi
|
|
|
|
# ---- Install Powerlevel10k theme ----
|
|
info "Installing Powerlevel10k theme..."
|
|
if [ -d "${ZSH:-$HOME/.oh-my-zsh}/custom/themes/powerlevel10k" ]; then
|
|
ok "Powerlevel10k already installed."
|
|
else
|
|
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
|
|
"${ZSH:-$HOME/.oh-my-zsh}/custom/themes/powerlevel10k" 2>/dev/null || warn "p10k clone failed."
|
|
fi
|
|
|
|
# ---- Install zsh-autosuggestions plugin ----
|
|
info "Installing zsh-autosuggestions plugin..."
|
|
if [ -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" ]; then
|
|
ok "zsh-autosuggestions already installed."
|
|
else
|
|
git clone --depth=1 https://github.com/zsh-users/zsh-autosuggestions \
|
|
"${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" 2>/dev/null || warn "clone failed."
|
|
fi
|
|
|
|
# ---- Deploy .zshrc ----
|
|
info "Deploying .zshrc..."
|
|
CONFIG_DIR="${SCRIPT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}/config"
|
|
if [ -f "$HOME/.zshrc" ]; then
|
|
_bak_date=$(date +%Y%m%d)
|
|
cp "$HOME/.zshrc" "$HOME/.zshrc.bak.${_bak_date}" 2>/dev/null
|
|
warn "Backed up existing .zshrc to .zshrc.bak.${_bak_date}"
|
|
fi
|
|
cp "${CONFIG_DIR}/shell/zshrc" "$HOME/.zshrc"
|
|
ok ".zshrc deployed."
|
|
|
|
# ---- Deploy .p10k.zsh ----
|
|
info "Deploying .p10k.zsh..."
|
|
if [ -f "$HOME/.p10k.zsh" ]; then
|
|
_bak_date=$(date +%Y%m%d)
|
|
cp "$HOME/.p10k.zsh" "$HOME/.p10k.zsh.bak.${_bak_date}" 2>/dev/null
|
|
warn "Backed up existing .p10k.zsh"
|
|
fi
|
|
cp "${CONFIG_DIR}/shell/p10k.zsh" "$HOME/.p10k.zsh"
|
|
ok ".p10k.zsh deployed."
|
|
|
|
# ---- Deploy .zshrc.local (secrets template) ----
|
|
# This file should contain your API keys. The example file has placeholders.
|
|
# It is NOT sourced by default. To enable, uncomment the "source ~/.zshrc.local"
|
|
# line in your deployed .zshrc.
|
|
info "Installing .zshrc.local example..."
|
|
if [ ! -f "$HOME/.zshrc.local" ]; then
|
|
cp "${CONFIG_DIR}/shell/zshrc.local.example" "$HOME/.zshrc.local"
|
|
warn "Created ~/.zshrc.local from example. EDIT IT with your API keys."
|
|
else
|
|
ok ".zshrc.local already exists (keeping existing)."
|
|
fi
|
|
|
|
# ---- Change default shell to zsh ----
|
|
info "Setting zsh as default shell..."
|
|
if [ "$SHELL" != "$(which zsh)" ]; then
|
|
# Try chsh directly first, fallback to sudo chsh (for non-interactive provisioning)
|
|
if chsh -s "$(which zsh)" 2>/dev/null; then
|
|
ok "Default shell set to zsh. Log out and back in to activate."
|
|
elif sudo chsh -s "$(which zsh)" "$USER" 2>/dev/null; then
|
|
ok "Default shell set to zsh via sudo. Log out and back in to activate."
|
|
else
|
|
warn "Could not change shell (chsh). Run manually: chsh -s \"$(which zsh)\""
|
|
fi
|
|
else
|
|
ok "zsh is already the default shell."
|
|
fi
|
|
|
|
ok "Stage 04 complete: shell configured."
|