diff --git a/checks/agenthome/reads-outside b/checks/agenthome/reads-outside index f6b2d871..8fc7689d 100644 --- a/checks/agenthome/reads-outside +++ b/checks/agenthome/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest. +modules/*/module.json diff --git a/checks/config/reads-outside b/checks/config/reads-outside index f6b2d871..cc3c0a39 100644 --- a/checks/config/reads-outside +++ b/checks/config/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest and the files it names. +modules diff --git a/checks/deps/reads-outside b/checks/deps/reads-outside deleted file mode 100644 index f6b2d871..00000000 --- a/checks/deps/reads-outside +++ /dev/null @@ -1 +0,0 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). diff --git a/checks/health/reads-outside b/checks/health/reads-outside index f6b2d871..f6ce1405 100644 --- a/checks/health/reads-outside +++ b/checks/health/reads-outside @@ -1 +1,10 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# every manifest through mesh-sdk's ReadTreeManifest: the root's predefined keys and each templated module's +# templates (files/ by default, or the directory its manifest names); and the root's kept count of resources that do not say how they are ready. +modules/*/module.json +predefined.json +modules/*/files +modules/*/templates +health-undeclared diff --git a/checks/imagebuild/reads-outside b/checks/imagebuild/reads-outside index f6b2d871..8fc7689d 100644 --- a/checks/imagebuild/reads-outside +++ b/checks/imagebuild/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest. +modules/*/module.json diff --git a/checks/imageplace/reads-outside b/checks/imageplace/reads-outside index f6b2d871..8a080f79 100644 --- a/checks/imageplace/reads-outside +++ b/checks/imageplace/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest, and whether the path each image artifact builds from is there. +modules diff --git a/checks/locks/reads-outside b/checks/locks/reads-outside index f6b2d871..4f2c2396 100644 --- a/checks/locks/reads-outside +++ b/checks/locks/reads-outside @@ -1 +1,7 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest, a TypeScript module's package.json and whether its lock is there. +modules/*/module.json +modules/*/package.json +modules/*/package-lock.json diff --git a/checks/mailstore/reads-outside b/checks/mailstore/reads-outside index f6b2d871..8fc7689d 100644 --- a/checks/mailstore/reads-outside +++ b/checks/mailstore/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest. +modules/*/module.json diff --git a/checks/nobinaries/reads-outside b/checks/nobinaries/reads-outside index f6b2d871..8c970936 100644 --- a/checks/nobinaries/reads-outside +++ b/checks/nobinaries/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# every file under modules/ (git ls-files and a walk). +modules diff --git a/checks/noscripts/reads-outside b/checks/noscripts/reads-outside index f6b2d871..a161a850 100644 --- a/checks/noscripts/reads-outside +++ b/checks/noscripts/reads-outside @@ -1 +1,7 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# that none of the old check scripts stands at the root. +?merge-check.sh +?merge-check-typescript.sh +?check-nested-modules.sh diff --git a/checks/owned/reads-outside b/checks/owned/reads-outside index f6b2d871..bc374f72 100644 --- a/checks/owned/reads-outside +++ b/checks/owned/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest; its lists are this package's own files. +modules/*/module.json diff --git a/checks/particulars/reads-outside b/checks/particulars/reads-outside index f6b2d871..c2a9b667 100644 --- a/checks/particulars/reads-outside +++ b/checks/particulars/reads-outside @@ -1 +1,6 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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 +modules diff --git a/checks/paths/reads-outside b/checks/paths/reads-outside index f6b2d871..cfaaf0f8 100644 --- a/checks/paths/reads-outside +++ b/checks/paths/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest and every file of a module. +modules diff --git a/checks/predefined/reads-outside b/checks/predefined/reads-outside index f6b2d871..81a14658 100644 --- a/checks/predefined/reads-outside +++ b/checks/predefined/reads-outside @@ -1 +1,6 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the root's list of predefined keys and every manifest that names one. +predefined.json +modules/*/module.json diff --git a/checks/secrets/reads-outside b/checks/secrets/reads-outside index f6b2d871..cc3c0a39 100644 --- a/checks/secrets/reads-outside +++ b/checks/secrets/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest and the files it names. +modules diff --git a/checks/sshdir/reads-outside b/checks/sshdir/reads-outside index f6b2d871..8fc7689d 100644 --- a/checks/sshdir/reads-outside +++ b/checks/sshdir/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest. +modules/*/module.json diff --git a/checks/templates/reads-outside b/checks/templates/reads-outside index f6b2d871..e854eebe 100644 --- a/checks/templates/reads-outside +++ b/checks/templates/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest and its templates. +modules diff --git a/checks/toolchains/reads-outside b/checks/toolchains/reads-outside index f6b2d871..8fc7689d 100644 --- a/checks/toolchains/reads-outside +++ b/checks/toolchains/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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("../.."): every manifest. +modules/*/module.json diff --git a/checks/trunk/reads-outside b/checks/trunk/reads-outside deleted file mode 100644 index f6b2d871..00000000 --- a/checks/trunk/reads-outside +++ /dev/null @@ -1 +0,0 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). diff --git a/checks/words/reads-outside b/checks/words/reads-outside index f6b2d871..035d1d78 100644 --- a/checks/words/reads-outside +++ b/checks/words/reads-outside @@ -1 +1,7 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# run("../.."): the root's lists of retired words and lines, and every module's texts. +retired-words +retired-lines +modules diff --git a/modules/adwaita/internal/desktop/reads-outside b/modules/adwaita/internal/desktop/reads-outside index f6b2d871..7ef55c53 100644 --- a/modules/adwaita/internal/desktop/reads-outside +++ b/modules/adwaita/internal/desktop/reads-outside @@ -1 +1,9 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of this package in every module that carries one. +modules/xorg/internal/desktop/*.go +modules/lemurs/internal/desktop/*.go +modules/i3/internal/desktop/*.go +modules/xterm/internal/desktop/*.go +modules/adwaita/internal/desktop/*.go diff --git a/modules/blueman/cmd/blueman-tools/reads-outside b/modules/blueman/cmd/blueman-tools/reads-outside index f6b2d871..72d043ba 100644 --- a/modules/blueman/cmd/blueman-tools/reads-outside +++ b/modules/blueman/cmd/blueman-tools/reads-outside @@ -1 +1,25 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of desktop.go and its tests in every module that carries one. +modules/blueman/cmd/blueman-tools/desktop.go +modules/blueman/cmd/blueman-tools/desktop_test.go +modules/blueman/cmd/blueman-tools/copies_test.go +modules/forticlient/cmd/forticlient-tools/desktop.go +modules/forticlient/cmd/forticlient-tools/desktop_test.go +modules/forticlient/cmd/forticlient-tools/copies_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/copies_test.go +modules/nm-applet/cmd/nm-applet-tools/desktop.go +modules/nm-applet/cmd/nm-applet-tools/desktop_test.go +modules/nm-applet/cmd/nm-applet-tools/copies_test.go +modules/openrazer/cmd/openrazer-tools/desktop.go +modules/openrazer/cmd/openrazer-tools/desktop_test.go +modules/openrazer/cmd/openrazer-tools/copies_test.go +modules/polychromatic/cmd/polychromatic-tools/desktop.go +modules/polychromatic/cmd/polychromatic-tools/desktop_test.go +modules/polychromatic/cmd/polychromatic-tools/copies_test.go +modules/slack/cmd/slack-tools/desktop.go +modules/slack/cmd/slack-tools/desktop_test.go +modules/slack/cmd/slack-tools/copies_test.go diff --git a/modules/brother/cmd/brother/reads-outside b/modules/brother/cmd/brother/reads-outside index f6b2d871..95611a5c 100644 --- a/modules/brother/cmd/brother/reads-outside +++ b/modules/brother/cmd/brother/reads-outside @@ -1 +1,6 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# mesh-mail's store.json is the same as brother's; no module scan is left. +modules/mesh-mail/files/store.json +?modules/scan diff --git a/modules/forticlient/cmd/forticlient-tools/reads-outside b/modules/forticlient/cmd/forticlient-tools/reads-outside index f6b2d871..72d043ba 100644 --- a/modules/forticlient/cmd/forticlient-tools/reads-outside +++ b/modules/forticlient/cmd/forticlient-tools/reads-outside @@ -1 +1,25 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of desktop.go and its tests in every module that carries one. +modules/blueman/cmd/blueman-tools/desktop.go +modules/blueman/cmd/blueman-tools/desktop_test.go +modules/blueman/cmd/blueman-tools/copies_test.go +modules/forticlient/cmd/forticlient-tools/desktop.go +modules/forticlient/cmd/forticlient-tools/desktop_test.go +modules/forticlient/cmd/forticlient-tools/copies_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/copies_test.go +modules/nm-applet/cmd/nm-applet-tools/desktop.go +modules/nm-applet/cmd/nm-applet-tools/desktop_test.go +modules/nm-applet/cmd/nm-applet-tools/copies_test.go +modules/openrazer/cmd/openrazer-tools/desktop.go +modules/openrazer/cmd/openrazer-tools/desktop_test.go +modules/openrazer/cmd/openrazer-tools/copies_test.go +modules/polychromatic/cmd/polychromatic-tools/desktop.go +modules/polychromatic/cmd/polychromatic-tools/desktop_test.go +modules/polychromatic/cmd/polychromatic-tools/copies_test.go +modules/slack/cmd/slack-tools/desktop.go +modules/slack/cmd/slack-tools/desktop_test.go +modules/slack/cmd/slack-tools/copies_test.go diff --git a/modules/i3/internal/desktop/reads-outside b/modules/i3/internal/desktop/reads-outside index f6b2d871..7ef55c53 100644 --- a/modules/i3/internal/desktop/reads-outside +++ b/modules/i3/internal/desktop/reads-outside @@ -1 +1,9 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of this package in every module that carries one. +modules/xorg/internal/desktop/*.go +modules/lemurs/internal/desktop/*.go +modules/i3/internal/desktop/*.go +modules/xterm/internal/desktop/*.go +modules/adwaita/internal/desktop/*.go diff --git a/modules/lemurs/internal/desktop/reads-outside b/modules/lemurs/internal/desktop/reads-outside index f6b2d871..7ef55c53 100644 --- a/modules/lemurs/internal/desktop/reads-outside +++ b/modules/lemurs/internal/desktop/reads-outside @@ -1 +1,9 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of this package in every module that carries one. +modules/xorg/internal/desktop/*.go +modules/lemurs/internal/desktop/*.go +modules/i3/internal/desktop/*.go +modules/xterm/internal/desktop/*.go +modules/adwaita/internal/desktop/*.go diff --git a/modules/mesh-build-go/cmd/mesh-build-go/beside_digest_test.go b/modules/mesh-build-go/cmd/mesh-build-go/beside_digest_test.go index 22aebaca..f59242f7 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/beside_digest_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/beside_digest_test.go @@ -116,7 +116,7 @@ func TestTheIntegrationLevelDigestsUnderBothTags(t *testing.T) { t.Errorf("the integration digest listed %q", s.command) } } - if DigestVersion != "5" { + if DigestVersion != "6" { t.Errorf("the digest's form changed in kind and is still version %s", DigestVersion) } } diff --git a/modules/mesh-build-go/cmd/mesh-build-go/digest.go b/modules/mesh-build-go/cmd/mesh-build-go/digest.go index 746a6f85..0e0133e2 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/digest.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/digest.go @@ -16,6 +16,7 @@ import ( "io" "io/fs" "os" + "path" "path/filepath" "sort" "strconv" @@ -29,17 +30,25 @@ import ( // commits (the lead's decision L5) and the integration level's tags integration,isolation (the checker's agreement). // 4: the siblings' commits enter only the digest of a package whose tests reach a file naming MESH_CHECK_BESIDE (ADR 0536 §1). // 5: a catalogue module's non-Go files enter the digest of its packages (issue 1935). -const DigestVersion = "5" +// 6: a reads-outside marker that lists what its tests read enters the digest with those files' contents (issue 1936). +const DigestVersion = "6" // besideVariable is the name a file bears when it reads where the siblings lie; a package whose tests reach such a file // depends on the siblings' commits. const besideVariable = "MESH_CHECK_BESIDE" // ReadsOutsideMarker is the name of a file in a package's directory that says its tests read files outside it (a -// repository's documents, a sibling directory): such a package is never kept (issue 1935). The digest hashes only what -// the Go toolchain lists, so it cannot name what a test opens elsewhere; a marker file, beside the Go files where a -// reader of the package sees it, is the plain way to say so until the checker keeps the files a test opened (the Go -// test log) with each verdict. +// repository's documents, a sibling directory), which the Go toolchain does not list (issue 1935). It lists, one per +// line, what those tests read, as paths from the repository's root; a path may be a glob (filepath.Match), and a +// directory it names is read whole (issue 1936). Blank lines and lines starting with # are not read. A line starting +// with ? names a path whose absence is what the tests read (a file that must not be there): it may match nothing. +// +// The digest then hashes, besides what the toolchain lists, every line of the marker, every file it names (under its +// path in the tree, by content) and every file of the package's own directory, Go files included (a file its build tags +// exclude is one go list does not hash). A marker that lists nothing, a line that is not a clean relative path, or a +// line without ? that matches nothing makes the package one that is never kept (its digest a fresh random hex): a list +// nobody can trust keeps nothing. The exact fix, the files a test opened kept +// from the Go test log with each verdict, replaces the lists (issue 1936). const ReadsOutsideMarker = "reads-outside" // NeedsMarker is the name of a file in a package's directory that names, one per line, what its integration tests need @@ -128,9 +137,13 @@ type DigestResult struct { // only when they are the siblings it gave the fetch. Beside []string `json:"beside,omitempty"` WithoutTests []string `json:"without_tests,omitempty"` - // ReadsOutside names the packages that carry the marker: each has a digest that no kept verdict can have (a fresh - // random one), so the check runs it every time. + // ReadsOutside names the packages whose marker lists nothing it can trust (ReadsOutsideMarker): each has a digest + // that no kept verdict can have (a fresh random one), so the check runs it every time. ReadsOutside []string `json:"reads_outside,omitempty"` + // neverKept is, per package of ReadsOutside, why its marker cannot be trusted; hashedFiles caches the content lines + // of the files markers name, which several packages share (the catalogue's manifests). + neverKept map[string]string + hashedFiles map[string]string // Needs are the packages whose tests at this level need something of the node, as their NeedsMarker names it. Needs []delivery.PackageNeeds `json:"needs,omitempty"` // JudgedBy is the program that ran the digest (ADR 0535 §5): "installed", or "candidate " under the @@ -247,7 +260,7 @@ func (m *Module) digestHere(ctx context.Context, workspace, level string) (Diges sort.Slice(res.Needs, func(i, j int) bool { return res.Needs[i].Package < res.Needs[j].Package }) for _, p := range res.ReadsOutside { if m.Say != nil { - m.Say("the %s level of %s always runs: its directory carries %s, so its tests read files outside it that no digest names", level, p, ReadsOutsideMarker) + m.Say("the %s level of %s always runs: its %s %s, so its tests read files outside it that no digest names", level, p, ReadsOutsideMarker, res.neverKept[p]) } } return res, nil @@ -316,18 +329,27 @@ func digestModule(res *DigestResult, pkgs map[string]*goPackage, tree string, he res.Needs = append(res.Needs, delivery.PackageNeeds{Package: path, Needs: n}) } } - if _, err := os.Stat(filepath.Join(root.Dir, ReadsOutsideMarker)); err == nil { - // The digest of a package that reads outside itself is one nothing can have kept: the key is a fresh random - // hex, so the ask finds no kept verdict and runs it, and what the checker writes under it is never read again. + declared, why, err := declaredReads(tree, root, res.hashed()) + if err != nil { + return fmt.Errorf("%s: its %s: %w", path, ReadsOutsideMarker, err) + } + if why != "" { + // The digest of a package whose reads outside itself are not listed is one nothing can have kept: the key is a + // fresh random hex, so the ask finds no kept verdict and runs it, and what the checker writes under it is never + // read again. var nonce [32]byte if _, err := rand.Read(nonce[:]); err != nil { return err } res.Packages[path] = hex.EncodeToString(nonce[:]) res.ReadsOutside = append(res.ReadsOutside, path) + if res.neverKept == nil { + res.neverKept = map[string]string{} + } + res.neverKept[path] = why continue } - d, err := packageDigest(root, testMain, pkgs, tree, header, beside) + d, err := packageDigest(root, testMain, pkgs, tree, header, beside, declared) if err != nil { return fmt.Errorf("%s: %w", path, err) } @@ -340,14 +362,15 @@ func digestModule(res *DigestResult, pkgs map[string]*goPackage, tree string, he // tests reach in the module's own tree (by their content, under their path in the tree), the version and checksum of // every module outside it, and the package's own test data. The beside lines (the siblings' commits) join the header // only when a file the tests reach names MESH_CHECK_BESIDE. A package of the standard library is the Go version's. -func packageDigest(root, testMain *goPackage, pkgs map[string]*goPackage, tree string, header, beside []string) (string, error) { +// The lines a package's ReadsOutsideMarker declares join them (declaredReads). +func packageDigest(root, testMain *goPackage, pkgs map[string]*goPackage, tree string, header, beside, declared []string) (string, error) { reached := map[string]*goPackage{root.ImportPath: root} for _, dep := range testMain.Deps { if p := pkgs[dep]; p != nil { reached[dep] = p } } - lines := []string{} + lines := append([]string{}, declared...) readsBeside := false for _, p := range reached { if p.Standard || p.Module == nil { @@ -469,3 +492,104 @@ func contentLine(tree string, p *goPackage, path string) (string, error) { sum := sha256.Sum256(raw) return "file " + label + " " + hex.EncodeToString(sum[:]), nil } + +// hashed is the cache of content lines a digest step shares across its packages. +func (r *DigestResult) hashed() map[string]string { + if r.hashedFiles == nil { + r.hashedFiles = map[string]string{} + } + return r.hashedFiles +} + +// declaredReads are the digest lines a package's ReadsOutsideMarker adds: each of its lines, the content line of every +// file it names, and those of every file of the package's own directory. Without a marker it answers nothing. why is +// set, and the lines nil, when the marker cannot be trusted: it lists nothing, a line is not a clean relative path, or +// a line without ? matches nothing. +func declaredReads(tree string, root *goPackage, cache map[string]string) (lines []string, why string, err error) { + raw, err := os.ReadFile(filepath.Join(root.Dir, ReadsOutsideMarker)) + if errors.Is(err, fs.ErrNotExist) { + return nil, "", nil + } + if err != nil { + return nil, "", err + } + var patterns []string + for _, l := range strings.Split(string(raw), "\n") { + if l = strings.TrimSpace(l); l != "" && !strings.HasPrefix(l, "#") { + patterns = append(patterns, l) + } + } + if len(patterns) == 0 { + return nil, "lists nothing", nil + } + seen := map[string]bool{} + add := func(path string) error { + if seen[path] { + return nil + } + seen[path] = true + l, ok := cache[path] + if !ok { + var err error + if l, err = contentLine(tree, root, path); err != nil { + return err + } + cache[path] = l + } + lines = append(lines, "read "+l) + return nil + } + for _, l := range patterns { + pattern, absent := strings.CutPrefix(l, "?") + if !cleanTreePattern(pattern) { + return nil, fmt.Sprintf("names %q, which is not a clean path from the repository's root", l), nil + } + matches, err := filepath.Glob(filepath.Join(tree, filepath.FromSlash(pattern))) + if err != nil { + return nil, fmt.Sprintf("names %q, which is not a glob", l), nil + } + if len(matches) == 0 && !absent { + return nil, fmt.Sprintf("names %q, which matches nothing (a path whose absence is read starts with ?)", l), nil + } + lines = append(lines, "reads "+l) + for _, match := range matches { + if err := walkFiles(match, add); err != nil { + return nil, "", err + } + } + } + // Every file of the package's own directory: its lists, its marker, and its Go files too, since go list leaves a + // file its build tags exclude (an integration test a unit test globs) out of what the digest hashes. A file the + // toolchain lists is hashed twice, which changes nothing. + err = walkFiles(root.Dir, add) + return lines, "", err +} + +// cleanTreePattern says a marker's line is a path from the repository's root that stays inside it. +func cleanTreePattern(p string) bool { + if p == "" || strings.ContainsAny(p, " \t\\") || strings.HasPrefix(p, "/") || path.Clean(p) != p { + return false + } + for _, e := range strings.Split(p, "/") { + if e == ".." || e == "." { + return false + } + } + return true +} + +// walkFiles calls each with every file at or under path, skipping .git and node_modules, in lexical order. +func walkFiles(path string, each func(string) error) error { + return filepath.WalkDir(path, func(p string, e fs.DirEntry, err error) error { + if err != nil { + return err + } + if e.IsDir() { + if n := e.Name(); p != path && (n == ".git" || n == "node_modules") { + return filepath.SkipDir + } + return nil + } + return each(p) + }) +} diff --git a/modules/mesh-build-go/cmd/mesh-build-go/digest_test.go b/modules/mesh-build-go/cmd/mesh-build-go/digest_test.go index a2bdd155..a6dac3a4 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/digest_test.go +++ b/modules/mesh-build-go/cmd/mesh-build-go/digest_test.go @@ -173,7 +173,7 @@ func TestAModuleOutsideTheTreeCountsByVersionAndChecksum(t *testing.T) { testMain := &goPackage{ImportPath: "x/r.test", Deps: []string{ext.ImportPath}} pkgs[root.ImportPath] = root digest := func() string { - d, err := packageDigest(root, testMain, pkgs, dir, []string{"digest 1"}, nil) + d, err := packageDigest(root, testMain, pkgs, dir, []string{"digest 1"}, nil, nil) if err != nil { t.Fatal(err) } @@ -190,28 +190,74 @@ func TestAModuleOutsideTheTreeCountsByVersionAndChecksum(t *testing.T) { } } -// Issue 1935: a package whose directory carries the reads-outside marker is never kept: its digest is one no kept verdict -// can have (it differs on every call, though nothing changed), and the answer names it. A package without the marker -// keeps its digest. -func TestAPackageWithTheReadsOutsideMarkerIsNeverKept(t *testing.T) { +// Issue 1935, 1936: a package whose reads-outside marker lists nothing it can trust is never kept: its digest is one no +// kept verdict can have (it differs on every call, though nothing changed), and the answer names it. A marker that lists +// what the tests read is kept: a change to a file it names changes the package's digest, a change elsewhere does not. +func TestAPackageWithTheReadsOutsideMarkerIsKeptOnlyByWhatItLists(t *testing.T) { t.Parallel() m, tree := digestFixture(t) plain := digests(t, m, "unit") if len(plain.ReadsOutside) != 0 { t.Fatalf("a package carries the marker in the fixture: %v", plain.ReadsOutside) } - edit(t, tree, "c/"+ReadsOutsideMarker, "the tests read ../docs\n") - first, second := digests(t, m, "unit"), digests(t, m, "unit") - c := "fixture/digest/c" - if len(first.Packages[c]) != 64 || first.Packages[c] == second.Packages[c] || first.Packages[c] == plain.Packages[c] { - t.Errorf("c carries the marker and its digest is stable: %s, %s, before %s", first.Packages[c], second.Packages[c], plain.Packages[c]) + c, a := "fixture/digest/c", "fixture/digest/a" + if err := os.MkdirAll(filepath.Join(tree, "docs"), 0o755); err != nil { + t.Fatal(err) } - if strings.Join(first.ReadsOutside, ",") != c { - t.Errorf("the answer does not name the package that reads outside: %v", first.ReadsOutside) + edit(t, tree, "docs/one.md", "one\n") + edit(t, tree, "other.md", "other\n") + for name, marker := range map[string]string{ + "an empty marker": "# nothing listed\n\n", + "a sentence": "the tests read ../docs\n", + "a path climbing out": "../docs\n", + "a path matching nothing": "docs/none.md\n", + "an absolute path": "/etc/passwd\n", + "a path that is not clean": "docs/./one.md\n", + "a good line and a bad line": "docs\nnope/*.md\n", + } { + edit(t, tree, "c/"+ReadsOutsideMarker, marker) + first, second := digests(t, m, "unit"), digests(t, m, "unit") + if len(first.Packages[c]) != 64 || first.Packages[c] == second.Packages[c] || first.Packages[c] == plain.Packages[c] { + t.Errorf("%s: c's digest is stable: %s, %s, before %s", name, first.Packages[c], second.Packages[c], plain.Packages[c]) + } + if strings.Join(first.ReadsOutside, ",") != c { + t.Errorf("%s: the answer does not name the package that reads outside: %v", name, first.ReadsOutside) + } + if first.Packages[a] != plain.Packages[a] || first.Packages[a] != second.Packages[a] { + t.Errorf("%s: a has no marker and its digest moved: %s, %s, before %s", name, first.Packages[a], second.Packages[a], plain.Packages[a]) + } } - a := "fixture/digest/a" - if first.Packages[a] != plain.Packages[a] || first.Packages[a] != second.Packages[a] { - t.Errorf("a has no marker and its digest moved: %s, %s, before %s", first.Packages[a], second.Packages[a], plain.Packages[a]) + + // A list: a glob, a directory read whole, and a path whose absence is read. + edit(t, tree, "c/"+ReadsOutsideMarker, "# what c's tests read\ndocs/*.md\ndocs\n?gone\n") + before := digests(t, m, "unit") + if len(before.ReadsOutside) != 0 || len(before.Packages[c]) != 64 || before.Packages[c] == plain.Packages[c] { + t.Fatalf("a listed marker is not kept: %v, %s (no marker %s)", before.ReadsOutside, before.Packages[c], plain.Packages[c]) + } + if again := digests(t, m, "unit"); again.Packages[c] != before.Packages[c] { + t.Errorf("nothing changed and c's digest moved") + } + for _, step := range []struct { + file, text string + moves bool + }{ + {"other.md", "changed\n", false}, // outside the list + {"d/d.go", "package d\n\n// D.\n", false}, // a package c's tests do not reach + {"docs/one.md", "changed\n", true}, // a listed file + {"docs/two.md", "new\n", true}, // a new file the glob matches + {"gone", "here\n", true}, // a path whose absence was read + {"c/note.txt", "changed\n", true}, // the package's own file that is not Go + {"c/x_integration_test.go", "//go:build integration\n\npackage c\n", true}, // a Go file its build tags leave out (go list's IgnoredGoFiles) + } { + edit(t, tree, step.file, step.text) + after := digests(t, m, "unit") + if moved := after.Packages[c] != before.Packages[c]; moved != step.moves { + t.Errorf("a change to %s: c's digest moved %v, want %v", step.file, moved, step.moves) + } + if after.Packages[a] != plain.Packages[a] { + t.Errorf("a change to %s moved a's digest", step.file) + } + before = after } // Issue 890/AC3: a package whose directory carries the needs marker is named with its needs at the integration level, diff --git a/modules/mesh-build-go/cmd/mesh-build-go/reads-outside b/modules/mesh-build-go/cmd/mesh-build-go/reads-outside index c1b869c0..ea239b40 100644 --- a/modules/mesh-build-go/cmd/mesh-build-go/reads-outside +++ b/modules/mesh-build-go/cmd/mesh-build-go/reads-outside @@ -1 +1,7 @@ -These tests read other catalogue modules' files, outside this module (issue 1935): never kept. +# 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. +# the manifests through mesh-sdk's validator (the predefined keys), gitea's and mesh-build-node's. +predefined.json +modules/gitea +modules/mesh-build-node diff --git a/modules/mesh-build-image/cmd/mesh-build-image/reads-outside b/modules/mesh-build-image/cmd/mesh-build-image/reads-outside index c1b869c0..b79eb772 100644 --- a/modules/mesh-build-image/cmd/mesh-build-image/reads-outside +++ b/modules/mesh-build-image/cmd/mesh-build-image/reads-outside @@ -1 +1,10 @@ -These tests read other catalogue modules' files, outside this module (issue 1935): never kept. +# 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. +# the manifests through mesh-sdk's validator (the predefined keys), with the modules they compose with. +predefined.json +modules/gitea +modules/mesh-build-go +modules/mesh-build-node +modules/buildah +modules/docker diff --git a/modules/mesh-build-node/cmd/mesh-build-node/reads-outside b/modules/mesh-build-node/cmd/mesh-build-node/reads-outside index c1b869c0..26937843 100644 --- a/modules/mesh-build-node/cmd/mesh-build-node/reads-outside +++ b/modules/mesh-build-node/cmd/mesh-build-node/reads-outside @@ -1 +1,5 @@ -These tests read other catalogue modules' files, outside this module (issue 1935): never kept. +# 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. +# its manifest through mesh-sdk's validator, which reads the root's predefined keys. +predefined.json diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/reads-outside b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/reads-outside index f6b2d871..8deabea3 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/reads-outside +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# every manifest: the gate is the seat's only claimant. +modules/*/module.json diff --git a/modules/mesh-issues/cmd/mesh-issues/reads-outside b/modules/mesh-issues/cmd/mesh-issues/reads-outside index f6b2d871..628ce47b 100644 --- a/modules/mesh-issues/cmd/mesh-issues/reads-outside +++ b/modules/mesh-issues/cmd/mesh-issues/reads-outside @@ -1 +1,7 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# every module folder: its manifest, and whether it holds code (go.mod, package.json). +modules/*/module.json +modules/*/go.mod +modules/*/package.json diff --git a/modules/mesh-knowledge/cmd/mesh-knowledge/reads-outside b/modules/mesh-knowledge/cmd/mesh-knowledge/reads-outside index f6b2d871..8ac753d2 100644 --- a/modules/mesh-knowledge/cmd/mesh-knowledge/reads-outside +++ b/modules/mesh-knowledge/cmd/mesh-knowledge/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the root's retired lines. +retired-lines diff --git a/modules/mesh-mail-notifier/cmd/mesh-mail-notifier/reads-outside b/modules/mesh-mail-notifier/cmd/mesh-mail-notifier/reads-outside index f6b2d871..828cd198 100644 --- a/modules/mesh-mail-notifier/cmd/mesh-mail-notifier/reads-outside +++ b/modules/mesh-mail-notifier/cmd/mesh-mail-notifier/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# mesh-mail's mailevent.go, of which this package holds a copy. +modules/mesh-mail/cmd/mesh-mail/mailevent.go diff --git a/modules/mesh-mail-reader/cmd/mesh-mail-reader/reads-outside b/modules/mesh-mail-reader/cmd/mesh-mail-reader/reads-outside index f6b2d871..828cd198 100644 --- a/modules/mesh-mail-reader/cmd/mesh-mail-reader/reads-outside +++ b/modules/mesh-mail-reader/cmd/mesh-mail-reader/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# mesh-mail's mailevent.go, of which this package holds a copy. +modules/mesh-mail/cmd/mesh-mail/mailevent.go diff --git a/modules/mesh-mail/cmd/mesh-mail/reads-outside b/modules/mesh-mail/cmd/mesh-mail/reads-outside index f6b2d871..9088f24e 100644 --- a/modules/mesh-mail/cmd/mesh-mail/reads-outside +++ b/modules/mesh-mail/cmd/mesh-mail/reads-outside @@ -1 +1,5 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# messenger's content rule, of which content_rule.go is a copy. +modules/messenger/cmd/messenger/content.go diff --git a/modules/mesh-provisioner-client/cmd/mesh-provisioner-client/reads-outside b/modules/mesh-provisioner-client/cmd/mesh-provisioner-client/reads-outside index c1b869c0..5fba8c24 100644 --- a/modules/mesh-provisioner-client/cmd/mesh-provisioner-client/reads-outside +++ b/modules/mesh-provisioner-client/cmd/mesh-provisioner-client/reads-outside @@ -1 +1,7 @@ -These tests read other catalogue modules' files, outside this module (issue 1935): never kept. +# 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. +# every manifest and the templates the moved modules name (in files/, or templates/). +modules/*/module.json +modules/*/files +modules/*/templates diff --git a/modules/minio/cmd/object-store/reads-outside b/modules/minio/cmd/object-store/reads-outside index c1b869c0..756af267 100644 --- a/modules/minio/cmd/object-store/reads-outside +++ b/modules/minio/cmd/object-store/reads-outside @@ -1 +1,5 @@ -These tests read other catalogue modules' files, outside this module (issue 1935): never kept. +# 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. +# brother's store.json, against the object store's. +modules/brother/files/store.json diff --git a/modules/networkmanager/cmd/uplink-tools/reads-outside b/modules/networkmanager/cmd/uplink-tools/reads-outside index f6b2d871..ceb6d7da 100644 --- a/modules/networkmanager/cmd/uplink-tools/reads-outside +++ b/modules/networkmanager/cmd/uplink-tools/reads-outside @@ -1 +1,6 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of uplink-tools in both modules that hold the uplink. +modules/networkmanager/cmd/uplink-tools/*.go +modules/systemd-networkd/cmd/uplink-tools/*.go diff --git a/modules/nextcloud-client/cmd/nextcloud-client-tools/reads-outside b/modules/nextcloud-client/cmd/nextcloud-client-tools/reads-outside index f6b2d871..72d043ba 100644 --- a/modules/nextcloud-client/cmd/nextcloud-client-tools/reads-outside +++ b/modules/nextcloud-client/cmd/nextcloud-client-tools/reads-outside @@ -1 +1,25 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of desktop.go and its tests in every module that carries one. +modules/blueman/cmd/blueman-tools/desktop.go +modules/blueman/cmd/blueman-tools/desktop_test.go +modules/blueman/cmd/blueman-tools/copies_test.go +modules/forticlient/cmd/forticlient-tools/desktop.go +modules/forticlient/cmd/forticlient-tools/desktop_test.go +modules/forticlient/cmd/forticlient-tools/copies_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/copies_test.go +modules/nm-applet/cmd/nm-applet-tools/desktop.go +modules/nm-applet/cmd/nm-applet-tools/desktop_test.go +modules/nm-applet/cmd/nm-applet-tools/copies_test.go +modules/openrazer/cmd/openrazer-tools/desktop.go +modules/openrazer/cmd/openrazer-tools/desktop_test.go +modules/openrazer/cmd/openrazer-tools/copies_test.go +modules/polychromatic/cmd/polychromatic-tools/desktop.go +modules/polychromatic/cmd/polychromatic-tools/desktop_test.go +modules/polychromatic/cmd/polychromatic-tools/copies_test.go +modules/slack/cmd/slack-tools/desktop.go +modules/slack/cmd/slack-tools/desktop_test.go +modules/slack/cmd/slack-tools/copies_test.go diff --git a/modules/nm-applet/cmd/nm-applet-tools/reads-outside b/modules/nm-applet/cmd/nm-applet-tools/reads-outside index f6b2d871..72d043ba 100644 --- a/modules/nm-applet/cmd/nm-applet-tools/reads-outside +++ b/modules/nm-applet/cmd/nm-applet-tools/reads-outside @@ -1 +1,25 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of desktop.go and its tests in every module that carries one. +modules/blueman/cmd/blueman-tools/desktop.go +modules/blueman/cmd/blueman-tools/desktop_test.go +modules/blueman/cmd/blueman-tools/copies_test.go +modules/forticlient/cmd/forticlient-tools/desktop.go +modules/forticlient/cmd/forticlient-tools/desktop_test.go +modules/forticlient/cmd/forticlient-tools/copies_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/copies_test.go +modules/nm-applet/cmd/nm-applet-tools/desktop.go +modules/nm-applet/cmd/nm-applet-tools/desktop_test.go +modules/nm-applet/cmd/nm-applet-tools/copies_test.go +modules/openrazer/cmd/openrazer-tools/desktop.go +modules/openrazer/cmd/openrazer-tools/desktop_test.go +modules/openrazer/cmd/openrazer-tools/copies_test.go +modules/polychromatic/cmd/polychromatic-tools/desktop.go +modules/polychromatic/cmd/polychromatic-tools/desktop_test.go +modules/polychromatic/cmd/polychromatic-tools/copies_test.go +modules/slack/cmd/slack-tools/desktop.go +modules/slack/cmd/slack-tools/desktop_test.go +modules/slack/cmd/slack-tools/copies_test.go diff --git a/modules/openrazer/cmd/openrazer-tools/reads-outside b/modules/openrazer/cmd/openrazer-tools/reads-outside index f6b2d871..72d043ba 100644 --- a/modules/openrazer/cmd/openrazer-tools/reads-outside +++ b/modules/openrazer/cmd/openrazer-tools/reads-outside @@ -1 +1,25 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of desktop.go and its tests in every module that carries one. +modules/blueman/cmd/blueman-tools/desktop.go +modules/blueman/cmd/blueman-tools/desktop_test.go +modules/blueman/cmd/blueman-tools/copies_test.go +modules/forticlient/cmd/forticlient-tools/desktop.go +modules/forticlient/cmd/forticlient-tools/desktop_test.go +modules/forticlient/cmd/forticlient-tools/copies_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/copies_test.go +modules/nm-applet/cmd/nm-applet-tools/desktop.go +modules/nm-applet/cmd/nm-applet-tools/desktop_test.go +modules/nm-applet/cmd/nm-applet-tools/copies_test.go +modules/openrazer/cmd/openrazer-tools/desktop.go +modules/openrazer/cmd/openrazer-tools/desktop_test.go +modules/openrazer/cmd/openrazer-tools/copies_test.go +modules/polychromatic/cmd/polychromatic-tools/desktop.go +modules/polychromatic/cmd/polychromatic-tools/desktop_test.go +modules/polychromatic/cmd/polychromatic-tools/copies_test.go +modules/slack/cmd/slack-tools/desktop.go +modules/slack/cmd/slack-tools/desktop_test.go +modules/slack/cmd/slack-tools/copies_test.go diff --git a/modules/pacman/cmd/pacman-tools/reads-outside b/modules/pacman/cmd/pacman-tools/reads-outside index 2c69a776..856f5874 100644 --- a/modules/pacman/cmd/pacman-tools/reads-outside +++ b/modules/pacman/cmd/pacman-tools/reads-outside @@ -1 +1,5 @@ -These tests read the repository's root predefined.json, outside this module (issue 1935): never kept. +# 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. +# the root's predefined keys. +predefined.json diff --git a/modules/polychromatic/cmd/polychromatic-tools/reads-outside b/modules/polychromatic/cmd/polychromatic-tools/reads-outside index f6b2d871..72d043ba 100644 --- a/modules/polychromatic/cmd/polychromatic-tools/reads-outside +++ b/modules/polychromatic/cmd/polychromatic-tools/reads-outside @@ -1 +1,25 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of desktop.go and its tests in every module that carries one. +modules/blueman/cmd/blueman-tools/desktop.go +modules/blueman/cmd/blueman-tools/desktop_test.go +modules/blueman/cmd/blueman-tools/copies_test.go +modules/forticlient/cmd/forticlient-tools/desktop.go +modules/forticlient/cmd/forticlient-tools/desktop_test.go +modules/forticlient/cmd/forticlient-tools/copies_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/copies_test.go +modules/nm-applet/cmd/nm-applet-tools/desktop.go +modules/nm-applet/cmd/nm-applet-tools/desktop_test.go +modules/nm-applet/cmd/nm-applet-tools/copies_test.go +modules/openrazer/cmd/openrazer-tools/desktop.go +modules/openrazer/cmd/openrazer-tools/desktop_test.go +modules/openrazer/cmd/openrazer-tools/copies_test.go +modules/polychromatic/cmd/polychromatic-tools/desktop.go +modules/polychromatic/cmd/polychromatic-tools/desktop_test.go +modules/polychromatic/cmd/polychromatic-tools/copies_test.go +modules/slack/cmd/slack-tools/desktop.go +modules/slack/cmd/slack-tools/desktop_test.go +modules/slack/cmd/slack-tools/copies_test.go diff --git a/modules/postgres/cmd/postgres-provider/reads-outside b/modules/postgres/cmd/postgres-provider/reads-outside index c1b869c0..1aaa7f89 100644 --- a/modules/postgres/cmd/postgres-provider/reads-outside +++ b/modules/postgres/cmd/postgres-provider/reads-outside @@ -1 +1,5 @@ -These tests read other catalogue modules' files, outside this module (issue 1935): never kept. +# 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. +# every manifest. +modules/*/module.json diff --git a/modules/slack/cmd/slack-tools/reads-outside b/modules/slack/cmd/slack-tools/reads-outside index f6b2d871..72d043ba 100644 --- a/modules/slack/cmd/slack-tools/reads-outside +++ b/modules/slack/cmd/slack-tools/reads-outside @@ -1 +1,25 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of desktop.go and its tests in every module that carries one. +modules/blueman/cmd/blueman-tools/desktop.go +modules/blueman/cmd/blueman-tools/desktop_test.go +modules/blueman/cmd/blueman-tools/copies_test.go +modules/forticlient/cmd/forticlient-tools/desktop.go +modules/forticlient/cmd/forticlient-tools/desktop_test.go +modules/forticlient/cmd/forticlient-tools/copies_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop.go +modules/nextcloud-client/cmd/nextcloud-client-tools/desktop_test.go +modules/nextcloud-client/cmd/nextcloud-client-tools/copies_test.go +modules/nm-applet/cmd/nm-applet-tools/desktop.go +modules/nm-applet/cmd/nm-applet-tools/desktop_test.go +modules/nm-applet/cmd/nm-applet-tools/copies_test.go +modules/openrazer/cmd/openrazer-tools/desktop.go +modules/openrazer/cmd/openrazer-tools/desktop_test.go +modules/openrazer/cmd/openrazer-tools/copies_test.go +modules/polychromatic/cmd/polychromatic-tools/desktop.go +modules/polychromatic/cmd/polychromatic-tools/desktop_test.go +modules/polychromatic/cmd/polychromatic-tools/copies_test.go +modules/slack/cmd/slack-tools/desktop.go +modules/slack/cmd/slack-tools/desktop_test.go +modules/slack/cmd/slack-tools/copies_test.go diff --git a/modules/systemd-networkd/cmd/uplink-tools/reads-outside b/modules/systemd-networkd/cmd/uplink-tools/reads-outside index f6b2d871..ceb6d7da 100644 --- a/modules/systemd-networkd/cmd/uplink-tools/reads-outside +++ b/modules/systemd-networkd/cmd/uplink-tools/reads-outside @@ -1 +1,6 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of uplink-tools in both modules that hold the uplink. +modules/networkmanager/cmd/uplink-tools/*.go +modules/systemd-networkd/cmd/uplink-tools/*.go diff --git a/modules/xorg/internal/desktop/reads-outside b/modules/xorg/internal/desktop/reads-outside index f6b2d871..7ef55c53 100644 --- a/modules/xorg/internal/desktop/reads-outside +++ b/modules/xorg/internal/desktop/reads-outside @@ -1 +1,9 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of this package in every module that carries one. +modules/xorg/internal/desktop/*.go +modules/lemurs/internal/desktop/*.go +modules/i3/internal/desktop/*.go +modules/xterm/internal/desktop/*.go +modules/adwaita/internal/desktop/*.go diff --git a/modules/xterm/internal/desktop/reads-outside b/modules/xterm/internal/desktop/reads-outside index f6b2d871..7ef55c53 100644 --- a/modules/xterm/internal/desktop/reads-outside +++ b/modules/xterm/internal/desktop/reads-outside @@ -1 +1,9 @@ -These tests read files outside this directory (the whole catalogue, the repository, or its root files): mesh-build-go never keeps this package's verdict (issue 1935). +# 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. +# the copies of this package in every module that carries one. +modules/xorg/internal/desktop/*.go +modules/lemurs/internal/desktop/*.go +modules/i3/internal/desktop/*.go +modules/xterm/internal/desktop/*.go +modules/adwaita/internal/desktop/*.go