- expandSubmodules now fans out with Promise.all over the dirty
submodules and concatenates results in input order, so the polled
status endpoint no longer pays serial git status/rev-parse spawns
(P1).
- submoduleForPath bails out before spawning git config when the path
contains no '/' or the repo has no .gitmodules, removing a spawn
from every diff call in plain repos (P2).
- Rename submodulePaths() to configuredSubmodulePaths() and the
expandSubmodules local to dirtySubmodulePaths to disambiguate the
two concepts (N2).
- parseStatus: detect staged submodule pointer moves by comparing the
recorded HEAD/index OIDs (porcelain reports S... for a staged move, so
the c flag never fires); staged moves previously vanished from the
status response (PR #92 review finding B1).
- parseStatus: keep deleted gitlinks (index or working tree) as plain
deletion rows instead of deferring them as submodules. Unstaged
deletions vanished entirely, and staged deletions would render as a
bogus pointer move to the zero OID. The finding assumed N... porcelain;
git 2.54 actually emits .D/D. S... (finding S3's stated outcome).
- submodulePaths: parse 'git config -z' records so submodule paths with
spaces survive .gitmodules key parsing instead of splitting lines at
the first space (finding S1).
- tests: strip inherited GIT_* env vars in the fixture helper so the
suite also passes when run from a git hook (pre-commit sets GIT_DIR).
Adds real-git fixture tests for staged moves, staged+dirty combos,
deleted submodules, inner renames, and spaced submodule/file paths.
Recurse into dirty submodules when building the Git status so their
modified and untracked files appear as full-path entries, and add a
commit-pointer entry (with short SHAs) only when the recorded commit
actually moved. Route diffs whose path falls inside a submodule to run
in that submodule's working tree so real per-file diffs are shown.
The changed-file list groups these under the submodule: tree view keeps
the nested structure and marks the submodule root with a badge, list
view flattens them into one expandable group pinned above the ordinary
files. Depth 1 only; ignored files are excluded; the panel stays
read-only.
Covered by client tree/list-grouping tests, parser tests, and a
server test that drives a real temporary repository and submodule.