Artifact b2645e489ade9ac71fb5e88e3a1671aa0ba38bf5fc9543aafc04039608193d9d:
- File
conformance/repostate_gaps_test.go
— part of check-in
[0889d8b777]
at
2026-10-13 13:36:12
on branch main
— feat(resolve): checkout-inclusive request where ckout names the working files (#420)
* feat(resolve): checkout-inclusive request where ckout names the working files
Checkout.ResolveWorking is fossil's "ci+" request (repo-state-01 8.3): while the checkout has a version, "ckout" answers the working files, reported as WorkingVersion.Working rather than as a pseudo-RID. Every other name goes through the same resolver as Checkout.ResolveVersion, restricted to check-ins as fossil's ci+ is. The draft also makes ckout a keyword in a plain "ci" request; this follows fossil, where only ci+ has it.
New repostate.8.3 cases run the request against fossil test-name-to-id --type ci+, and RS-8.3-4 loses its scope note. Tracked in #419.
* fix(resolve): record the ckout retry as a fossil deviation; tighten tests (user: [email protected], size: 2623) [annotate] [blame] [check-ins using]
package conformance import "testing" // repostateGaps marks the repository-state cases go-libfossil is known to // fail, by case ID, grouped by the code at fault, each with the issue // tracking its fix. var repostateGaps = map[string]string{} // repostateDeviations marks the cases where go-libfossil follows fossil(1) // rather than the draft text, by case ID. var repostateDeviations = map[string]string{ "repostate.7.3.parentless-untagged": parentlessDeviation, // verify.Rebuild now derives leaves through the crosslink sweep, so it shares // the same branch-aware leaf rule and the same ยง7.3 deviation. "repostate.7.3.parentless-untagged.rebuild": parentlessDeviation, // The same check-in seen from Section 7.3's crosslink trigger: linking it // does not recheck it, as fossil's does not. "repostate.7.3.recheck-lone-untagged": parentlessDeviation, // An untagged child of a tagged check-in: Section 7.3 rechecks it and // its parent when it is linked. "repostate.7.3.recheck-untagged-child": untaggedChildDeviation, "repostate.7.3.recheck-untagged-child.rebuild": untaggedChildDeviation, // ckout.: Section 8.3 retries the whole procedure under a ci type. "repostate.8.3.ckout-inclusive-whole-name": ckoutWholeNameDeviation, } const ckoutWholeNameDeviation = "follows fossil(1): the ci+ request is rewritten to ci, so " + "the trailing-punctuation retry and the recursive forms read ckout as an ordinary " + "name, where Section 8.3 retries the whole procedure and makes ckout a keyword under " + "ci as well (erratum pending)" const untaggedChildDeviation = "follows fossil(1): a check-in with a parent but no branch " + "tag is never rechecked, so it is no leaf and its parent keeps its verdict, where " + "Section 7.3 rechecks every crosslinked check-in and its parents; widening the " + "candidates changed the leaf table of a real fossil-authored repository (the " + "libfossil corpus)" const parentlessDeviation = "follows fossil(1): an untagged parentless check-in is " + "never a leaf, where Section 7.3 makes every check-in without a same-branch " + "child one (the section's informative note records fossil's behavior)" // TestRepoStateGapKeys checks that every marked case exists. func TestRepoStateGapKeys(t *testing.T) { ids := map[string]bool{} for _, c := range repostateSuiteCases() { ids[c.ID] = true } for id := range repostateGaps { if !ids[id] { t.Errorf("repostateGaps names %s, which is not a case", id) } } for id := range repostateDeviations { if !ids[id] { t.Errorf("repostateDeviations names %s, which is not a case", id) } } }