#!/bin/bash # --------------------------------------------------------------------------------- ## Steps taken before running this script # --------------------------------------------------------------------------------- # * apt update && apt upgrade # * Setup SSH keys # * Download kanata binary # * Setup kanata to start on boot: # - sudo touch /lib/systemd/system/kanata.service # ``` # [Unit] # Description=Kanata keyboard remapper # Documentation=https://github.com/jtroo/kanata # # [Service] # Type=simple # ExecStart=/home/user/.cargo/bin/kanata --cfg /home/user/.config/kanata/config-name.kbd # Restart=never # # [Install] # WantedBy=default.target # ``` # * Clone dotfiles # * Install nerd font # * Remove firefox for Brave # * Setup gnome extensions # * [OPTIONAL] # * Install steam # * Install bob neovim manager [ curl -fsSL https://raw.githubusercontent.com/MordechaiHadad/bob/master/scripts/install.sh | bash ] # * Install latest version of golang # --------------------------------------------------------------------------------- ## GLOBAL VARS # --------------------------------------------------------------------------------- DOTFILES_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # --------------------------------------------------------------------------------- ## Parse arguments # --------------------------------------------------------------------------------- DO_LINKS=false DO_INSTALL=false CONFIRM_MODE=true # only true when no args are passed usage() { echo "Usage: $0 [-l] [-i]" echo " -l Only create symlinks (no confirmation)" echo " -i Only install system packages (no confirmation)" echo " (no args = do both, with confirmation)" exit 1 } if [ $# -eq 0 ]; then DO_LINKS=true DO_INSTALL=true CONFIRM_MODE=true else CONFIRM_MODE=false while getopts ":lih" opt; do case $opt in l) DO_LINKS=true ;; i) DO_INSTALL=true ;; h) usage ;; *) usage ;; esac done fi # --------------------------------------------------------------------------------- ## Helper function for linking # --------------------------------------------------------------------------------- link_file() { local src="$1" local dest="$2" if [ -L "$dest" ]; then if [ "$(readlink "$dest")" == "$src" ]; then echo "โœ… Symlink already correct: $dest โ†’ $src" ((SKIPPED++)) else echo "โš ๏ธ $dest is a symlink but points to the wrong target." echo " Replacing with correct symlink..." rm "$dest" ln -s "$src" "$dest" echo "๐Ÿ” Fixed: $dest โ†’ $src" ((CREATED++)) fi elif [ -e "$dest" ]; then echo "โš ๏ธ $dest exists but is not a symlink. Skipping." ((SKIPPED++)) else mkdir -p "$(dirname "$dest")" ln -s "$src" "$dest" echo "โœ… Linked: $dest โ†’ $src" ((CREATED++)) fi } # --------------------------------------------------------------------------------- ## LINK SYMLINKS # --------------------------------------------------------------------------------- if [ "$DO_LINKS" = true ]; then if [ "$CONFIRM_MODE" = true ]; then read -p "โ“ Do you want to create symlinks for your dotfiles? [y/N] " confirm case "$confirm" in [Yy]*) ;; # continue below *) DO_LINKS=false ;; esac fi fi if [ "$DO_LINKS" = true ]; then echo "๐Ÿ”— Checking and creating symlinks..." CREATED=0 SKIPPED=0 link_file "$DOTFILES_DIR/config/kanata" "$HOME/.config/kanata" link_file "$DOTFILES_DIR/config/fish" "$HOME/.config/fish" link_file "$DOTFILES_DIR/config/foot" "$HOME/.config/foot" link_file "$DOTFILES_DIR/config/nvim" "$HOME/.config/nvim" link_file "$DOTFILES_DIR/config/zed" "$HOME/.config/zed" link_file "$DOTFILES_DIR/config/gitu" "$HOME/.config/gitu" link_file "$DOTFILES_DIR/config/gtk3/gtk.css" "$HOME/.config/gtk-3.0/gtk.css" link_file "$DOTFILES_DIR/config/gtk4/gtk.css" "$HOME/.config/gtk-4.0/gtk.css" echo "" echo "๐Ÿงพ Summary: $CREATED symlink(s) created or fixed, $SKIPPED skipped." echo "" echo "โœ… Symlink setup complete." echo "" fi # --------------------------------------------------------------------------------- ## INSTALL SYSTEM PACKAGES # --------------------------------------------------------------------------------- if [ "$DO_INSTALL" = true ]; then if [ "$CONFIRM_MODE" = true ]; then read -p "โ“ Do you want to install system packages? [y/N] " confirm case "$confirm" in [Yy]*) ;; # continue below *) DO_INSTALL=false ;; esac fi fi if [ "$DO_INSTALL" = true ]; then REQUIRED_PACKAGES=( # system essentials wget curl git unzip fzf fd-find btop direnv ripgrep tree build-essential make bear valgrind fish # php dependencies composer php-cli php-common php-curl php-mbstring php-xml php-zip php-gd php-sqlite3 ) MISSING_PACKAGES=() echo "๐Ÿ” Checking for missing packages..." echo "" # Check which packages are missing using dpkg for pkg in "${REQUIRED_PACKAGES[@]}"; do # dpkg-query checks for the installed status. # We check for a non-zero exit status which indicates the package is NOT installed. if ! dpkg-query -W -f='${Status}' "$pkg" 2>/dev/null | grep -q "install ok installed"; then MISSING_PACKAGES+=("$pkg") fi done if [ ${#MISSING_PACKAGES[@]} -eq 0 ]; then echo "โœ… All required packages are already installed." else echo "๐Ÿ“ฆ Updating package lists..." # Update package lists before installing sudo apt update echo "๐Ÿ“ฆ Installing missing packages: ${MISSING_PACKAGES[*]}" # Use sudo apt install for installing on Debian sudo apt install "${MISSING_PACKAGES[@]}" fi echo "" echo "โœ… Package setup complete." echo "" fi