diff --git a/modules/mesh-delivery-checker/internal/check/pins.go b/modules/mesh-delivery-checker/internal/check/pins.go index 1ec0015d..60eed5a1 100644 --- a/modules/mesh-delivery-checker/internal/check/pins.go +++ b/modules/mesh-delivery-checker/internal/check/pins.go @@ -4,6 +4,7 @@ import ( "context" "errors" "maps" + "strings" "git.novox.be/novox/mesh-delivery/sdk/buildstep" "git.novox.be/novox/mesh-delivery/sdk/trunk" @@ -66,6 +67,28 @@ func (st *state) packagesOf(repository string) buildstep.PackageVersions { delete(versions, pkg) } } + // A package of a member that no indexer state publishes yet (a repository whose packages are all new) is in no list above, + // and the build would look for it as the trunk's latest version, which does not exist (issue 1921). The member's root + // module path stands for its repository: the build module takes the head of a repository from any package of it. + for _, m := range st.c.Pulls { + if trunk.SameRepository(m.Repository, repository) || len(m.Head) != 40 { + continue + } + name := strings.TrimPrefix(m.Repository, "novox/") + if m.Repository == name { + continue + } + held := false + for pkg := range versions { + if repo, _, ok := trunk.PackageRepository(pkg); ok && repo == m.Repository { + held = true + break + } + } + if !held { + versions[trunk.ForgeModulePrefix+name] = m.Head + } + } if len(versions) == 0 { return nil } diff --git a/modules/mesh-delivery-checker/internal/check/pins_test.go b/modules/mesh-delivery-checker/internal/check/pins_test.go index e1871604..75f9fc23 100644 --- a/modules/mesh-delivery-checker/internal/check/pins_test.go +++ b/modules/mesh-delivery-checker/internal/check/pins_test.go @@ -68,6 +68,15 @@ func TestAGroupMemberIsBuiltAgainstTheSDKMembersHeadWhateverItsGoModNames(t *tes if got := packagesOfFetch(t, b, "novox/mesh-catalog"); len(got) != 2 || got[SDKModulePath] != trunkS || got[contract] != trunkA { t.Errorf("a pull request alone is built against %v, want every package at its latest published version", got) } + // A member that publishes no package yet is still named, by its root module path, at its head (issue 1921). + b = newBench(t) + b.ex.Published = published{} + if v := b.judge(t, caseOf(t, pullOf(repoA, 7, head1), pullOf("novox/mesh-host", 8, head2))).Verdict; v.State != meshdeliverycheckerclient.VerdictPass { + t.Fatalf("an unpublished member: verdict = %+v", v) + } + if got := packagesOfFetch(t, b, repoA); len(got) != 1 || got["git.novox.be/novox/mesh-host"] != head2 { + t.Errorf("the member's packages = %v, want the unpublished member's root at its head %s alone", got, head2) + } // Design 51 *Tagged versions* (DLV-C3): a group's check says tag-wanted for each package a member declares and builds no // member before its published; a lone pull request asks nothing; no published within the bound fails naming the package.