Skip to content

Reduce amount of git processes#663

Open
lgeiger wants to merge 2 commits into
IlanCosman:mainfrom
lgeiger:reduce-git-processes
Open

Reduce amount of git processes#663
lgeiger wants to merge 2 commits into
IlanCosman:mainfrom
lgeiger:reduce-git-processes

Conversation

@lgeiger

@lgeiger lgeiger commented Jun 15, 2026

Copy link
Copy Markdown

Description

This PR reduces the amount of git processes required to populate the prompt from 5 to 3.

Motivation and Context

Currently querying the git status launches 5 git processes. This can be quite slow especially on larger repos. This PR removes the need to call git rev-list --count --left-right @{upstream}...HEAD and instead reads the necessary information from git --no-optional-locks status --porcelain --branch directly. I also moved the fallback code such that we do not need to call git branch --show-current in the default case where we're on a normal branch. This reduces the number of spawned git processes to 3:

main:

git branch --show-current
git rev-parse --git-dir --is-inside-git-dir
git --no-optional-locks status --porcelain
git stash list
git rev-list --count --left-right @{upstream}...HEAD

This PR:

git rev-parse --git-dir --is-inside-git-dir
git --no-optional-locks status --porcelain --branch
git stash list

Best to review commit by commit. Let me know if you prefer to split the commits into separate PRs

How Has This Been Tested

  • I have tested using Linux.
  • I have tested using MacOS.

Checklist

  • I am ready to update the wiki accordingly.
  • I have updated the tests accordingly.

@lgeiger
lgeiger requested a review from IlanCosman as a code owner June 15, 2026 15:27
plttn added a commit to plttn/tide that referenced this pull request Jul 8, 2026
## Summary
Ports the git-subprocess-reduction optimization from
[IlanCosman/tide#663](IlanCosman/tide#663) (by
[@lgeiger](https://github.com/lgeiger), still open upstream) into this
fork's git fallback path in `functions/_tide_item_vcs.fish`.

When git/jj got unified into `_tide_item_vcs` (`v7.0.13`), the
git-handling logic was carried over verbatim from the old pre-#663
`_tide_item_git.fish` — 5 git processes per render (`git branch
--show-current`, `git rev-parse --git-dir --is-inside-git-dir`, `git
status --porcelain`, `git stash list`, `git rev-list --count
--left-right @{upstream}...HEAD`). This never got the upstream fix since
that PR hasn't merged.

Adding `--branch` to `git status --porcelain` puts a header line first
in the output (e.g. `## main...origin/main [ahead 2, behind 1]`) that
already contains the branch name and ahead/behind counts, eliminating
two of the five calls:
- Branch name is now parsed from that header (falling back to the old
branch/tag/detached-HEAD cascade only when the header doesn't yield a
usable name, e.g. detached HEAD)
- Ahead/behind come from a regex lookbehind on the same header instead
of a separate `git rev-list` call
- `git stash list` stays, since `git status` can't report stash count

Result: 3 git processes instead of 5, same observable output. Only the
git fallback path is touched — the jj path (`_tide_internal_jj_git`) is
untouched.

## Test plan
- [x] `mise run lint` / `fish_indent --check` pass
- [x] `mise run test` — full suite passes, including
`_tide_item_vcs.test.fish` (branch names, detached HEAD, tags,
ahead/behind, stash, staged/dirty/untracked, submodules,
massive-status-repo)
- [x] Updated the massive-status-repo test fixture to mock `--branch`
and return a synthetic `## main` header line, matching upstream's own
test update in #663

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
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.

1 participant