While the mesh-delivery seat has a holder on record, a merge that moves no core module opens its walk and asks nothing until mesh-delivery or a person says go; nothing of it is registered before its turn, so no other send carries it. The controller keeps the planner, the gate, sending and the walk, and gains the verbs the owner asks with: delivery-plan, -order, -check (a group composed as one future state), deliver, delivery-stop, delivery-walks; every walk kept is said as plan-moved.
99 lines
5.3 KiB
Go
99 lines
5.3 KiB
Go
package catalogue
|
|
|
|
// The delivery's owner (novox/hq ADR 0239, to-be 47): one holder for the mesh, the module mesh-delivery,
|
|
// which owns a delivery — one commit in one repository, from its pull request's head to every machine —
|
|
// and a delivery group, and asks the controller for every act. A seat of the mesh's own, so the role has
|
|
// one name whoever holds it, and the controller can tell whether anything holds it: while nothing does,
|
|
// the controller starts every walk itself, as it did before there was a delivery to own.
|
|
|
|
// DeliverySeat is the seat mesh-delivery holds.
|
|
const DeliverySeat = "mesh-delivery"
|
|
|
|
// deliveryVerbs are the delivery seat's tools: five that read, and the acts of a person and of healer H2.
|
|
func deliveryVerbs() []Verb {
|
|
return []Verb{
|
|
{Name: "deliveries", Description: "Every delivery not final, and those that ended in the last day, one line " +
|
|
"each: its id (owner/repository@commit), its state, its group, what it waits for and since when. Narrowed " +
|
|
"by state, repository or group.",
|
|
Input: schema(map[string]string{"state": "one state, e.g. delivering or held",
|
|
"repository": "owner/repository", "group": "a group's id (its branch name)",
|
|
"all": "\"true\": the final ones of the last thirty days too"}, nil, "all")},
|
|
{Name: "show", Description: "One delivery or group whole: its delivery plan (what it builds, what each " +
|
|
"machine receives, what is not an ordinary send), every transition with when and why, the machine " +
|
|
"steps of its walk, its group and its order.",
|
|
Input: schema(map[string]string{"id": "a delivery's id, or a group's"}, []string{"id"})},
|
|
{Name: "groups", Description: "Every delivery group: its members in order, why each pair is ordered " +
|
|
"(declared, built by, version skew, engine before controller, by name), its composed check and its " +
|
|
"state, derived from its members.",
|
|
Input: schema(map[string]string{"all": "\"true\": the groups that ended too"}, nil, "all")},
|
|
{Name: "what-if", Description: "The delivery plan a change would have, asked of the controller's planner " +
|
|
"and kept nowhere: the modules it moves and their dependents in tiers, what each machine would receive, " +
|
|
"the steps that are not an ordinary send.",
|
|
Input: schema(map[string]string{"repository": "owner/repository",
|
|
"paths": "the files it changes, comma-separated, from the repository's root",
|
|
"base": "the branch it merges into (default main)"}, []string{"repository", "paths"})},
|
|
{Name: "table", Description: "The state table every delivery runs by: each transition with its guard, " +
|
|
"each state's bound and what healer H2 may do once it has passed; and the machine steps' table.",
|
|
Input: schema(map[string]string{}, nil)},
|
|
{Name: "stalled", Description: "Every delivery held past its state's bound, with the transition the table " +
|
|
"lets healer H2 take for it, or none.",
|
|
Input: schema(map[string]string{}, nil)},
|
|
{Name: "recheck", Description: "Check a rejected or ready delivery again: it goes back to proposed and the " +
|
|
"controller is asked for its check. With why.",
|
|
Input: schema(map[string]string{"id": "the delivery's id", "why": "why, kept with the transition"},
|
|
[]string{"id", "why"})},
|
|
{Name: "release", Description: "A person's word that a held delivery goes on: it starts delivering. With why.",
|
|
Input: schema(map[string]string{"id": "the delivery's id", "why": "why, kept with the transition"},
|
|
[]string{"id", "why"})},
|
|
{Name: "stop", Description: "Stop a delivery that is not final, with why; its walk is ended through the " +
|
|
"controller, and in a group every member after it is stopped too, naming it.",
|
|
Input: schema(map[string]string{"id": "the delivery's id", "why": "why, kept with the transition"},
|
|
[]string{"id", "why"})},
|
|
{Name: "close", Description: "Healer H2's verb: take the one transition the table names for a delivery held " +
|
|
"past its bound. Refused for any other.",
|
|
Input: schema(map[string]string{"id": "the delivery's id", "why": "the condition it answers"},
|
|
[]string{"id", "why"})},
|
|
}
|
|
}
|
|
|
|
// SeatSays is whether a consumed `<seat>.<event>` names one of the seat's own events: the seat emits it,
|
|
// exactly or by one of its patterns (`log.*`). A consumed name whose emitter is a seat and whose event the
|
|
// seat does not emit is the event of the module of that name (novox/hq ADR 0239): mesh-delivery is a seat
|
|
// and the module holding it, and what the module says it says as itself, through the runtime that launches
|
|
// it — read as the seat's, a consumer would subscribe a subject nothing may publish.
|
|
func SeatSays(emits []string, event string) bool {
|
|
for _, e := range emits {
|
|
if e == event || topicMatches(e, event) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// topicMatches is whether an event's name matches a declared pattern, `*` one dot-separated segment and
|
|
// `>` or `**` the rest.
|
|
func topicMatches(pattern, event string) bool {
|
|
p, e := splitDots(pattern), splitDots(event)
|
|
for i, part := range p {
|
|
if part == ">" || part == "**" {
|
|
return len(e) > i
|
|
}
|
|
if i >= len(e) || (part != "*" && part != e[i]) {
|
|
return false
|
|
}
|
|
}
|
|
return len(p) == len(e)
|
|
}
|
|
|
|
func splitDots(s string) []string {
|
|
var out []string
|
|
start := 0
|
|
for i := 0; i < len(s); i++ {
|
|
if s[i] == '.' {
|
|
out = append(out, s[start:i])
|
|
start = i + 1
|
|
}
|
|
}
|
|
return append(out, s[start:])
|
|
}
|