Files
mesh-delivery/modules/mesh-delivery-builder/builds/ended.go
T
jschoubben d1357239e2 Builder: says build.ended itself on its own stream mesh-delivery-builder-builds
Each done build's end is published as build.ended.<module>.<fingerprint> (escaped) with the module, fingerprint, made digests, kept-on and branch, where the log entry is written.

Builds: design 47 G §379, A-96

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:30:47 +01:00

44 lines
2.0 KiB
Go

package builds
import (
"git.novox.be/novox/mesh-sdk/go/keys"
)
// The builder says each done build's end itself, as an event on its own stream (design 47 G §379, A-96): the stream
// BuildsStream carries `build.ended.<module>.<fingerprint>` (each part escaped), published where the log entry of the end is
// written. A part that wants a build's parts or its keeping node hears it (the assigner consumes `mesh-delivery-builder.build.ended`).
const (
// BuildsStream is the builder's stream of build ends, named by its manifest's `streams` entry.
BuildsStream = "mesh-delivery-builder-builds"
// BuildsStreamEvents is the pattern of the events that entry carries.
BuildsStreamEvents = BuildEndedEvent + ".**"
)
// BuildEnded is the body of the event build.ended: the module, the fingerprint, each artifact made with its digest, the build
// node that keeps a kept build (none for one not kept) and the watched branch a build of a candidate is for (none for the trunk).
type BuildEnded struct {
Module string `json:"module"`
Fingerprint string `json:"fingerprint"`
Made map[string]string `json:"made,omitempty"`
KeptOn string `json:"kept-on,omitempty"`
Branch string `json:"branch,omitempty"`
}
// BuildEndedEventName is the event's name for a module and fingerprint: `build.ended.<module>.<fingerprint>`, each escaped.
func BuildEndedEventName(module, fp string) string {
return BuildEndedEvent + "." + keys.EscapeName(module) + "." + keys.EscapeName(fp)
}
// BuildEndedOf is the event of a log entry of a build's end: false for any entry but the end of a done build, which says no
// digest of any part.
func BuildEndedOf(e BuildLogEntry) (BuildEnded, bool) {
if e.Event != BuildEndedEvent || e.Outcome != BuildDone || e.Module == "" || e.FP == "" {
return BuildEnded{}, false
}
made := map[string]string{}
for _, a := range e.Made {
made[a.Name] = a.Digest
}
return BuildEnded{Module: e.Module, Fingerprint: e.FP, Made: made, KeptOn: e.KeptOn, Branch: e.Ref}, true
}