v1.13.0
Исправлено
- Незакоммиченные правки больше не теряются молча при инкрементальном обновлении (Docker Desktop / Virtiofs на Windows). Раньше best-effort git-команды детекта (
staged/unstaged/untracked) при таймауте по медленной ФС возвращали пустой набор →git_fast_path=true, changed=0, и незакоммиченная правка.bslне попадала в индекс. Теперь таймаут/ошибка помечается как unreliable:_git_changed_files/_git_current_dirtyвозвращают_GitDirtyResult(paths, unreliable_reason), обновление уходит в корректный полный скан (по mtime+size), а в индекс пишется meta-флагgit_dirty_unreliable=1— он форсит полный скан и на следующем апдейте, пока не удастся снять надёжный dirty-снапшот. Прежний хорошийgit_dirty_pathsпри unreliable не затирается частичным набором. - CRLF vs LF (первопричина шторма re-parse). Рабоче-древесные diff переведены с
--name-onlyнаgit diff --numstat --ignore-cr-at-eol: только эта комбинация исключает файлы, отличающиеся лишь концом строки (индекс LF, Windows-checkout CRLF), —--name-onlyдаже с флагом продолжает их перечислять (проверено на git 2.50). Это снимает ложный re-parse всех ~21000 файлов, когда команда укладывается в таймаут.
Добавлено
RLM_UPDATE_INDEX_ON_START(default0) — Docker-entrypoint по умолчанию больше не пересчитывает индексы при каждом старте контейнера (на Windows/Virtiofs no-op инкремент занимал минуты на проект). Значение1восстанавливает прежнее поведение. Индекс всегда можно обновить вручную (rlm-bsl-index index update/rlm_index(action='update')).RLM_GIT_DIRTY_TIMEOUT(default120) — таймаут (секунды) best-effort git-команд детекта правок. Дефолт 120 выбран по натурным замерам (детект по CRLF-vs-LF дереву на Docker/Virtiofs ≈97с) — на меньшем пороге апдейт уходил бы в полный скан; для здоровых репозиториев безвреден (детект — секунды). Поднимается ещё выше для совсем крупных конфигураций на медленной ФС. Важно: на Windows + Docker Desktop даже 120с может не хватить (virtiofs слишком медленный) → каждыйupdateидёт полным сканом (корректно, но медленно), флагgit_dirty_unreliableзалипает в 1. Таймаут — это костыль; настоящее лечение — нормализация концов строк (.gitattributesс* text=auto eol=lf) или нативный Linux. См. docs/INDEXING.md и docs/INSTALL.md.- Наблюдаемость апдейта: результат
index updateнесётgit_fallback_reason(точная причина ухода в полный скан, без схлопывания в общий"git error") иrebuild_reason(для rebuild при смене builder-версии); CLIindex updateпечатаетFast path/Fallback/Rebuild. - WARNING про возможный рассинхрон EOL в логе полного скана, когда у git-индекса «изменилась» подозрительно большая доля модулей (>50% при ≥20 модулях) — с подсказкой про
.gitattributes/core.autocrlf.
Изменено
- Контракт
_git_changed_files/_git_current_dirty→_GitDirtyResult(paths, unreliable_reason)(NamedTuple). Сохранение dirty-снапшота во всех 4 callsite (build пустого/обычного индекса, fallback-апдейт, git fast path) унифицировано через общийIndexBuilder._save_dirty_snapshot(...). docker-entrypoint.sh: Stage 3 (обновление индексов) обёрнут вRLM_UPDATE_INDEX_ON_START; Stage 2.5 (миграция legacy-индексов) не тронут.- Доки:
docs/ENV_REFERENCE.md(обе новые переменные),docs/INSTALL.md(opt-in индексов при старте + блок-рекомендация по нормализации EOL для 1С-репозиториев под Docker),README.md,docs/QUICKSTART.md.
Тесты
tests/test_git_delta.py: контракт_GitDirtyResult(.paths/.unreliable_reason),RLM_GIT_DIRTY_TIMEOUT, схлопывание чисто-CRLF правок через--numstat --ignore-cr-at-eolпри сохранении реальной правки, цепочка unreliable→git_dirty_unreliable=1→полный скан→снятие флага, выставление флага на build без прежнего снапшота, сохранение прежнего снапшота при unreliable,git_fallback_reasonв delta.tests/test_bsl_index.py: уточнён слишком широкий ассертtest_update_returns_delta_stats(числовыми остаютсяadded/changed/removed; delta дополнительно несёт диагностические поля).
Обратная совместимость
BUILDER_VERSION = 12— без bump; формат индекса не менялся. Добавлен только аддитивный meta-ключgit_dirty_unreliable; его отсутствие в старых индексах трактуется как «надёжно» (prev_unreliable=False), поэтому существующие индексы продолжают использовать git fast path без изменений.- Без
RLM_UPDATE_INDEX_ON_START=1Docker-контейнеры коллег перестанут тратить минуты на пересчёт индексов при старте — это намеренное изменение поведения; кому нужно прежнее — выставляют флаг.
Полный список изменений: CHANGELOG.md