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

@@ -21,12 +21,12 @@ while IFS= read -r rel || [ -n "$rel" ]; do
mkdir -p "$BACKUP_DIR/$(dirname "$rel")" mkdir -p "$BACKUP_DIR/$(dirname "$rel")"
cp -a "$dest" "$BACKUP_DIR/$rel" cp -a "$dest" "$BACKUP_DIR/$rel"
echo " Backed up: $dest" echo " Backed up: $dest"
rm -f "$dest" if [ -d "$dest" ]; then rm -rf "$dest"; else rm -f "$dest"; fi
elif [ -L "$dest" ]; then elif [ -L "$dest" ]; then
rm "$dest" rm "$dest"
fi fi
[[ "$rel" == .ssh/* ]] && chmod 600 "$src" 2>/dev/null || true [[ "$rel" == .ssh/* ]] && chmod 600 "$src" 2>/dev/null || true
ln -sf "$src" "$dest" ln -sfn "$src" "$dest"
echo " Linked: ~/$rel" echo " Linked: ~/$rel"
done < "$MANIFEST" done < "$MANIFEST"

View File

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