Что наблюдается
TRIOS_RUN_DRIFT_GUARD=1 make drift-guard на чистом дереве не завершается. Два прогона по семь и одиннадцать минут, оба сняты вручную. sample в обоих случаях даёт один и тот же стек:
static ChatSSEEndToEndTests.runInterfaceDriftGuardCatchesSignatureMismatch() + 1396
git #1 (_:) in ...runInterfaceDriftGuardCatchesSignatureMismatch() + 680
-[NSConcreteTask waitUntilExit] (in Foundation)
Вывод набора стоит на месте: последняя строка не меняется десять минут.
Что уже исправлено и что это не вылечило
В файле было четыре помощника, дающих процессу Pipe() и не вычитывающих её (строки 6159, 6407, 6641, 7187). Труба держит около 64 КБ; заполнив её, git блокируется на записи, и waitUntilExit не возвращается. Это настоящая опасность, и все четыре заменены на FileHandle.nullDevice.
Зависание осталось. При заглушённом выводе git не может блокироваться на записи — значит он ждёт чего-то другого.
Что исключено
- Переполнение трубы — заменены все четыре, стек тот же.
- Подпись коммитов и глобальные хуки:
commit.gpgsign, gpg.program, core.hooksPath, init.templateDir — все пусты.
- Размер дерева: временный репозиторий в
NSTemporaryDirectory(), а не в проекте, так что git add -A там мгновенен.
Что стоит проверить дальше
standardInput процессам не задаётся, поэтому дитя наследует наш терминал. Любой запрос ввода (пароль, редактор, пейджер) повесит его навсегда. Проверить GIT_TERMINAL_PROMPT=0, GIT_PAGER=cat, standardInput = FileHandle.nullDevice.
- Какая именно из восьми команд висит:
init, config, add -A, commit, checkout -b. Печать команды перед запуском ответит за один прогон.
- Не держит ли кто-то замок: сценарий вызывает
git branch -D в настоящем репозитории (ProjectPaths.root), а не только во временном.
Почему это важно
Проверка, которая висит, хуже проверки, которая не может упасть: вторая молчит, первая съедает прогон целиком. drift-guard не входит в check и потому никем не запускался — обнаружено только аудитом «каким событием эту проверку можно уронить».
Что наблюдается
TRIOS_RUN_DRIFT_GUARD=1 make drift-guardна чистом дереве не завершается. Два прогона по семь и одиннадцать минут, оба сняты вручную.sampleв обоих случаях даёт один и тот же стек:Вывод набора стоит на месте: последняя строка не меняется десять минут.
Что уже исправлено и что это не вылечило
В файле было четыре помощника, дающих процессу
Pipe()и не вычитывающих её (строки 6159, 6407, 6641, 7187). Труба держит около 64 КБ; заполнив её, git блокируется на записи, иwaitUntilExitне возвращается. Это настоящая опасность, и все четыре заменены наFileHandle.nullDevice.Зависание осталось. При заглушённом выводе git не может блокироваться на записи — значит он ждёт чего-то другого.
Что исключено
commit.gpgsign,gpg.program,core.hooksPath,init.templateDir— все пусты.NSTemporaryDirectory(), а не в проекте, так чтоgit add -Aтам мгновенен.Что стоит проверить дальше
standardInputпроцессам не задаётся, поэтому дитя наследует наш терминал. Любой запрос ввода (пароль, редактор, пейджер) повесит его навсегда. ПроверитьGIT_TERMINAL_PROMPT=0,GIT_PAGER=cat,standardInput = FileHandle.nullDevice.init,config,add -A,commit,checkout -b. Печать команды перед запуском ответит за один прогон.git branch -Dв настоящем репозитории (ProjectPaths.root), а не только во временном.Почему это важно
Проверка, которая висит, хуже проверки, которая не может упасть: вторая молчит, первая съедает прогон целиком.
drift-guardне входит вcheckи потому никем не запускался — обнаружено только аудитом «каким событием эту проверку можно уронить».