Epic: madtea has no way to stay current with the git binary #526
Labels
No labels
breaking
bug
documentation
enhancement
epic
good first issue
help wanted
refactoring
resolution/duplicate
resolution/invalid
resolution/wontfix
security
severity/critical
severity/high
severity/low
severity/medium
status/abandoned
status/blocked
status/needs-decision
status/needs-info
status/needs-verification
testing
upstream
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Depends on
#524 git: pin the git output contract and declare a minimum git version
sixfold-space/madtea
#525 ci(drift): run the git-touching tests against a git version matrix on the cron
sixfold-space/madtea
Reference
sixfold-space/madtea#526
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The gap
madtea depends on two upstreams. Only one of them is watched.
The forge APIs are watched.
.forgejo/workflows/drift.ymlcatches "regressions that appear WITHOUT the code changing". It walks the gitea client AST, extracts every endpoint madtea calls, and asserts each one exists in a vendored spec (docs/api-specs/: Gitea 1.25, Gitea 1.26-dev, Forgejo 14). A second job runs about 60 CLI commands against a live Forgejo in a sidecar. #504 is what a miss looks like there, and the mechanism is why it is visible at all.The git binary is not watched. madtea shells out to git and parses what it prints (
internal/service/git/, about 25 source files; nogo-gitor libgit2 ingo.mod). Against that dependency there is:--versioncalls in the tree are madtea's own binary andinternal/cmd/install/install.go:976),--porcelaincall sites use the bare, unversioned form, which git documents as free to change,ci.yml:107and:213pin one image by digest, so CI tests one frozen git forever.git --versionis printed atci.yml:125and:219, and nothing asserts on it.The failure mode is quiet. A user on a newer git gets a wrong
--porcelainparse instatus,stage, orworktree, with no error.Approach
Harden the contract first, then watch for what hardening cannot cover.
Order matters. A matrix over unversioned output tests a contract that is not yet stated.
On the architecture
This keeps the git binary as an L1 external dependency, as recorded in ADR 0014 (
docs/decisions/0014-layered-dual-surface.md:60). Replacing the shelled-out paths with a library was weighed and set aside: it would fork that record, and the paths that must stay shelled out (worktrees, hooks, signing, credential helpers) would keep the same problem.Exit criterion
A git release that changes output madtea parses is caught by the project, not by a user.