dot-add: guard against dotfiles self-reference, clean empty dirs after move

This commit is contained in:
Jonas H
2026-02-28 00:09:41 +01:00
parent 45c334ad92
commit 4759dc4d5f

16
dot-add
View File

@@ -20,6 +20,8 @@ fi
PACKAGE="$1" PACKAGE="$1"
shift shift
MOVED_PARENTS=()
add_one() { add_one() {
local FILE local FILE
FILE="$(realpath "$1")" FILE="$(realpath "$1")"
@@ -34,17 +36,31 @@ add_one() {
return 1 return 1
fi 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 REL="${FILE#$HOME/}"
local DEST="$DOTFILES_DIR/$PACKAGE/$REL" local DEST="$DOTFILES_DIR/$PACKAGE/$REL"
mkdir -p "$(dirname "$DEST")" mkdir -p "$(dirname "$DEST")"
mv "$FILE" "$DEST" mv "$FILE" "$DEST"
echo "Moved: $FILE -> $DEST" echo "Moved: $FILE -> $DEST"
MOVED_PARENTS+=("$(dirname "$FILE")")
} }
for PATH_ARG in "$@"; do for PATH_ARG in "$@"; do
add_one "$PATH_ARG" add_one "$PATH_ARG"
done 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" stow --dir="$DOTFILES_DIR" --target="$HOME" --restow "$PACKAGE"
echo "Stowed: $PACKAGE" echo "Stowed: $PACKAGE"