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

+60
View File
@@ -143,6 +143,63 @@ test_fresh_install_does_not_fold_config_into_kitty() {
assert_not_exists "$repo_root/kitty/.config/kitty/kitty.conf.bak"
}
test_existing_kitty_config_is_backed_up_and_does_not_abort_stow() {
local fixture repo_root home_dir backup
fixture="$(setup_fixture)"
repo_root="$fixture/repo"
home_dir="$fixture/home"
mkdir -p "$home_dir/.config/kitty"
# kitty создаёт конфиг сам, поэтому на чужой машине файл уже существует.
printf '%s\n' 'font_size 14' > "$home_dir/.config/kitty/kitty.conf"
run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >"$fixture/install.out"
[ -L "$home_dir/.config/kitty/kitty.conf" ] || fail "Expected managed kitty.conf symlink"
backup="$(find "$home_dir/.config/kitty" -maxdepth 1 -name 'kitty.conf.bak.*' -print -quit)"
[ -n "$backup" ] || fail "Expected backup of the pre-existing kitty.conf"
assert_file_contains "$backup" "font_size 14"
# Конфликт в одном пакете не должен обрывать stow целиком.
[ -L "$home_dir/.vimrc" ] || fail "Expected other packages to be stowed as well"
[ -L "$home_dir/.bash_custom" ] || fail "Expected install to continue past stow"
}
test_foreign_kitty_config_symlink_is_backed_up() {
local fixture repo_root home_dir backup target
fixture="$(setup_fixture)"
repo_root="$fixture/repo"
home_dir="$fixture/home"
mkdir -p "$home_dir/.config/kitty" "$fixture/elsewhere"
# Чужой симлинк для stow такой же конфликт, как обычный файл.
printf '%s\n' 'font_size 99' > "$fixture/elsewhere/my-kitty.conf"
ln -s "$fixture/elsewhere/my-kitty.conf" "$home_dir/.config/kitty/kitty.conf"
run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >"$fixture/install.out"
target="$(readlink -f "$home_dir/.config/kitty/kitty.conf")"
[ "$target" = "$(readlink -f "$repo_root/kitty/.config/kitty/kitty.conf")" ] \
|| fail "Expected managed kitty.conf, got $target"
backup="$(find "$home_dir/.config/kitty" -maxdepth 1 -name 'kitty.conf.bak.*' -print -quit)"
[ -n "$backup" ] || fail "Expected backup of the foreign kitty.conf symlink"
[ -L "$home_dir/.vimrc" ] || fail "Expected other packages to be stowed as well"
# Исходный файл за симлинком остаётся нетронутым.
assert_file_contains "$fixture/elsewhere/my-kitty.conf" "font_size 99"
}
test_rerun_does_not_backup_managed_kitty_config() {
local fixture repo_root home_dir backup
fixture="$(setup_fixture)"
repo_root="$fixture/repo"
home_dir="$fixture/home"
mkdir -p "$home_dir"
run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >"$fixture/install.out"
run_install "$repo_root" "$home_dir" env WSL_DISTRO_NAME= INSTALL_INTERACTIVE_MODE=never >"$fixture/install2.out"
[ -L "$home_dir/.config/kitty/kitty.conf" ] || fail "Expected managed kitty.conf symlink"
backup="$(find "$home_dir/.config/kitty" -maxdepth 1 -name '*.bak.*' -print -quit)"
[ -z "$backup" ] || fail "Rerun must not create backups of its own symlinks: $backup"
}
test_migrates_legacy_zed_config_symlink() {
local fixture repo_root home_dir legacy_config output mode
fixture="$(setup_fixture)"
@@ -539,6 +596,9 @@ main() {
test_fresh_install_uses_home_target
test_fresh_install_does_not_fold_config_into_kitty
test_existing_kitty_config_is_backed_up_and_does_not_abort_stow
test_foreign_kitty_config_symlink_is_backed_up
test_rerun_does_not_backup_managed_kitty_config
test_migrates_legacy_zed_config_symlink
test_stops_legacy_migration_when_listing_fails
test_does_not_migrate_unrelated_config_symlink