fix(install): чужой конфиг kitty больше не срывает stow целиком

- Зачем:
  - при существующем ~/.config/kitty/kitty.conf stow печатал
    "All operations aborted" и откатывал все пакеты, а install.sh падал
    по pipefail, не дойдя до настройки claude, opencode и .bashrc.
- Что:
  - добавлена backup_conflicting_kitty_files: неуправляемые файлы и чужие
    симлинки в ~/.config/kitty уносятся в .bak с временной меткой перед stow.
  - собственные симлинки пакета пропускаются, поэтому повторный запуск
    install.sh не плодит бэкапы.
  - добавлены тесты на существующий файл, чужой симлинк и повторный запуск.
  - из таблицы пакетов README убран zed: он не в PACKAGES с ab4c7c7.
- Проверка:
  - bash tests/test_install.sh
This commit is contained in:
ddadmin committed 2026-07-26 17:43:18 +03:00
1 parent 91592c5893
commit 6610adeac5
3 files changed
+99 -1

No files matched your search

+39
View File
@@ -169,6 +169,43 @@ migrate_claude_stow_symlink() {
fi
}
# Убрать с пути чужие файлы конфигурации kitty: kitty создаёт их сам, и без
# бэкапа stow отказывается ставить весь набор пакетов ("All operations
# aborted"), а не только kitty.
backup_conflicting_kitty_files() {
local src_dir="$DOTFILES_DIR/kitty/.config/kitty"
local dst_dir="$HOME/.config/kitty"
local src=""
local dst=""
local base=""
local src_real=""
local dst_real=""
[ -d "$src_dir" ] || return 0
[ -d "$dst_dir" ] || return 0
[ ! -L "$dst_dir" ] || return 0
for src in "$src_dir"/*; do
[ -e "$src" ] || continue
base="$(basename "$src")"
dst="$dst_dir/$base"
# -L отдельно от -e: битый симлинк для stow тоже конфликт.
[ -e "$dst" ] || [ -L "$dst" ] || continue
# Симлинк на наш же файл — это результат прошлого прогона, не трогаем.
if [ -L "$dst" ]; then
src_real="$(readlink -f "$src" 2>/dev/null || true)"
dst_real="$(readlink -f "$dst" 2>/dev/null || true)"
if [ -n "$src_real" ] && [ "$src_real" = "$dst_real" ]; then
continue
fi
fi
backup_existing_path "$dst" "~/.config/kitty/$base"
done
}
# Миграция: раскрыть старую stow-ссылку ~/.config -> zed/.config.
# В пакете zed остаётся только управляемый каталог zed; остальные настройки
# возвращаются в домашний каталог и больше не попадают в репозиторий.
@@ -341,6 +378,8 @@ if [ -d "$HOME/.config" ] && [ ! -L "$HOME/.config" ] \
mkdir -p "$HOME/.config/kitty"
fi
backup_conflicting_kitty_files
if [ "${#AVAILABLE_PACKAGES[@]}" -gt 0 ]; then
stow_package "${AVAILABLE_PACKAGES[@]}"
fi