diff --git a/checks/particulars/main.go b/checks/particulars/main.go index 5203f1f6..42525c96 100644 --- a/checks/particulars/main.go +++ b/checks/particulars/main.go @@ -2,8 +2,9 @@ // issue 1838): a module is for any mesh, so no manifest, file, code string, identifier, comment, test name or // fixture of a covered module names a node of this one. // -// The names are in the file `particulars` at the catalogue's root, one a line, `#` comments — the one place -// they may be written. The modules covered are in `covered` at checks/particulars/covered, one a line. A name is matched +// The names are the mesh's own, not the repository's: the checker hands them in the environment value +// MESH_NODE_NAMES, comma-separated, from the node records it reads (novox/hq ADR 0567 §11). A run with none fails +// loudly, since it would pass on anything. The modules covered are in `covered` at checks/particulars/covered, one a line. A name is matched // whole and in any case; a hyphen, an underscore or a CamelCase boundary parts one, so a longer word holding a name is another word. // The forge is not a node name: its host (git.novox.be) and the organisation path (novox/) are blanked // before a line is read. @@ -34,14 +35,28 @@ func main() { if len(os.Args) > 1 { root = os.Args[1] } - os.Exit(check(root)) + os.Exit(check(root, namesFromEnv())) +} + +// NamesEnv is the environment value that carries the mesh's node names (mesh-sdk delivery.NodeNamesEnv). +const NamesEnv = "MESH_NODE_NAMES" + +// namesFromEnv is the names NamesEnv holds, comma-separated, trimmed, empty entries left out. +func namesFromEnv() []string { + var out []string + for _, n := range strings.Split(os.Getenv(NamesEnv), ",") { + if n = strings.TrimSpace(n); n != "" { + out = append(out, n) + } + } + return out } // check runs the check over a catalogue and returns the exit code: 0 clean, 1 a finding, 2 a list unreadable. -func check(root string) int { - names, err := readList(filepath.Join(root, "particulars")) - if err == nil && len(names) == 0 { - err = fmt.Errorf("particulars lists no name — the check would pass on anything") +func check(root string, names []string) int { + var err error + if len(names) == 0 { + err = fmt.Errorf("no node names (%s is empty) — the check would pass on anything", NamesEnv) } var covered []string if err == nil { diff --git a/checks/particulars/main_test.go b/checks/particulars/main_test.go index f348a703..51368f39 100644 --- a/checks/particulars/main_test.go +++ b/checks/particulars/main_test.go @@ -74,26 +74,24 @@ func TestANodeNamedPathIsRefusedThroughRun(t *testing.T) { } } -func TestCheckReturnsOneOnAFindingAndTwoOnAnUnreadableList(t *testing.T) { +func TestCheckReturnsOneOnAFindingAndTwoOnNoNames(t *testing.T) { root := t.TempDir() write := func(p, s string) { p = filepath.Join(root, p) os.MkdirAll(filepath.Dir(p), 0o755) os.WriteFile(p, []byte(s), 0o644) } - write("particulars", "ace\n") write("checks/particulars/covered", "kernel\n") write("modules/kernel/a", "clean\n") - if got := check(root); got != 0 { + if got := check(root, []string{"ace"}); got != 0 { t.Errorf("clean = %d, want 0", got) } write("modules/kernel/a", "on ace\n") - if got := check(root); got != 1 { + if got := check(root, []string{"ace"}); got != 1 { t.Errorf("finding = %d, want 1", got) } - os.Remove(filepath.Join(root, "particulars")) - if got := check(root); got != 2 { - t.Errorf("no list = %d, want 2", got) + if got := check(root, nil); got != 2 { + t.Errorf("no names = %d, want 2", got) } } @@ -117,7 +115,7 @@ func TestOnlyCoveredModulesAreRead(t *testing.T) { // The script's run of this check over the real tree (novox/hq ADR 0529 clause 2): no node name of this mesh in a covered module. func TestTheCoveredModulesNameNoNode(t *testing.T) { - if code := check("../.."); code != 0 { + if code := check("../..", namesFromEnv()); code != 0 { t.Fatalf("the check of the real catalogue exits %d (see what it printed above)", code) } } diff --git a/checks/particulars/reads-outside b/checks/particulars/reads-outside index c2a9b667..bcc81106 100644 --- a/checks/particulars/reads-outside +++ b/checks/particulars/reads-outside @@ -1,6 +1,5 @@ # What these tests read outside their package, as paths from the repository's root (a glob, or a directory read whole; # ? before a path whose absence is read). mesh-build-go hashes them into the package's digest, so its verdict is kept # until one of them changes (issue 1936). An empty list, or a line matching nothing, keeps nothing. -# check("../.."): the root's list and every file of the modules it names. -particulars +# check("../.."): every file of the modules the covered list names. The node names come from the run (MESH_NODE_NAMES). modules diff --git a/particulars b/particulars deleted file mode 100644 index b2ab98b1..00000000 --- a/particulars +++ /dev/null @@ -1,5 +0,0 @@ -# This mesh's node names (novox/hq ADR 0507 §9, issue 1838): the one place they may be written. -novox -ace -shanks -g14