fix(tools): add spawnSync timeout to local git calls #44
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Контекст
PR#41 (issue #40) добавил
timeout: 5000кresolveForgejoRepospawnSync("git", ...)в_shared.ts:49. Но другиеspawnSync("git", ...)вызовы в TS-тулах — без timeout. Локальный git обычно быстрый, ноgit pullна медленном remote,git checkoutна FUSE/NFS, илиgit commitс большим diff могут hang'ать.Проблемные call sites:
merge-pr.ts:61,67,71,78,79,96—git()helper (6 вызовов: branch --list, rev-parse, checkout, pull, branch -D) без timeout.create-pr.ts:62—spawnSync("git rev-parse --abbrev-ref HEAD")без timeout.commit.ts:16,42,53—spawnSync("git", ...)(log, diff --cached, commit) без timeout.Задача
merge-pr.ts—git()helper (строки 5-7, используется на 61,67,71,78,79,96): добавитьtimeout: 10000(10с) кspawnSyncoptions.create-pr.ts:62—spawnSync("git rev-parse --abbrev-ref HEAD"): добавитьtimeout: 5000(5с, быстрая операция).commit.ts:16,42,53—spawnSync("git", ...)(log, diff --cached, commit): добавитьtimeout: 10000(10с).git commitможет быть медленным с pre-commit hooks.spawnSyncвозвращаетsignal: 'SIGTERM'— обработать: вернуть читаемую ошибку[git] <cmd> timed out after Nmsвместо пустого stdout.Контракты
spawnSync(cmd, args, { encoding: "utf-8", timeout: N })— Node/Bun spawnSync поддерживаетtimeoutопцию.result.signal === 'SIGTERM',result.status === null. Нужно проверитьresult.signalи вернуть ошибку.git()helper вmerge-pr.ts— если получает timeout, должна вернуть ошибку (не throw — merge-pr должен graceful-fail с сообщением).commit.ts—git commitс pre-commit hooks может занять >10с. Рассмотреть 30с для commit. Ноgit log/git diff --cached— 10с достаточно.Инварианты
timeoutoption).git pull(merge-pr.ts:78) — 10с может быть tight на медленном remote. Ноgit pullна origin (local network / Forgejo) обычно <5с. Если tight — оставить 10с + retry на уровне выше.git commitс hooks — 10с может быть tight. Рассмотреть 30с для commit specifically.Граничные случаи
git pullна медленном remote (Forgejo за Nginx, медленный response) — 10с timeout, затем merge-pr fails с читаемой ошибкой. Агент может retry.git commitс pre-commit hooks (ruff, mypy) — может занять 30-60с на большом репо. 10с слишком мало. Рассмотретьtimeout: 30000для commit.git checkoutна FUSE/NFS mount — может hang. 10с timeout спасает.spawnSynctimeout убивает процесс SIGTERM — git может оставить.git/index.lock. Нужно упомянуть в ошибке (агент может удалить lock).Влияние на связанные компоненты
merge-pr— все 6 git() вызовов получают timeout. Merge-pr теперь fails fast вместо hang.create-pr— git rev-parse получает timeout.commit— git log/diff/commit получают timeout. Commit с hooks может нуждаться в большем timeout.Вне scope
subprocess.rungit calls (pipeline-status.py:42,377; spec-status.py:61,159; project-status.py:69,237) — issue Волны 1 (Python oracles).resolveForgejoRepoв_shared.ts— уже пофикшен в PR#41 (timeout: 5000).Критерии приемки
merge-pr.tsgit()helper имеетtimeout: 10000(все 6 call sites).create-pr.ts:62spawnSyncимеетtimeout: 5000.commit.ts:16,42,53spawnSyncимеетtimeout: 10000(или 30000 для commit).result.signal === 'SIGTERM') — читаемая ошибка[git] <cmd> timed out after Nms.