5 repos · 20 commands · 3 broken · 0 slow · 5 filed
As a tool builder I linked grit-lib by path from a scratch cargo project (toolchain 1.99.0) on macOS and exercised open/discover, typed object and ref writing with CAS, threads, blame and status for an editor, kill -9 recovery, memory soak and git interop. The library is fast and its typed errors and validation are good, but I found and filed 5 issues: a status index refresh that silently reverts a concurrent commit's index (#2317), commits/tags with no blank line treated as corrupt (#2320), legacy 100664 tree modes giving phantom changes and a non-canonical index (#2322), write_tree not validating referenced objects (#2323), and blame_file resolving repo paths against the process cwd (#2325). All six 'fixed since last wave' issues re-verified (two only partially testable because they are Windows-specific).
| repo | files | commits | .git | notes |
|---|---|---|---|---|
| rust-lang/cargo | 3,078 | 23,596 | 87 MB | main benchmark repo; local clones for races and gc |
| gitbutlerapp/grit | 2,835 | 12,096 | 170 MB | built from here |
| octocat/Hello-World | 1 | 3 | 1 MB | notes and bundle interop |
| scratch/synthetic-3000 | 3,000 | 1,241 | 3 MB | repro_race.sh status-vs-commit repro |
| scratch/odd-objects (c1, tr1, val, col, evil) | 4 | 3 | 1 MB | hand-crafted commits/tags/trees, collision and malicious-name trees |
| command | repo | grit | git | grit/git | result | notes |
|---|---|---|---|---|---|---|
| grit status (clean) | rust-lang/cargo | 19 ms | 24 ms | 0.8× | ok | hyperfine -N; RSS 2.1x but tiny absolute |
| grit revs --count HEAD | rust-lang/cargo | 124 ms | 100 ms | 1.2× | ok | |
| grit log -n 50 | rust-lang/cargo | 3.8 ms | 4.0 ms | 0.9× | ok | |
| grit blame tests/testsuite/build.rs | rust-lang/cargo | 374 ms | 224 ms | 1.7× | ok | 1.7x slower; lib blame_file 304 ms in-process |
| grit diff HEAD~200 HEAD | rust-lang/cargo | 183 ms | 77 ms | 2.4× | ok | 2.4x, under the 3x threshold |
| grit show HEAD~5 | rust-lang/cargo | — | — | — | ok | |
| grit merge-base HEAD~500 origin/master | rust-lang/cargo | — | — | — | ok | |
| grit fsck | rust-lang/cargo | 870 ms | 4.15 s | 0.2× | ok | 4.8x faster than git fsck --no-dangling |
| grit clone (local path) | rust-lang/cargo | 260 ms | 285 ms | 0.9× | ok | |
| grit gc | rust-lang/cargo | 1.03 s | — | — | ok | 194,737 objects repacked, 24,299 commits in commit-graph; git fsck/commit-graph verify clean |
| grit commit (auto-stage) x ~500 while grit status polls | scratch/synthetic-3000 | — | — | — | wrong | 30 of 1240 commits leave a stale index (#2317) |
| grit log / revs / clone / gc / push on history with a message-less commit | scratch/odd-objects | — | — | — | error | #2320 |
| grit status / diff / commit on tree with 100664 mode | scratch/odd-objects | — | — | — | wrong | #2322 |
| lib: Repository::discover | rust-lang/cargo | 7.4 ms | — | — | ok | |
| lib: rev_walk().walk(HEAD) all commits (23,596) | rust-lang/cargo | 120 ms | 132 ms | 0.9× | ok | git rev-list HEAD | wc -l |
| lib: blame_file build.rs (7055 lines) | rust-lang/cargo | 304 ms | 225 ms | 1.4× | ok | RSS is whole-process incl. 50 MB from the preceding full walk |
| lib: status() default options | rust-lang/cargo | 19 ms | 27 ms | 0.7× | ok | second call 14 ms |
| lib: 8 parallel blame_file on shared Arc<Repository> | rust-lang/cargo | 317 ms | 1.13 s | 0.3× | ok | serial lib 1074 ms; git serial loop 1133 ms; results identical |
| lib: 1000-iteration mixed soak (walk, tree diff, blame, status) | rust-lang/cargo | 28.10 s | — | — | ok | RSS 170 MB after iteration 0, 299 MB at end; reopen-each-iteration 410 MB peak; plateaus |
| lib: 16 threads x 25 CAS ref updates on one ref | scratch/s2 | — | — | — | ok | 769 typed ExpectedMismatch retries; a few typed LockHeld after the default lock wait (git has the same 100 ms policy) |