7 repos · 28 commands · 2 broken · 5 slow · 5 filed
As a new-CLI author on win-x64 I built a scratch front end on grit-lib's public API (op-log/undo, paged log, fetch progress, integrate with cancel, held-handle repack) and ran the CLI on cargo, git/git, and 22.5k/200k/5k-file synthetic repos. Library and CLI are largely solid on Windows (typed lock/in-use errors, rollback on locked files, long-lived handle survives repack, status/diff on 200k files faster than git), but I found a regression of #2190 (grit add rewrites packed blobs as loose: 71x slower), a case-collision status/diff mismatch, slow cancel rollback, and gaps for building undo on the library. Of the six fixed issues, five verified; #2278 still has 60% silent time.
| repo | files | commits | .git | notes |
|---|---|---|---|---|
| rust-lang/cargo | 3,078 | 23,596 | 81 MB | |
| git/git (bare) | 4,857 | 82,623 | 325 MB | 1020 refs; file count is ls-tree of HEAD |
| octocat/Hello-World | 1 | 3 | 0 MB | used for repack with open handle |
| scratch/wide-22.5k | 22,500 | 1 | 13 MB | 150 dirs; branch other changes every file (git fast-import) |
| scratch/flat-200k | 200,000 | 1 | 52 MB | all files in one directory |
| scratch/dup1-5k | 5,000 | 1 | 2 MB | branch mod packed with git gc; repro for #2328 |
| scratch/small (stk, cf, lock1, coll3, oplog3, racy) | 30 | 6 | 0 MB | stacked-branch, conflict, lock and case-collision fixtures |
| command | repo | grit | git | grit/git | result | notes |
|---|---|---|---|---|---|---|
| grit switch other (22.5k files) | scratch/wide-22.5k | 2.93 s | 5.46 s | 0.5× | ok | grit 1.9x faster |
| grit reset --hard <other> (22.5k files) | scratch/wide-22.5k | 11.57 s | 5.56 s | 2.1× | ok | 2.1x slower and 3.9x slower than grit's own switch; duplicate of #2311 (open) |
| grit stash (22.5k modified files) | scratch/wide-22.5k | 69.61 s | 7.58 s | 9.2× | slow | 9x slower; cause largely #2328 duplicate loose writes; also starts background gc --auto |
| grit stash pop (22.5k files) | scratch/wide-22.5k | 3.29 s | 6.59 s | 0.5× | ok | 50 s when a background gc --auto from the preceding grit stash is still running |
| grit add (22.5k modified, blobs already stored) | scratch/wide-22.5k | 35.05 s | 2.41 s | 15× | slow | #2328 |
| grit add (5k modified, blobs only in a pack) | scratch/dup1-5k | 10.92 s | 153 ms | 71× | slow | #2328: 5000 duplicate loose objects, 71x slower |
| grit status (clean) | scratch/flat-200k | 498 ms | 766 ms | 0.7× | ok | |
| grit diff | scratch/flat-200k | 243 ms | 330 ms | 0.7× | ok | |
| grit fetch origin (local path, full) | rust-lang/cargo | 13.73 s | 12.84 s | 1.1× | ok | git peak is the parent process only (children not counted); silent progress gaps are #2278 |
| library Remote::fetch local path with progress sink | rust-lang/cargo | 14.07 s | — | — | wrong | 60% of the run emits no progress events (#2278) |
| grit status | rust-lang/cargo | 122 ms | 45 ms | 2.7× | ok | 2.7x on a single cold run, under the 3x line |
| grit log -n 1000 --oneline | rust-lang/cargo | 26 ms | 44 ms | 0.6× | ok | |
| grit diff HEAD~50 HEAD | rust-lang/cargo | 62 ms | 71 ms | 0.9× | ok | |
| grit fsck | rust-lang/cargo | 1.81 s | 5.92 s | 0.3× | ok | |
| grit revs HEAD~5000..HEAD | rust-lang/cargo | 302 ms | 167 ms | 1.8× | ok | |
| grit merge-base HEAD~500 HEAD~3000 | rust-lang/cargo | 67 ms | 144 ms | 0.5× | ok | |
| library paged log, page 5000 (LogWalkCursor + load rows) | rust-lang/cargo | 229 ms | 276 ms | 0.8× | ok | |
| library full walk + load_commits_with_decorations | git/git (bare) | 1.46 s | 997 ms | 1.5× | ok | page 10000: 778 ms / 101 MB |
| grit log --json -n 100000 | git/git (bare) | 1.25 s | 997 ms | 1.3× | ok | 84 MB of JSON incl. full messages; git ran --format=%H%x09%an%x09%B |
| grit fsck | git/git (bare) | 16.48 s | 41.05 s | 0.4× | ok | |
| grit blame Makefile | git/git (bare) | 1.34 s | 1.08 s | 1.2× | ok | |
| grit log -n 1000 --oneline -- builtin/log.c | git/git (bare) | 2.99 s | 578 ms | 5.2× | slow | 5.2x; -n 200 -- Makefile 413 vs 89 ms (4.6x); duplicate of #1619 (macOS) now seen on Windows; no commit-graph in the clone |
| grit rebase main (3-branch stack, update-refs) | scratch/small (stk, cf, lock1, coll3, oplog3, racy) | — | — | — | ok | all three branches moved (#2213) |
| grit rebase conflict, --continue, history undo | scratch/small (stk, cf, lock1, coll3, oplog3, racy) | — | — | — | ok | #2274 fixed; stop leaves a dangling empty blob/tree (harmless) |
| grit switch with exclusively locked file | scratch/small (stk, cf, lock1, coll3, oplog3, racy) | 127 ms | — | — | ok | typed 'file is in use' message, nothing moved |
| grit switch collide; grit status; grit diff | scratch/small (stk, cf, lock1, coll3, oplog3, racy) | — | — | — | wrong | #2329: status clean, diff shows A.txt, no warning |
| library integrate_branch with FlagCancel at 500..2500 ms | scratch/wide-22.5k | 11.91 s | 2.94 s | 4.1× | slow | #2330: cancel@2500 returns after 11.9 s vs 2.9 s uncancelled; all runs roll back cleanly |
| grit repack -f with library handle open | octocat/Hello-World | 109 ms | 62 ms | 1.8× | ok | held Repository re-read objects after the pack was replaced |