diff --git a/install.sh b/install.sh index ae48022..b619232 100755 --- a/install.sh +++ b/install.sh @@ -7,35 +7,89 @@ set -euo pipefail DOTFILES_DIR="$(cd "$(dirname "$0")" && pwd)" # --------------------------------------------------------------------------- -# Dependencies (Fedora) +# Detect Linux distribution # --------------------------------------------------------------------------- -DNF_PACKAGES=( - stow - # sway ecosystem - swayidle - # bar & notifications - mako - libnotify # notify-send - # terminal & launcher - fuzzel - # audio & display - wireplumber # wpctl - pipewire-utils # pactl - brightnessctl - alsa-utils # speaker-test - # screen recording - wf-recorder - slurp - zenity - ffmpeg # needs RPM Fusion: https://rpmfusion.org - # misc - jq - firefox -) +detect_distro() { + if [[ -f /etc/os-release ]]; then + . /etc/os-release + echo "$ID" + else + echo "unknown" + fi +} -echo "Installing dnf packages..." -sudo dnf install -y "${DNF_PACKAGES[@]}" +DISTRO=$(detect_distro) + +# --------------------------------------------------------------------------- +# Dependencies +# --------------------------------------------------------------------------- + +case "$DISTRO" in + fedora) + DNF_PACKAGES=( + stow + # sway ecosystem + swayidle + # bar & notifications + mako + libnotify # notify-send + # terminal & launcher + fuzzel + # audio & display + wireplumber # wpctl + pipewire-utils # pactl + brightnessctl + alsa-utils # speaker-test + # screen recording + wf-recorder + slurp + zenity + ffmpeg # needs RPM Fusion: https://rpmfusion.org + # misc + jq + firefox + ) + + echo "Installing packages for Fedora..." + sudo dnf install -y "${DNF_PACKAGES[@]}" + ;; + + arch) + PACMAN_PACKAGES=( + stow + # sway ecosystem + swayidle + # bar & notifications + mako + libnotify # notify-send + # terminal & launcher + fuzzel + # audio & display + wireplumber # wpctl + pipewire-pulse # pactl + brightnessctl + alsa-utils # speaker-test + # screen recording + wf-recorder + slurp + zenity + ffmpeg + # misc + jq + firefox + ) + + echo "Installing packages for Arch Linux..." + sudo pacman -S --noconfirm "${PACMAN_PACKAGES[@]}" + ;; + + *) + echo "ERROR: Unsupported distribution: $DISTRO" + echo "Supported distributions: fedora, arch" + exit 1 + ;; +esac # --------------------------------------------------------------------------- # Packages not in Fedora repos — install manually if missing @@ -86,8 +140,42 @@ fi echo "" echo "Stowing dotfiles..." + +# Check for conflicts before stowing +CONFLICTS=() for PACKAGE in "$DOTFILES_DIR"/*/; do PACKAGE="$(basename "$PACKAGE")" + + # Skip hidden directories and .git + [[ "$PACKAGE" == .* ]] && continue + + # Check if package has files that would conflict + while IFS= read -r -d '' dotfile; do + # Get the target path this would create + TARGET_PATH="${HOME}/${dotfile#$DOTFILES_DIR/$PACKAGE/}" + + # If target exists and is NOT a symlink to the correct location, it's a conflict + if [[ -e "$TARGET_PATH" ]] && [[ ! -L "$TARGET_PATH" ]]; then + CONFLICTS+=("$PACKAGE (file: $TARGET_PATH)") + fi + done < <(find "$DOTFILES_DIR/$PACKAGE" -type f -print0 2>/dev/null || true) +done + +if [[ ${#CONFLICTS[@]} -gt 0 ]]; then + echo "WARNING: Found conflicts with existing configs:" + for conflict in "${CONFLICTS[@]}"; do + echo " ✗ $conflict" + done + echo "" +fi + +# Stow all packages +for PACKAGE in "$DOTFILES_DIR"/*/; do + PACKAGE="$(basename "$PACKAGE")" + + # Skip hidden directories + [[ "$PACKAGE" == .* ]] && continue + echo " $PACKAGE" stow --dir="$DOTFILES_DIR" --target="$HOME" --restow "$PACKAGE" done