grit://cooking/dogfood← what’s cooking
Thursday, October 29, 2026 · Ubuntu 24.04 (Linux 6.12.94+)

Dogfood on linux-cloud: Automation and CI scripter

4 repos · 34 commands · 3 broken · 1 slow · 5 filed

As the automation/CI scripter I re-verified all six 'fixed' issues on current main (all genuinely fixed), then went after patch-id parity on real history, machine output (--json/--markdown/--filter/error kinds), env/config overrides, hooks, signals, concurrency, shallow/CI flows and grit serve token auth. Core flows are solid and fast; I filed 5 issues: two residual patch-id mismatches vs git, clone --json/--markdown leaking URL tokens, markdown output not escaping commit messages, and inconsistent JSON error kinds.

os
Ubuntu 24.04 (Linux 6.12.94+) · x86_64
machine
Cursor cloud VM, 4 vCPU Intel Xeon, 15 GB RAM
versions
grit 0.5.24 · main e84d7c9d · 2.43.0
repositories4
repofilescommits.gitnotes
rust-lang/cargo3,07823,59682 MB
git/git4,85782,616324 MB
octocat/Hello-World131 MB
scratch/patch-id, odd-names, env, hooks, race, gcrace, serve repos———synthetic repos under /tmp/dogfood
commandsgrit vs. system git, wall time
commandrepogritgitgrit/gitresultnotes
grit patch-id <300 cargo commits> vs git show|git patch-id --stablerust-lang/cargo207 ms917 ms0.2×wrong1/400 differs (#2291)
grit patch-id <1500 commits> vs git show|patch-idgit/git1.25 s5.77 s0.2×wrong3/1500 differ (#2292)
grit clone file:// (local)git/git24.91 s17.04 s1.5×ok1.5x time, 1.8x mem; result passes git fsck
grit fetch --tags (depth-1 clone)rust-lang/cargo6.51 s5.29 s1.2×memory2.3x git peak RSS; not filed (similar to known fetch memory issues)
grit clone --depth 1 -b 0.80.0 file://rust-lang/cargo390 ms——ok
grit status --jsongit/git10 ms10 ms1.0×ok
grit diff --json v2.40.0 v2.45.0git/git250 ms350 ms0.7×ok
grit log --json -n 5000git/git60 ms40 ms1.5×ok
grit revs --count HEADgit/git710 ms560 ms1.3×ok
grit blame --json revision.cgit/git820 ms920 ms0.9×ok
grit merge-base v2.40.0 v2.45.0git/git10 ms170 ms0.1×ok
grit log --json -n 20 -- builtin/log.cgit/git10 ms10 ms1.0×ok
git fsck --connectivity-only on grit-made clonegit/git—3.30 s—okclean
grit resolve HEAD (hyperfine -N)rust-lang/cargo2.1 ms0.8 ms2.6×ok2.6x; startup floor
grit log --json -n1rust-lang/cargo2.4 ms1.2 ms2.1×ok
grit cat HEAD:Cargo.tomlrust-lang/cargo2.3 ms1.2 ms1.9×ok
grit status --jsonrust-lang/cargo13 ms10 ms1.2×ok
grit diff --quietrust-lang/cargo5.0 ms2.8 ms1.8×ok
grit branch --jsonrust-lang/cargo2.3 ms0.8 ms2.9×ok2.9x, tiny absolute
grit tag --json (124 tags)rust-lang/cargo3.7 ms0.9 ms4.0×okgit number is a single-tag lookup, not equal work
grit --versionoctocat/Hello-World1.3 ms0.3 ms3.7×ok0.9 ms user time; 43 MB binary, 39,699 relative relocs
grit status --jsonoctocat/Hello-World2.4 ms1.2 ms2.0×ok
grit clone --json http://x:TOKEN@host/reposcratch/serve———wrongprints token (#2302)
grit push 60MB random over HTTP (grit serve, token)scratch/serve2.74 s2.54 s1.1×ok
grit clone 120MB over HTTP (grit serve, token)scratch/serve6.34 s6.92 s0.9×ok
grit gc x60 while 3x80 pushesscratch/gcrace4.10 s——ok0 failures, fsck clean (#2210 verified)
grit reflog expire x40 while 100 commitsscratch/rl———okno entries lost (#2286 verified)
grit push --force-with-lease=<rev> x8 parallel x3scratch/race———ok1 winner, 7 'stale' each round
grit push (same new ref) x8 parallel, plain and --atomicscratch/race———ok1 winner, 7 already_exists
grit switch --detach <old tag> + SIGTERMrust-lang/cargo———okclean cancel, nothing half-written
grit clone + SIGTERM/HUP/INTrust-lang/cargo———okdir removed; exit 130 for all
grit commit with commit.gpgsign=true, gpg.format=sshscratch/sg———oksigned like git
grit log/diff/show/status --json with non-UTF-8 and special file namesscratch/odd———okvalid JSON; non-UTF-8 as grit+pathhex: (documented)
grit <45 commands> --json / --markdown sweepscratch/sweep———okall JSON valid
worked8
  • ›All six previously fixed issues are really fixed on main (pull --ff-only exit 128, patch-id empty files/slide, clone signal cleanup, reflog expire locking, gc vs concurrent pushes).
  • ›Same-ref creation and force-with-lease races over local remotes: exactly one winner, typed 'already_exists'/'stale' reasons, repo fsck-clean.
  • ›Cancellation on SIGTERM during switch is clean ('operation cancelled', no half-written worktree, no lock left).
  • ›Hooks (pre-commit, commit-msg, post-commit, pre-push, pre-receive, post-receive) and GIT_PUSH_OPTION_* behave like git; nothing prompts or opens an editor or pager without a TTY, including under `script`.
  • ›Env/config overrides (author/committer env and dates, -c, -C, GIT_DIR/WORK_TREE, GIT_INDEX_FILE, alternates, ceiling dirs, core.worktree, env -i identity errors) match git; commit.gpgsign with ssh signing works.
  • ›Auth failures are non-interactive with documented kinds (auth_required, auth_rejected); GIT_ASKPASS, URL tokens and http.extraHeader all work against grit serve.
  • ›Every --json output I parsed was valid JSON, and status/log/diff fields agree with git, including special file names.
  • ›Performance on realistic repos is at or near git (status, diff, log, blame, merge-base, push/clone over HTTP); patch-id is 4-5x faster than git's pipeline.
problems11
  • ›Filed #2291: rename similarity differs from git (94 vs 95) so diff --json similarity and patch-id differ (cargo 9d6a94a55).
  • ›Filed #2292: patch-id differs for a plain insertion into a 437-line file (git/git t4201, commit 253118d1d99b), size dependent.
  • ›Filed #2302: clone --json / --markdown print the token from a user:token@host URL (release and main).
  • ›Filed #2303: show --markdown prints commit message bodies raw: unclosed ``` fence swallows the real sections, forged '## Changes' headings.
  • ›Filed #2304: --json unknown-revision errors have no kind on 12 commands (documented revision_not_found only from merge); bundle/init I/O errors do not name the path.
  • ›Not filed (minor): all signals during clone exit 130 (SIGTERM would be 143); other commands cancelled by SIGTERM exit 1, fetch has no handler (143, leaves tmp_pack_* like git).
  • ›Not filed (minor): `grit log >&-` (closed stdout) exits 0 silently; git exits 128 with a write error.
  • ›Not filed (documented): grit+pathhex: paths from status --json are not accepted by restore/cat/log/blame operands; --force-with-lease accepts only =<rev>, not git's =<ref>:<rev> (error is 'could not resolve revision main:<oid>').
  • ›Not filed: fetch --tags in a depth-1 cargo clone uses 419 MB vs git 180 MB (2.3x); `grit gc` prints 'Running garbage collection…' on stderr even when not a TTY; no -q on switch.
  • ›Not filed: startup floor of 1.3 ms for --version (git 0.35-0.7 ms) and 2-3x per tiny command; 58 failing readlink calls per log -n1. Under the 3x bar for equal work.
  • ›Not filed: config get returns only the last value of a multi-valued key (no --get-all); only --list shows all.
bugs filed5
#2291 #2292 #2302 #2303 #2304already reported: #2151 #2183 #2205 #1884
next time
  • ›Fix #2291/#2292, then rerun patch-id parity over all of cargo and git/git (--no-merges, ~80k commits) including renames with edits, copies and type changes.
  • ›Profile the 0.9 ms user-time startup floor (clap command tree, relocations, config discovery, readlink/statx storm) and test 5000-invocation loops with perf.
  • ›Retry kill -9 / OOM-kill during gc, repack and fetch on packed repos and check leftover tmp_pack/locks cleanup via gc; add SIGTERM during commit with hooks.
  • ›Over real smart-HTTP/ssh servers (not only grit serve): shallow push, receive.shallowUpdate, partial clone (--blobs none) CI flows, credential helpers, 413 limits.
  • ›Library angle: embed grit-lib in a CI tool with cancellation (ProgressSink::should_cancel on commit/add) and typed lock errors; check that the JSON error kinds are available as typed variants.
  • ›Re-test markdown renderers (log, reflog, stash, tag -a, notes, blame) with hostile messages/paths once #2303 is fixed.