#!/bin/bash # --------------------------------------------------------------------------------- ## 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/fish/config.fish" "$HOME/.config/fish/config.fish" link_file "$DOTFILES_DIR/config/vim" "$HOME/.vim" link_file "$DOTFILES_DIR/config/kanata" "$HOME/.config/kanata" link_file "$DOTFILES_DIR/scripts/bin" "$HOME/.local/bin" 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 fuse3 # network & download wget curl ca-certificates gnupg rsync # core utilities fish git vim fd-find jq fzf ripgrep tree direnv make bat ark unzip p7zip-full tar gzip bzip2 xz-utils # build & dev tools build-essential valgrind nodejs # fonts fonts-noto-core fonts-noto-color-emoji # desktop portal xdg-desktop-portal xdg-desktop-portal-gtk ) MISSING_PACKAGES=() echo "๐Ÿ” Checking for missing packages..." echo "" # Check which packages are missing using dpkg for pkg in "${REQUIRED_PACKAGES[@]}"; do if ! dpkg -s "$pkg" >/dev/null 2>&1; then MISSING_PACKAGES+=("$pkg") fi done if [ ${#MISSING_PACKAGES[@]} -eq 0 ]; then echo "โœ… All required packages are already installed." else echo "๐Ÿ“ฆ Syncing package index..." sudo apt update echo "๐Ÿ“ฆ Installing missing packages: ${MISSING_PACKAGES[*]}" sudo apt install -y "${MISSING_PACKAGES[@]}" fi echo "" echo "โœ… Package setup complete." echo "" fi