Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/main/codex-accounts/runtime-home-service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ function createSettings(overrides: Partial<GlobalSettings> = {}): GlobalSettings
rightSidebarOpenByDefault: true,
sourceControlViewMode: 'list',
sourceControlGroupOrder: 'changes-first',
sourceControlCompareAgainstUpstream: false,
showTitlebarAppName: true,
showTasksButton: true,
floatingTerminalEnabled: false,
Expand Down
1 change: 1 addition & 0 deletions src/main/codex-accounts/service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ function createSettings(overrides: Partial<GlobalSettings> = {}): GlobalSettings
rightSidebarOpenByDefault: true,
sourceControlViewMode: 'list',
sourceControlGroupOrder: 'changes-first',
sourceControlCompareAgainstUpstream: false,
showTitlebarAppName: true,
showTasksButton: true,
floatingTerminalEnabled: false,
Expand Down
18 changes: 18 additions & 0 deletions src/main/git/status-porcelain-parser.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,24 @@ describe('StatusPorcelainParser', () => {
])
})

it('marks staged S... submodule rows as commit-changed gitlinks', () => {
const parser = new StatusPorcelainParser()
parser.update(
'1 M. S... 160000 160000 160000 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb flutter_mine\n',
0
)
parser.finish()

expect(parser.entries).toEqual([
{
path: 'flutter_mine',
status: 'modified',
area: 'staged',
submodule: { commitChanged: true, trackedChanges: false, untrackedChanges: false }
}
])
})

it('collects unmerged lines for async resolution rather than parsing inline', () => {
const parser = new StatusPorcelainParser()
parser.update('u UU N... 100644 100644 100644 100644 aa bb cc both.ts\n', 0)
Expand Down
22 changes: 15 additions & 7 deletions src/main/git/status-porcelain-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ export class StatusPorcelainParser {
// "2 XY sub mH mI mW hH X<score> path\torigPath"
const parts = line.split(' ')
const xy = parts[1]
const submodule = parseSubmoduleStatus(parts[2])
const indexStatus = xy[0]
const worktreeStatus = xy[1]

Expand All @@ -149,7 +148,7 @@ export class StatusPorcelainParser {
status: parseStatusChar(indexStatus),
area: 'staged',
oldPath,
...(submodule ? { submodule } : {})
...submoduleStatusField(parts[2], indexStatus)
})
}
if (worktreeStatus !== '.') {
Expand All @@ -158,7 +157,7 @@ export class StatusPorcelainParser {
status: parseStatusChar(worktreeStatus),
area: 'unstaged',
oldPath,
...(submodule ? { submodule } : {})
...submoduleStatusField(parts[2], worktreeStatus)
})
}
return
Expand All @@ -170,15 +169,15 @@ export class StatusPorcelainParser {
path,
status: parseStatusChar(indexStatus),
area: 'staged',
...(submodule ? { submodule } : {})
...submoduleStatusField(parts[2], indexStatus)
})
}
if (worktreeStatus !== '.') {
this.push({
path,
status: parseStatusChar(worktreeStatus),
area: 'unstaged',
...(submodule ? { submodule } : {})
...submoduleStatusField(parts[2], worktreeStatus)
})
}
}
Expand Down Expand Up @@ -207,14 +206,23 @@ export function parseStatusChar(char: string): GitStatusEntry['status'] {
}

export function parseSubmoduleStatus(
submoduleField: string | undefined
submoduleField: string | undefined,
statusChar = '.'
): GitStatusEntry['submodule'] {
if (!submoduleField?.startsWith('S')) {
return undefined
}
return {
commitChanged: submoduleField[1] === 'C',
commitChanged: submoduleField[1] === 'C' || (submoduleField === 'S...' && statusChar === 'M'),
trackedChanges: submoduleField[2] === 'M',
untrackedChanges: submoduleField[3] === 'U'
}
}

function submoduleStatusField(
submoduleField: string | undefined,
statusChar: string
): { submodule: GitStatusEntry['submodule'] } | {} {
const submodule = parseSubmoduleStatus(submoduleField, statusChar)
return submodule ? { submodule } : {}
}
Loading