Say which modules a walk left unchanged, so a merge that moved nothing is not read as stranded (hq issue 611)
mesh/merge-gate head 05576db018a4 merged into trunk a688dcff394b — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head 05576db018a4 merged into trunk a688dcff394b — pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group fix/611-an-unchanged-build-is-delivered delivered: every member is delivered
mesh/merge-gate head 05576db018a4 merged into trunk a688dcff394b — pass: builds build-agent, mesh-controller → ace, g14, novox, shanks; no bus step; every …
mesh/repo-check head 05576db018a4 merged into trunk a688dcff394b — pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group fix/611-an-unchanged-build-is-delivered delivered: every member is delivered
A delivery plan made while another walk built a module reads it whole and names it; the walk, cut later, finds none of the changed files in the build source that build recorded and moves nothing. Its record named no module, so mesh-delivery read 'matched what runs' as 'never built', stopped the delivery and asked the operator about a change already on every machine. The walk now says each such module in delivery.unchanged, with why; its modules keep meaning what it builds.
This commit is contained in:
@@ -692,9 +692,73 @@ func readsFile(e inventory.Entry, read []inventory.ReadRepository, p string) boo
|
||||
if own := ownSource(read); own != nil {
|
||||
return builder.SourceHolds(own, p)
|
||||
}
|
||||
return readsDirectory(e, p)
|
||||
}
|
||||
|
||||
// readsDirectory is whether a changed file is in a module's directory, or anywhere for a module built from its
|
||||
// repository's root: the reading of a module with no recorded build source.
|
||||
func readsDirectory(e inventory.Entry, p string) bool {
|
||||
return strings.Trim(e.Source.Path, "/") == "" || inside(p, e.Source.Path)
|
||||
}
|
||||
|
||||
// unchangedOfMerge are the modules a merge changed files for under a reading without recorded build sources, but
|
||||
// whose recorded build source holds none of them, each with why (novox/hq issue 611): not built, because the build
|
||||
// the mesh holds is theirs (ADR 0267 §5). That reading — a delivery plan made while another walk built the module
|
||||
// (issue 606) — would have moved them; the walk says they matched what runs rather than leaving them unnamed.
|
||||
// A module built from the repository whose directory, or whole repository when built from its root, holds a
|
||||
// changed file, and a module packaging the repository's branch, are each read so. A merge whose changed files
|
||||
// were not all said moves every one of them: none is said here. Without acting.
|
||||
func unchangedOfMerge(m link.SourceMoved, entries []inventory.Entry,
|
||||
read map[string][]inventory.ReadRepository) map[string]string {
|
||||
if len(m.Paths) == 0 || m.PathsTruncated {
|
||||
return nil
|
||||
}
|
||||
from, _, _ := mergeCandidates(m, entries, read)
|
||||
touched, _, _ := touchedBy(from, entries, m, read)
|
||||
out := map[string]string{}
|
||||
for _, e := range from {
|
||||
name := e.Manifest.Module
|
||||
if ownSource(read[name]) == nil || slices.ContainsFunc(touched, func(t inventory.Entry) bool {
|
||||
return t.Manifest.Module == name
|
||||
}) {
|
||||
continue
|
||||
}
|
||||
var in []string
|
||||
for _, p := range m.Paths {
|
||||
if readsDirectory(e, p) {
|
||||
in = append(in, p)
|
||||
}
|
||||
}
|
||||
if len(in) > 0 {
|
||||
out[name] = fmt.Sprintf("its build source holds none of the %d changed file(s) in its directory (e.g. %s): "+
|
||||
"the build the mesh holds is its build", len(in), in[0])
|
||||
}
|
||||
}
|
||||
for _, e := range entries {
|
||||
name := e.Manifest.Module
|
||||
if sourceIs(e.Source, m) || !packagesSaid(read[name], m) || readsFrom(read[name], m) {
|
||||
continue
|
||||
}
|
||||
out[name] = fmt.Sprintf("its build source in %s/%s holds none of the %d changed file(s) (e.g. %s): "+
|
||||
"the build the mesh holds is its build", m.Owner, m.Repo, len(m.Paths), m.Paths[0])
|
||||
}
|
||||
if len(out) == 0 {
|
||||
return nil
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// packagesSaid is whether a module's newest trunk build said the build source it read in a merge's repository and
|
||||
// branch, as a context beside its own.
|
||||
func packagesSaid(read []inventory.ReadRepository, m link.SourceMoved) bool {
|
||||
for _, r := range read {
|
||||
if !r.Own && sameRepository(r.Repository, m) && (r.Ref == "" || r.Ref == m.Base) && len(r.Paths) > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// staleIn is the modules whose recorded build source a plan has overtaken (novox/hq ADR 0267): a plan still
|
||||
// working that has yet to build one, or a plan made after that build which never built it — failed, stopped
|
||||
// or superseded. What such a module is built from is changing, or changed without a build to say so: a merge
|
||||
|
||||
Reference in New Issue
Block a user