mirror of
https://github.com/stablyai/orca.git
synced 2026-09-22 00:02:31 +00:00
* feat(file-explorer): show gitignored files with dimmed italic decoration Surfaces `.gitignore`d files in the right-sidebar file explorer with an italicised, dimmed filename and a CircleSlash icon in the same trailing slot used by the git status letter. A tracked change always wins — the ignored decoration only applies when no other git status is present. Gated behind a new `showGitIgnoredFiles` global setting (default on) so heavy SSH workspaces can keep the smaller payload by skipping `--ignored=matching` on `git status`. `ignoredPaths` lives as a peer field on GitStatusResult rather than an extension of GitFileStatus/GitStagingArea, so Source Control's staging-area grouping is untouched. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(file-explorer): trim redundant comments from gitignored decoration Removes duplicated "Why:" explanations that ended up restating the same backward-compat rationale across five files (relay, ssh provider, runtime git commands, RPC handler, renderer git client) plus a few comments that narrated the mechanism the code already shows. Net: -39 lines of comment across 10 files; no behavior change. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * chore(file-explorer): drop remaining comments from gitignored decoration The code reads well without them. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * review: harden gitignored file decorations - clear ignored decoration cache when ignored status is disabled or omitted - keep ignored decoration state scoped across worktree and runtime cleanup - add coverage for local, SSH, runtime, relay, and Explorer precedence --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { parseStatusOutput } from './git-status-output-parser'
|
|
|
|
describe('parseStatusOutput', () => {
|
|
it('parses upstream ahead/behind from porcelain v2 branch headers', () => {
|
|
const result = parseStatusOutput(
|
|
[
|
|
'# branch.oid abcdef1234567890',
|
|
'# branch.head feature/prompts',
|
|
'# branch.upstream origin/feature/prompts',
|
|
'# branch.ab +2 -3',
|
|
''
|
|
].join('\n')
|
|
)
|
|
|
|
expect(result.upstreamStatus).toEqual({
|
|
hasUpstream: true,
|
|
upstreamName: 'origin/feature/prompts',
|
|
ahead: 2,
|
|
behind: 3
|
|
})
|
|
})
|
|
|
|
it('reports no upstream when porcelain v2 omits branch.upstream', () => {
|
|
const result = parseStatusOutput(
|
|
['# branch.oid abcdef1234567890', '# branch.head feature/prompts', ''].join('\n')
|
|
)
|
|
|
|
expect(result.upstreamStatus).toEqual({ hasUpstream: false, ahead: 0, behind: 0 })
|
|
})
|
|
|
|
it('parses ignored porcelain records separately from actionable entries', () => {
|
|
const result = parseStatusOutput(['! dist/', '! .env', '? scratch.txt', ''].join('\n'))
|
|
|
|
expect(result.ignoredPaths).toEqual(['dist/', '.env'])
|
|
expect(result.entries).toEqual([
|
|
{ path: 'scratch.txt', status: 'untracked', area: 'untracked' }
|
|
])
|
|
})
|
|
})
|