dotfiles

git clone https://github.com/notamitgamer/dotfiles.git
· rebuilt hourlyOpen on GitHub
root / install.sh

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"