Skip to content

fix(git): time out cached commands - #559

Merged
sirmalloc merged 2 commits into
sirmalloc:mainfrom
SR0725:fix/git-cache-command-timeout
Sep 17, 2026
Merged

sirmalloc merged 2 commits into
sirmalloc:mainfrom
SR0725:fix/git-cache-command-timeout

Conversation

@SR0725

@SR0725 SR0725 commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

What changed

Git widgets use the cached command runner in src/utils/git.ts. On a cache miss, that runner called Git without a timeout, so a blocked Git process could also block the status line indefinitely.

This applies the existing five-second command boundary used by the other Git runner. A timeout still follows the current failure path: the widget gets no Git value and the result is cached normally.

Validation

  • bun test src/utils/__tests__/git.test.ts (53 passed)
  • bun test (1,868 passed)
  • bun run lint
  • bun run build

The regression assertion verifies that every cached Git command receives the five-second timeout. The compatibility risk is limited to Git commands that take longer than five seconds; those now return no widget value instead of blocking the process.

Fixes #557

SR0725 and others added 2 commits August 25, 2026 03:18
Resolve the overlapping Git timeout fixes from PRs sirmalloc#559 and sirmalloc#585 by
keeping SR0725's GIT_COMMAND_TIMEOUT_MS constant with the module settings
and retaining the timeout rationale from sirmalloc#585.

Both PRs implement the same five-second timeout and shared test assertion.
The resolution preserves the existing runtime behavior and SR0725's
original contribution in this branch's history.

Co-authored-by: SR0725 <[email protected]>
@sirmalloc
sirmalloc merged commit ef7f973 into sirmalloc:main Sep 17, 2026
3 checks passed
pcvelz added a commit to pcvelz/ccstatusline-usage that referenced this pull request Sep 25, 2026
Upstream: TUI kept off the render path (sirmalloc#575), flex mode default full (sirmalloc#590), usage cache fingerprinted by refresh token (sirmalloc#536), CLAUDE_CONFIG_DIR keychain credential first (sirmalloc#573), llms.txt (sirmalloc#527), faster terminal width probing (sirmalloc#501), git/jj symbol slots (sirmalloc#574), model-scoped 0% quota as real zero (sirmalloc#534), custom-command output cache + timeout (sirmalloc#539), usage-percent widgets on a shared module (sirmalloc#545), hideable reset-timer placeholders (sirmalloc#542), git command timeouts (sirmalloc#559, sirmalloc#585)

Hand edits outside conflicts:
- src/widgets/shared/usage-percent-widget.ts: compat fix - pass RenderContext to getUsageProgressBarWidth (fork narrow/medium bar widths) and add fork short labels WS:/WO: that the extracted Sonnet/Opus widgets used to render; point the fable-weekly kind at the fork field weeklyFableUsage / resolveWeeklyFableUsageWindow (upstream's fableUsage / resolveFableUsageWindow do not exist in the fork and crashed the render)
- .fork-keep-deleted: drop llms.txt (points agents at the upstream package and at docs the fork deletes)

Conflict resolutions that deviate from upstream on purpose:
- src/types/Settings.ts: keep fork default flexMode full-minus-40 (upstream sirmalloc#590 switched to full)
- src/utils/terminal.ts: keep fork tmux $TMUX_PANE width probe, ported to execFileSync; upstream's CCSTATUSLINE_WIDTH override in getTerminalWidth replaces the fork copy
- src/ccstatusline.ts: keep getTerminalWidth() without the per-session width cache options (fork invariant); add upstream customCommandCacheTtlSeconds
- src/widgets/WeeklyFableUsage.ts (+ test): keep fork widget (Fable:/F: labels, 0% for accounts without Fable, weeklyFableUsage field) instead of upstream's shared-module FableWeeklyUsage
- src/utils/__tests__/usage-fetch.test.ts: adopt upstream sirmalloc#534 real-zero semantics on the fork field weeklyFableUsage
- docs/test-retirements.md: ledger entries for four tests upstream renamed or replaced (sirmalloc#542, sirmalloc#534) and one duplicate upstream test dropped
- src/utils/__tests__/usage-fetch.test.ts: compat - upstream's model-scoped real-zero test expects the fork field weeklyFableUsage
- src/widgets/__tests__/WeeklyFableUsage.test.ts: compat - set the shared suite's new required expectedWholePercentTime
- src/tui/components/__tests__/ImportPreviewDialog.test.ts: fork deviation - default flexMode is full-minus-40, so the non-default side is full
- src/utils/__tests__/usage-fetch.test.ts: drop upstream's duplicate "missing fable window" test that used the upstream-only fableUsage field
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

No timeout on the cached git exec, unlike every other CLI call site (2.2.22)

2 participants