fix: handle directory entries in install — rm -rf, ln -sfn

This commit is contained in:
Kenji Morishige
2026-02-23 16:16:40 -06:00
parent 522b004632
commit 28794c040e
2 changed files with 9 additions and 7 deletions

View File

@@ -385,12 +385,13 @@ cmd_install() {
continue
fi
# Back up conflicting file
# Back up conflicting file/directory
if [ -e "$dest" ] && [ ! -L "$dest" ]; then
mkdir -p "$BACKUP_DIR/$(dirname "$rel")"
cp -a "$dest" "$BACKUP_DIR/$rel"
warn "Backed up existing $dest"
rm -f "$dest"
# rm -rf needed when $dest is a real directory (e.g. ~/.bashrc.d created manually)
if [ -d "$dest" ]; then rm -rf "$dest"; else rm -f "$dest"; fi
elif [ -L "$dest" ]; then
rm "$dest"
fi
@@ -404,7 +405,8 @@ cmd_install() {
fi
fi
ln -sf "$src" "$dest"
# -n: treat dest as a file (don't place link inside) if dest is a dir symlink
ln -sfn "$src" "$dest"
success "Linked: ~/$rel$src"
(( count++ )) || true
done < "$MANIFEST"
@@ -968,12 +970,12 @@ while IFS= read -r rel || [ -n "\$rel" ]; do
mkdir -p "\$BACKUP_DIR/\$(dirname "\$rel")"
cp -a "\$dest" "\$BACKUP_DIR/\$rel"
echo " Backed up: \$dest"
rm -f "\$dest"
if [ -d "\$dest" ]; then rm -rf "\$dest"; else rm -f "\$dest"; fi
elif [ -L "\$dest" ]; then
rm "\$dest"
fi
[[ "\$rel" == .ssh/* ]] && chmod 600 "\$src" 2>/dev/null || true
ln -sf "\$src" "\$dest"
ln -sfn "\$src" "\$dest"
echo " Linked: ~/\$rel"
done < "\$MANIFEST"