From aedd9edb9c8b713918598e701b1abcc9a3850c6c Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Sat, 20 Sep 2025 12:53:48 -0700 Subject: [PATCH] Make the init script idempotent --- init.sh | 60 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/init.sh b/init.sh index c8fdb3b..8c4ee61 100755 --- a/init.sh +++ b/init.sh @@ -1,13 +1,17 @@ #!/bin/bash -BASENAME="${0##*/}" +# Get the directory where this script resides +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -if [ x"$1" != x ]; then - CONFIG_PATH="$1" -elif [ -d "${HOME}/config" ]; then - CONFIG_PATH="${HOME}/config" +# Use provided path or default to script directory +if [ -n "$1" ]; then + CONFIG_PATH="$(cd "$1" && pwd)" else - echo "Error: no config dir found" + CONFIG_PATH="$SCRIPT_DIR" +fi + +if [ ! -d "$CONFIG_PATH" ]; then + echo "Error: config directory not found: $CONFIG_PATH" exit 1 fi @@ -15,18 +19,46 @@ link_config() { SRC="$1" NAME=$(basename "$SRC") DEST="${HOME}/.${NAME}" - if [ -e "$DEST" ]; then - echo "Existing file found at ${DEST}, moving to ~/original-dot-files." - mkdir "${HOME}/original-dot-files" >/dev/null 2>/dev/null - mv "$DEST" original-dot-files/ + + # Check if destination exists + if [ -e "$DEST" ] || [ -L "$DEST" ]; then + # If it's already a symlink pointing to the right place, skip it + if [ -L "$DEST" ] && [ "$(readlink "$DEST")" = "$SRC" ]; then + echo "✓ ${DEST} already linked correctly" + return 0 + fi + + # Otherwise, back it up + echo "Backing up existing ${DEST} to ~/original-dot-files/" + mkdir -p "${HOME}/original-dot-files" + mv "$DEST" "${HOME}/original-dot-files/${NAME}.$(date +%Y%m%d_%H%M%S)" fi + + # Create the symlink ln -s "$SRC" "$DEST" + echo "→ Linked ${DEST} to ${SRC}" } -cd "$CONFIG_PATH" +# Files to exclude from symlinking +EXCLUDE_FILES=("init.sh" "zsh" "Brewfile", "CLAUDE.md") -for FILE in *; do - if [ "$FILE" != "init.sh" ] && [ "$FILE" != "zsh" ] && [ "$FILE" != "Brewfile" ]; then - link_config "${CONFIG_PATH}/$FILE" +echo "Creating symlinks from ${CONFIG_PATH}..." + +for FILE in "$CONFIG_PATH"/*; do + BASENAME=$(basename "$FILE") + + # Skip if file is in exclude list + SKIP=false + for EXCLUDE in "${EXCLUDE_FILES[@]}"; do + if [ "$BASENAME" = "$EXCLUDE" ]; then + SKIP=true + break + fi + done + + if [ "$SKIP" = false ] && [ -f "$FILE" ]; then + link_config "$FILE" fi done + +echo "Done!"