Make the init script idempotent

This commit is contained in:
Sami Samhuri 2025-09-20 12:53:48 -07:00
parent 1db9de17e1
commit aedd9edb9c
No known key found for this signature in database

60
init.sh
View file

@ -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!"