install.sh (4928B)
1 #!/usr/bin/env bash 2 # Restore my setup on a fresh Arch install (run in a GNOME session, as your normal user). 3 # curl -fsSL https://raw.cdn.amit.is-a.dev/notamitgamer/dotfiles/install.sh | bash 4 set -euo pipefail 5 6 CDN="https://raw.cdn.amit.is-a.dev/notamitgamer/dotfiles" 7 DOT="$HOME/.dotfiles" 8 STAMP="$(date +%Y%m%d-%H%M%S)" 9 10 say() { printf '\n\033[1;36m==> %s\033[0m\n' "$*"; } 11 warn() { printf '\033[1;33m[warn]\033[0m %s\n' "$*"; } 12 13 [ "$(id -u)" -ne 0 ] || { echo "Run as your normal user, not root."; exit 1; } 14 command -v pacman >/dev/null || { echo "This script is for Arch Linux."; exit 1; } 15 16 # copy src -> dst, keeping any existing dst as a .bak-<timestamp> 17 put() { 18 local src="$1" dst="$2" 19 [ -e "$src" ] || return 0 20 mkdir -p "$(dirname "$dst")" 21 if [ -e "$dst" ]; then mv "$dst" "$dst.bak-$STAMP"; fi 22 cp -a "$src" "$dst" 23 } 24 25 say "Downloading dotfiles" 26 rm -rf "$DOT.new"; mkdir -p "$DOT.new" 27 curl -fsSL "$CDN/dotfiles.tar.gz" | tar -xz -C "$DOT.new" 28 rm -rf "$DOT"; mv "$DOT.new" "$DOT" 29 cd "$DOT" 30 31 say "Packages (pacman)" 32 sudo pacman -Syu --needed --noconfirm 33 pkgs="$(tr '\n' ' ' < packages/pacman.txt)" 34 # shellcheck disable=SC2086 35 sudo pacman -S --needed --noconfirm $pkgs || { 36 warn "bulk install failed, retrying one by one" 37 for p in $pkgs; do sudo pacman -S --needed --noconfirm "$p" || warn "skipped $p"; done 38 } 39 40 if ! command -v yay >/dev/null; then 41 say "Installing yay (AUR helper)" 42 tmp="$(mktemp -d)" 43 git clone --depth 1 https://aur.archlinux.org/yay-bin.git "$tmp/yay-bin" 44 (cd "$tmp/yay-bin" && makepkg -si --noconfirm) 45 rm -rf "$tmp" 46 fi 47 say "AUR packages" 48 for p in $(cat packages/aur.txt); do yay -S --needed --noconfirm "$p" || warn "AUR skipped $p"; done 49 50 say "pipx tools" 51 export PATH="$HOME/.local/bin:$PATH" 52 pipx ensurepath >/dev/null 2>&1 || true 53 for p in $(cat packages/pipx.txt); do pipx install "$p" || warn "pipx skipped $p"; done 54 55 say "npm global tools" 56 npm config set prefix "$HOME/.local" 57 for p in $(cat packages/npm.txt); do npm install -g "$p" || warn "npm skipped $p"; done 58 59 say "zsh + oh-my-zsh + git" 60 [ -d "$HOME/.oh-my-zsh" ] || git clone --depth 1 https://github.com/ohmyzsh/ohmyzsh.git "$HOME/.oh-my-zsh" 61 put config/.zshrc "$HOME/.zshrc" 62 put config/.gitconfig "$HOME/.gitconfig" 63 if [ "$(basename "${SHELL:-}")" != zsh ]; then 64 chsh -s "$(command -v zsh)" || warn "run manually: chsh -s $(command -v zsh)" 65 fi 66 67 say "App configs" 68 put config/alacritty.toml "$HOME/.config/alacritty/alacritty.toml" 69 put config/fonts.conf "$HOME/.config/fontconfig/fonts.conf" 70 put config/starship.toml "$HOME/.config/starship.toml" 71 put config/nvim "$HOME/.config/nvim" 72 put config/micro "$HOME/.config/micro" 73 put config/gtk-3.0 "$HOME/.config/gtk-3.0" 74 put config/gtk-4.0 "$HOME/.config/gtk-4.0" 75 put config/vscode/settings.json "$HOME/.config/Code/User/settings.json" 76 put config/vscode/snippets "$HOME/.config/Code/User/snippets" 77 put wallpapers/background "$HOME/.config/background" 78 mkdir -p "$HOME/.local/bin" 79 for f in bin/*; do 80 if [ -f "$f" ]; then cp -a "$f" "$HOME/.local/bin/"; chmod +x "$HOME/.local/bin/$(basename "$f")"; fi 81 done 82 83 say "Fonts" 84 fc-cache -f >/dev/null 2>&1 || true 85 if ! fc-list | grep -qi "comic code"; then 86 warn "Comic Code is a paid font and is not in this repo. Copy its .otf files to ~/.local/share/fonts/ then run: fc-cache -f" 87 fi 88 89 say "Theme and icons" 90 mkdir -p "$HOME/.themes" "$HOME/.local/share/icons" 91 [ -d themes/ColdMetal-NoLogo ] && cp -a themes/ColdMetal-NoLogo "$HOME/.themes/" 92 if [ ! -d "$HOME/.local/share/icons/Tela-manjaro-dark" ]; then 93 tmp="$(mktemp -d)" 94 git clone --depth 1 https://github.com/vinceliuice/Tela-icon-theme.git "$tmp/tela" 95 (cd "$tmp/tela" && ./install.sh manjaro) || warn "Tela icon install failed" 96 rm -rf "$tmp" 97 fi 98 99 say "GNOME extensions" 100 if command -v gext >/dev/null && [ -n "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then 101 while read -r uuid; do 102 if [ -n "$uuid" ]; then gext install "$uuid" || warn "extension skipped: $uuid"; fi 103 done < gnome/extensions.txt 104 else 105 warn "Not in a GNOME session (or gext missing). Log in to GNOME and re-run this script." 106 fi 107 108 say "GNOME settings (dconf)" 109 for f in gnome/*.dconf; do 110 b="$(basename "$f" .dconf)" 111 case "$b" in 112 ext_*) path="/org/gnome/shell/extensions/${b#ext_}/" ;; 113 shell) path="/org/gnome/shell/" ;; 114 *) path="/org/gnome/$(echo "$b" | tr _ /)/" ;; 115 esac 116 dconf load "$path" < "$f" || warn "dconf failed for $path" 117 done 118 119 say "VS Code extensions" 120 if command -v code >/dev/null; then 121 while read -r ext; do 122 [ -n "$ext" ] || continue 123 code --install-extension "$ext" --force >/dev/null 2>&1 || warn "extension skipped: $ext" 124 done < packages/vscode-extensions.txt 125 fi 126 127 say "Done. Still manual:" 128 echo " - gh auth login, and restore your SSH/GPG keys from your private backup" 129 echo " - Comic Code font, Obsidian vault, Firefox Sync sign-in" 130 echo " - Log out and back in so the shell, theme and extensions all apply"