DLV-C3r1: a group's Go package version is keyed by the module path go-package-registry's published names
The seat's contract now carries the Go module path, so the checker no longer works it out from the artifact's paths, which could disagree with it. Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
This commit is contained in:
@@ -896,7 +896,7 @@ func TestAMemberNamingAMeshSDKCommitOffTheTrunkIsJudgedAndNotRefused(t *testing.
|
||||
if v, err := b.buckets[delivery.CheckerVerdictsBucket].Get(b.ctx, key); err == nil && !strings.Contains(string(v.Value()), `"running"`) {
|
||||
t.Fatalf("the group was judged before its tagged version was published: %s", v.Value())
|
||||
}
|
||||
published, _ := json.Marshal(gopackageregistry.PublishedEvent{Holder: "gitea", Kind: "package", Name: "mesh-sdk/go", Commit: head2, Tag: "feat-x", Version: "0.1.15-feat-x.1",
|
||||
published, _ := json.Marshal(gopackageregistry.PublishedEvent{Holder: "gitea", Kind: "package", Name: "mesh-sdk/go", Module: check.SDKModulePath, Commit: head2, Tag: "feat-x", Version: "0.1.15-feat-x.1",
|
||||
Digest: "sha256:" + strings.Repeat("0", 64)})
|
||||
if _, err := b.js.Publish(b.ctx, gopackageregistry.SubjectPublished, published); err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@@ -104,6 +104,8 @@ func TestAGroupMemberIsBuiltAgainstTheSDKMembersHeadWhateverItsGoModNames(t *tes
|
||||
// fetch takes from the registry; nil checks none.
|
||||
built map[string]string
|
||||
node map[string]any
|
||||
// noModule: the Go seat's published names no Go module path (ruling 1 on A2d's finding 1: never worked out).
|
||||
noModule bool
|
||||
}{
|
||||
{name: "a group", pulls: []delivery.CandidatePull{pullOf(repoA, 7, head1), sdkPull()},
|
||||
published: []string{"go-package-registry", "npm-package-registry"}, wants: 2,
|
||||
@@ -114,6 +116,9 @@ func TestAGroupMemberIsBuiltAgainstTheSDKMembersHeadWhateverItsGoModNames(t *tes
|
||||
published: []string{"go-package-registry"}, wants: 2,
|
||||
built: map[string]string{contractsGo: "v0.1.15-feat-x.1", seatGo: "v0.1.3-feat-x.1"}},
|
||||
{name: "a lone pull request", pulls: []delivery.CandidatePull{sdkPull()}},
|
||||
{name: "a Go published naming no module", pulls: []delivery.CandidatePull{pullOf(repoA, 7, head1), sdkPull()},
|
||||
published: []string{"go-package-registry", "npm-package-registry"}, wants: 2, noModule: true,
|
||||
fails: "no published of the tagged version of go of mesh-sdk (novox/mesh-sdk#12) on go-package-registry within 50ms"},
|
||||
{name: "a package never published", pulls: []delivery.CandidatePull{pullOf(repoA, 7, head1), sdkPull()},
|
||||
published: []string{"go-package-registry"}, wants: 2,
|
||||
fails: "no published of the tagged version of lib of mesh-sdk (novox/mesh-sdk#12) on npm-package-registry within 50ms"},
|
||||
@@ -124,7 +129,7 @@ func TestAGroupMemberIsBuiltAgainstTheSDKMembersHeadWhateverItsGoModNames(t *tes
|
||||
b.ex.Modules = langs{repoA: {buildrun.GoBuildModule, buildrun.NodeBuildModule}}
|
||||
raw, _ := json.Marshal(sdk)
|
||||
b.ex.Forge = headFiles{repoSDK + " module.json " + head2: string(raw)}
|
||||
tags := &recordedTags{heard: &PublishedHeard{}, publish: row.published}
|
||||
tags := &recordedTags{heard: &PublishedHeard{}, publish: row.published, noModule: row.noModule}
|
||||
b.ex.Tags, b.ex.PublishBound = tags, 50*time.Millisecond
|
||||
b.asks.Answer = func(a delivery.StepAsk) delivery.Step {
|
||||
if len(tags.wanted) != row.wants {
|
||||
@@ -180,8 +185,10 @@ func (h headFiles) File(_ context.Context, repository, path, ref string) (string
|
||||
type recordedTags struct {
|
||||
heard *PublishedHeard
|
||||
publish []string
|
||||
mu sync.Mutex
|
||||
wanted []TagWanted
|
||||
// noModule publishes a Go package naming no Go module path, against go-package-registry's contract.
|
||||
noModule bool
|
||||
mu sync.Mutex
|
||||
wanted []TagWanted
|
||||
}
|
||||
|
||||
func (r *recordedTags) Want(_ context.Context, w TagWanted) error {
|
||||
@@ -193,7 +200,12 @@ func (r *recordedTags) Want(_ context.Context, w TagWanted) error {
|
||||
if w.Package == "go-gopackageregistry" {
|
||||
version = "0.1.3-feat-x.1"
|
||||
}
|
||||
r.heard.Heard(seat, TaggedPublished{Name: w.Package, Kind: "package", Commit: w.Head, Tag: "feat-x", Version: version})
|
||||
module := "" // go-package-registry's published names the Go module path (its contract); npm's names none
|
||||
if seat == "go-package-registry" && !r.noModule {
|
||||
module = map[string]string{repoSDK + " go": SDKModulePath, "novox/mesh-catalog go": "git.novox.be/novox/mesh-catalog/go",
|
||||
"novox/mesh-catalog go-gopackageregistry": "git.novox.be/novox/mesh-catalog/go/seats/gopackageregistry"}[w.Repository+" "+w.Package]
|
||||
}
|
||||
r.heard.Heard(seat, TaggedPublished{Name: w.Package, Kind: "package", Commit: w.Head, Tag: "feat-x", Version: version, Module: module})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"maps"
|
||||
"path"
|
||||
"slices"
|
||||
"strings"
|
||||
"sync"
|
||||
@@ -43,6 +42,9 @@ type TaggedPublished struct {
|
||||
Commit string `json:"commit,omitempty"`
|
||||
Tag string `json:"tag,omitempty"`
|
||||
Version string `json:"version,omitempty"`
|
||||
// Module is the Go module path a Go package is fetched under, as go-package-registry's published names it (its
|
||||
// contract requires it of a Go package).
|
||||
Module string `json:"module,omitempty"`
|
||||
}
|
||||
|
||||
// TagAsks says tag-wanted and hears the registry seats' published: nil asks nothing, and a group's check builds its
|
||||
@@ -76,10 +78,10 @@ func (h *PublishedHeard) init() {
|
||||
}
|
||||
}
|
||||
|
||||
// Heard takes one published of a seat in; one of no tagged version (no tag, or no commit) is left out and answers false.
|
||||
// A later published of the same name and head replaces the earlier.
|
||||
// Heard takes one published of a seat in; one of no tagged version (no tag, or no commit), and a Go package's that names
|
||||
// no Go module path, are left out and answer false. A later published of the same name and head replaces the earlier.
|
||||
func (h *PublishedHeard) Heard(seat string, p TaggedPublished) bool {
|
||||
if p.Tag == "" || p.Commit == "" {
|
||||
if p.Tag == "" || p.Commit == "" || (seat == PackageSeats["go"] && p.Module == "") {
|
||||
return false
|
||||
}
|
||||
h.mu.Lock()
|
||||
@@ -138,33 +140,10 @@ type declaredPackage struct {
|
||||
}
|
||||
|
||||
// publishedNames are the names a registry seat's published may carry for a declared package: the builder's
|
||||
// `<module>/<artifact>` (its versions' name), the artifact's name, and a Go package's module path.
|
||||
// `<module>/<artifact>` (its versions' name) and the artifact's name. A Go package's module path is the published's own
|
||||
// `module` (go-package-registry's contract), never worked out here.
|
||||
func (d declaredPackage) publishedNames() []string {
|
||||
names := []string{d.module + "/" + d.name, d.name}
|
||||
if d.language == "go" {
|
||||
names = append(names, d.goModulePath(""))
|
||||
}
|
||||
return names
|
||||
}
|
||||
|
||||
// goModulePath is the Go module path of a declared Go package (design 51 *Go packages*): the forge's module prefix, the
|
||||
// repository's name, the module's directory and the artifact's first named path; a published name that is already a
|
||||
// module path of the forge's is taken as it is.
|
||||
func (d declaredPackage) goModulePath(published string) string {
|
||||
if strings.HasPrefix(published, delivery.ForgeModulePrefix) {
|
||||
return published
|
||||
}
|
||||
_, name, _ := strings.Cut(d.pull.Repository, "/")
|
||||
parts := []string{strings.TrimSuffix(delivery.ForgeModulePrefix, "/") + "/" + name}
|
||||
if dir := strings.Trim(d.dir, "/"); dir != "" && dir != delivery.RootPath {
|
||||
parts = append(parts, dir)
|
||||
}
|
||||
if len(d.paths) > 0 {
|
||||
if p := strings.Trim(strings.TrimPrefix(d.paths[0], "./"), "/"); p != "" && p != "." {
|
||||
parts = append(parts, p)
|
||||
}
|
||||
}
|
||||
return path.Join(parts...)
|
||||
return []string{d.module + "/" + d.name, d.name}
|
||||
}
|
||||
|
||||
// manifestAtHead is a touched module's manifest read from the forge at its member's head (the lead's ruling 4 on A2c's
|
||||
@@ -309,7 +288,7 @@ func (g *groupVersions) took(d declaredPackage, p TaggedPublished) {
|
||||
if g.goPackages == nil {
|
||||
g.goPackages = delivery.PackageVersions{}
|
||||
}
|
||||
g.goPackages[d.goModulePath(p.Name)] = goVersion(p.Version)
|
||||
g.goPackages[p.Module] = goVersion(p.Version) // Heard took no Go published without its module
|
||||
case "typescript":
|
||||
if g.node == nil {
|
||||
g.node = map[string]NodePackage{}
|
||||
|
||||
Reference in New Issue
Block a user