From ece328d0cc964e5110e81d3cc4042dd58f7bf3fe Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 22 Oct 2026 18:20:37 +0200 Subject: [PATCH] =?UTF-8?q?Give=20a=20candidate's=20module=20its=20named?= =?UTF-8?q?=20paths'=20objects=20from=20the=20preview,=20so=20the=20builde?= =?UTF-8?q?r's=20fetch=20for=20it=20names=20them=20(issue=201758,=20ADR=20?= =?UTF-8?q?0499=20=C2=A74;=20mesh-sdk=20CandidateModule.Paths)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/index/candidate_manifests_test.go | 5 +++-- .../mesh-delivery-indexer/internal/index/candidates.go | 3 ++- .../mesh-delivery-indexer/internal/index/named_test.go | 6 +++++- modules/mesh-delivery-indexer/internal/index/previews.go | 8 ++++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/modules/mesh-delivery-indexer/internal/index/candidate_manifests_test.go b/modules/mesh-delivery-indexer/internal/index/candidate_manifests_test.go index 41c2f1b..a43f4e9 100644 --- a/modules/mesh-delivery-indexer/internal/index/candidate_manifests_test.go +++ b/modules/mesh-delivery-indexer/internal/index/candidate_manifests_test.go @@ -3,6 +3,7 @@ package index import ( "context" "errors" + "reflect" "strings" "testing" @@ -43,7 +44,7 @@ func TestACandidateGivesEachTouchedModuleItsManifestAndTheReasonItHasNoPreview(t } c := candidateOf(t, ix.Store.(*memStore)) // DecodeCandidate has run Candidate.check want := delivery.CandidateModule{Manifest: delivery.ManifestDigest([]byte(avahi)), None2: "no merge preview is computed"} - if len(c.Pulls) != 1 || len(c.Pulls[0].Fps) != 1 || c.Pulls[0].Fps["avahi"] != want { + if len(c.Pulls) != 1 || len(c.Pulls[0].Fps) != 1 || !reflect.DeepEqual(c.Pulls[0].Fps["avahi"], want) { t.Fatalf("pulls = %+v, want Fps[avahi] = %+v", c.Pulls, want) } if c.FPSet == "" || c.FPSet != delivery.FingerprintSet(c.Pulls) { @@ -55,7 +56,7 @@ func TestACandidateGivesEachTouchedModuleItsManifestAndTheReasonItHasNoPreview(t if err := ix.Apply(context.Background(), again); err != nil { t.Fatal(err) } - if c2 := candidateOf(t, ix.Store.(*memStore)); c2.Pulls[0].Fps["avahi"] != want || c2.FPSet != c.FPSet { + if c2 := candidateOf(t, ix.Store.(*memStore)); !reflect.DeepEqual(c2.Pulls[0].Fps["avahi"], want) || c2.FPSet != c.FPSet { t.Errorf("after a message without directories: %+v fpset %q", c2.Pulls[0].Fps, c2.FPSet) } } diff --git a/modules/mesh-delivery-indexer/internal/index/candidates.go b/modules/mesh-delivery-indexer/internal/index/candidates.go index c322283..d0baf34 100644 --- a/modules/mesh-delivery-indexer/internal/index/candidates.go +++ b/modules/mesh-delivery-indexer/internal/index/candidates.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "reflect" "slices" "strings" "sync" @@ -284,7 +285,7 @@ func (ix *Indexer) refuseDisagreement(c delivery.Candidate) error { first[module] = p continue } - if before.Fps[module] != m { + if !reflect.DeepEqual(before.Fps[module], m) { err := fmt.Errorf("%w: candidates.%s: %s#%d and %s#%d give the module %q different manifests (%s and %s), so the group is not written", ErrUnreadable, c.Group, before.Repository, before.Number, p.Repository, p.Number, module, before.Fps[module].Manifest, m.Manifest) return err diff --git a/modules/mesh-delivery-indexer/internal/index/named_test.go b/modules/mesh-delivery-indexer/internal/index/named_test.go index 9fafd6b..91bec02 100644 --- a/modules/mesh-delivery-indexer/internal/index/named_test.go +++ b/modules/mesh-delivery-indexer/internal/index/named_test.go @@ -81,7 +81,11 @@ func TestACandidatesModuleTakesTheNamedPathsObjectsFromThePreview(t *testing.T) if got := ix.candidateModule(context.Background(), "mesh-sdk", ".", without); !strings.Contains(got.None2, "named paths") { t.Errorf("without the objects: %+v, want none naming the named paths", got) } - if got := ix.candidateModule(context.Background(), "mesh-sdk", ".", with); strings.Contains(got.None2, "named paths") || got.Manifest != digest { + got := ix.candidateModule(context.Background(), "mesh-sdk", ".", with) + if strings.Contains(got.None2, "named paths") || got.Manifest != digest { t.Errorf("with the objects: %+v, want them taken (none only for what else is missing)", got) } + if got.FP2 != "" && !reflect.DeepEqual(got.Paths, sdkObjects) { + t.Errorf("with a fingerprint: %+v, want the named paths' objects carried for the builder's fetch", got) + } } diff --git a/modules/mesh-delivery-indexer/internal/index/previews.go b/modules/mesh-delivery-indexer/internal/index/previews.go index 55ec2a6..5e8b454 100644 --- a/modules/mesh-delivery-indexer/internal/index/previews.go +++ b/modules/mesh-delivery-indexer/internal/index/previews.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "maps" + "reflect" "slices" "strings" @@ -184,12 +185,12 @@ func (ix *Indexer) withPreviews(ctx context.Context, c *delivery.Candidate) bool if fps == nil { fps = map[string]delivery.CandidateModule{} } - if fps[m] != next { + if !reflect.DeepEqual(fps[m], next) { fps[m] = next changed = true } } - if changed || !maps.Equal(fps, p.Fps) { + if changed || !maps.EqualFunc(fps, p.Fps, func(a, b delivery.CandidateModule) bool { return reflect.DeepEqual(a, b) }) { p.Fps = fps } } @@ -269,5 +270,8 @@ func (ix *Indexer) candidateModule(ctx context.Context, m, dir string, pv delive return out } out.FP2 = fp + if len(inputs.Paths) > 0 { + out.Paths = inputs.Paths // the builder's fetch for the candidate names them (ADR 0499 clause 4) + } return out }