ADR 0573 §4 makes refusing a member for its mesh-sdk pin a fault of the check (issue 1585, S14). Every Go check ask now carries the latest published version of each package, or the head of the group member that publishes it, so the pin check, its forge reads and its tests go, and the controller's tests read mesh-sdk at the version it is built with. Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
83 lines
3.1 KiB
Go
83 lines
3.1 KiB
Go
package check
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"maps"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/delivery"
|
|
)
|
|
|
|
// **A check builds against the group's own package heads, not against what a member names** (novox/hq ADR 0573 §2, §4;
|
|
// issue 1585). Every Go check ask carries the version of each mesh package to build against (delivery.StepAsk.Packages):
|
|
// the head of the group's member that publishes it, else its latest published version as the indexer holds it. The build
|
|
// module writes them into the workspace, whatever version or commit a member's go.mod names, so no member is refused
|
|
// for naming no version of the group's package, an older head of it, a merge commit or a commit on no pull request: that
|
|
// refusal (issue 1624's pin check) was a fault of the check (§4), and is gone.
|
|
|
|
// SDKRepository is the repository of mesh-sdk, and SDKModulePath its Go module.
|
|
const (
|
|
SDKRepository = "novox/mesh-sdk"
|
|
SDKModulePath = "git.novox.be/novox/mesh-sdk/go"
|
|
)
|
|
|
|
// ErrNotFound is what Forge.File wraps when the ref holds no such file (the forge answered 404): a file the ref does not hold,
|
|
// told from a forge that could not be read (issue 1845).
|
|
var ErrNotFound = errors.New("the ref holds no such file")
|
|
|
|
// Forge reads a file of a repository at a ref.
|
|
type Forge interface {
|
|
// File is the text of a file at a ref (a branch, a tag or a commit).
|
|
File(ctx context.Context, repository, path, ref string) (string, error)
|
|
}
|
|
|
|
// packagesOf is the version of each mesh package a Go check of repository builds against (ADR 0573 §2, §4): the latest
|
|
// published version of each package the mesh's modules use (Published), and for a package one of the case's pull
|
|
// requests publishes, that pull request's head (mesh-sdk's Go module whenever mesh-sdk is a member). A package of
|
|
// repository itself comes with the tree the check fetched, and is left out. Nil for none.
|
|
func (st *state) packagesOf(repository string) delivery.PackageVersions {
|
|
versions := delivery.PackageVersions{}
|
|
if st.j.Published != nil {
|
|
maps.Copy(versions, st.j.Published.LatestPackages())
|
|
}
|
|
if st.c.member(SDKRepository) != nil {
|
|
if _, named := versions[SDKModulePath]; !named {
|
|
versions[SDKModulePath] = ""
|
|
}
|
|
}
|
|
for pkg := range versions {
|
|
repo, _, ok := delivery.PackageRepository(pkg)
|
|
if !ok || delivery.SameRepository(repo, repository) {
|
|
delete(versions, pkg)
|
|
continue
|
|
}
|
|
if m := st.c.member(repo); m != nil && len(m.Head) == 40 {
|
|
versions[pkg] = m.Head
|
|
}
|
|
if versions[pkg] == "" {
|
|
delete(versions, pkg)
|
|
}
|
|
}
|
|
if len(versions) == 0 {
|
|
return nil
|
|
}
|
|
return versions
|
|
}
|
|
|
|
// unheardWords ends the words of a failed read of the forge that reached nobody: the forge was not heard (UnheardWords).
|
|
func unheardWords(err error) string {
|
|
if isUnheard(err) {
|
|
return " (the forge was " + UnheardWords + ")"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// forgeMachine is the machine a failed read of the forge is put at: the forge when nobody answered it (no build node is to
|
|
// blame, issue 1820), the build node whose workspace was read otherwise.
|
|
func forgeMachine(err error, node string) string {
|
|
if isUnheard(err) {
|
|
return "forge"
|
|
}
|
|
return node
|
|
}
|