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"