Skip to content

make drift-guard не завершается никогда; четыре неслитые трубы убраны, причина не в них #1267

Description

@gHashTag

Что наблюдается

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 и потому никем не запускался — обнаружено только аудитом «каким событием эту проверку можно уронить».

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions