dot-add: guard against dotfiles self-reference, clean empty dirs after move
This commit is contained in:
16
dot-add
16
dot-add
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user