Files
orca/docs/reference/git-compatibility.md
T
Neilandkaluli123123 80a52bb9b3 fix(git): recover commit ref badges on Git older than 2.43 (#17923)
GIT_HISTORY_COMMIT_FORMAT asked for decorations with %(decorate:…), which
Git 2.43 introduced. Older Git prints the placeholder verbatim and exits
zero, so nothing raised and every commit in the Source Control panel
silently lost its branch, remote and tag badges.

The record now also carries %D (Git 2.10) on its own line, selected by an
exact match against the unexpanded placeholder — a ref name can never
contain the \x1f that Git expands inside the echoed text. %n emits the %D
line on both sides of the boundary, so the message index is fixed and a
missed match degrades to no badges rather than a corrupted message.

The decoration separator is now bound to the field that produced the text
instead of sniffed from it. A lone decoration carries no separator, so the
old sniff split `refs/heads/feat,one` into two bogus refs.

Verified against real Git 2.38.1 and 2.49.1.

Co-authored-by: kaluli123123 <295758798+kaluli123123@users.noreply.github.com>
2026-09-01 17:14:57 -07:00

6.0 KiB
Raw Blame History

Git Compatibility Policy

Scope

Orca executes the user's Git binary on three kinds of execution host: native, WSL, and SSH. Each host can have a different Git version, so compatibility state must be scoped to the host that actually runs the command.

Git 2.25 is the core-workflow compatibility baseline for command selection. It is the oldest line that covers Orca's baseline use of porcelain v2, branch --show-current, restore, and sparse checkout. Optional features that need a newer Git must degrade safely and cache the missing capability. Orca does not currently block older Git at startup, but new command construction should not assume features introduced after this baseline.

Capability Rules

When a newer Git feature materially improves correctness or performance:

  1. Keep a baseline-compatible command or parser as the fallback.
  2. Detect rejection with a narrow predicate for that option or subcommand.
  3. Run the preferred command through GitCapabilityCache so a rejection is remembered for the native host, WSL distro, or SSH provider that produced it.
  4. Retry after the cache interval so an in-place Git upgrade self-heals without restarting Orca.
  5. Test the first fallback, later calls that skip the rejected probe, concurrent probe coalescing, and execution-host isolation where applicable.

Do not branch only on a parsed git --version. Vendor builds can backport features, and wrappers can report a host version that differs from the binary used inside WSL or SSH. A behavior probe plus a precise fallback is the final authority.

Current Capabilities

Capability Preferred behavior Compatibility behavior
fetch-no-write-fetch-head Fetch a private rebase ref without changing worktree-local FETCH_HEAD Serialize all Orca fetch/pull operations per worktree Git directory before Git 2.29
worktree-list-z NUL-delimited worktree paths with prunable marks Line-block parser for Git before worktree list -z (2.36); the prunable/locked annotations still parse on Git 2.312.35, and a path-existence probe restores prunable detection for Git before 2.31
rev-parse-path-format Absolute repo metadata paths Resolve legacy relative output against the scanned repo
for-each-ref-exclude Exclude remote HEAD before the output limit Request extra refs, then filter remote HEAD in Orca
merge-tree-write-tree Derive real-merge conflicts and no-op tree proofs Omit the conflict summary and keep conservative branch cleanup behavior before Git 2.38
merge-tree-merge-base Supply the already-resolved merge base Use the older two-commit merge-tree --write-tree form

Placeholders That Fail Open

GitCapabilityCache records commands Git rejects. A git log --format placeholder Git does not know is not rejected: Git echoes it verbatim and exits zero, so there is no error to remember and no probe to cache. Ask for both forms in one record and pick at parse time.

Placeholder Preferred behavior Compatibility behavior
%(decorate:…) Git 2.43 separates commit decorations with \x1f, so ref names containing commas survive The same record also carries %D (Git 2.10); an unexpanded %(decorate placeholder selects it, at the cost of comma-splitting

Why Not simple-git

simple-git is a process wrapper around the installed Git binary. Its custom options and raw API pass arguments through to Git, so it cannot make a newer flag work on an older binary or choose Orca's semantic fallback automatically. It provides version reporting and subprocess queueing, but Orca already needs its own WSL/SSH routing, cancellation, tracing, redaction, process cleanup, and bounded output handling. Replacing the runner would move—not remove—the capability problem.

CI Contract

PR checks run the capability contract against real Git 2.25.5, 2.38.1, and 2.49.1 binaries. This spans the pre-2.29 serialized FETCH_HEAD fallback, the transitional merge-tree --write-tree behavior before --merge-base, and current Git.

Keep the unit tests alongside that matrix. They cover concurrent probes, native/WSL/SSH/relay isolation, and error-stream shapes that a single real binary invocation cannot exercise deterministically.