From 4759dc4d5facfb2e342c959fb553f4a16229116f Mon Sep 17 00:00:00 2001 From: Jonas H Date: Sat, 28 Feb 2026 00:09:41 +0100 Subject: [PATCH] dot-add: guard against dotfiles self-reference, clean empty dirs after move --- dot-add | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/dot-add b/dot-add index ced3a34..0ed2987 100755 --- a/dot-add +++ b/dot-add @@ -20,6 +20,8 @@ fi PACKAGE="$1" shift +MOVED_PARENTS=() + add_one() { local FILE FILE="$(realpath "$1")" @@ -34,17 +36,31 @@ add_one() { return 1 fi + # Prevent adding files that are already inside the dotfiles repo + if [[ "$FILE" == "$DOTFILES_DIR/"* ]]; then + echo "Error: '$1' resolves into the dotfiles repo (via symlink?) — skipping" >&2 + return 1 + fi + local REL="${FILE#$HOME/}" local DEST="$DOTFILES_DIR/$PACKAGE/$REL" mkdir -p "$(dirname "$DEST")" mv "$FILE" "$DEST" echo "Moved: $FILE -> $DEST" + MOVED_PARENTS+=("$(dirname "$FILE")") } for PATH_ARG in "$@"; do add_one "$PATH_ARG" done +# Remove any empty source directories so stow can create clean symlinks +for dir in "${MOVED_PARENTS[@]}"; do + if [[ -d "$dir" && -z "$(ls -A "$dir")" ]]; then + rmdir "$dir" + fi +done + stow --dir="$DOTFILES_DIR" --target="$HOME" --restow "$PACKAGE" echo "Stowed: $PACKAGE"