fix: ignore hidden named source operands

This commit is contained in:
2026-08-22 19:28:54 +09:00
parent 6279d46652
commit 3922f1c34e
6 changed files with 627 additions and 0 deletions

View File

@@ -987,6 +987,354 @@ fn cwdwritedata(dir: str, label: str) void = {
clean(root);
};
@test fn named_source_prefixes_are_ignored() void = {
let root: str = fresh();
let source: str = strings.concat(root, "/source");
let hiddenparent: str = strings.concat(source, "/.parent");
let symlinks: str = strings.concat(source, "/symlinks");
let warm: str = strings.concat(source, "/warm");
mkdirall(source); mkdirall(hiddenparent); mkdirall(symlinks); mkdirall(warm);
let maintext: str =
"package main;\nfn main() i32 = { return 0; };\n";
let testtext: str = strings.concat(
"package raw_windows_test;\n",
"@test fn selected() void = { assert(true); };\n");
let missingmain: str = strings.concat(
"package main;\nimport absent.pkg;\n",
"fn main() i32 = { return pkg.value(); };\n");
let missingtest: str = strings.concat(
"package missing_test;\nimport absent.pkg;\n",
"@test fn never() void = { abort(); };\n");
let malformed: str = "this source must never be opened {\n";
let hiddenbuild: str = strings.concat(source, "/_broken_windows_test.ww");
let dotbuild: str = strings.concat(source, "/.missing.ww");
let hiddentest: str = strings.concat(source,
"/_broken_windows_test.ww");
let dottest: str = strings.concat(source, "/.missing_test.ww");
let visiblewrong: str = strings.concat(source, "/visible_windows.ww");
let visiblewrongtest: str = strings.concat(source,
"/visible_windows_test.ww");
let hiddenparentmain: str = strings.concat(hiddenparent, "/main.ww");
let visibletarget: str = strings.concat(symlinks, "/target.ww");
let hiddentarget: str = strings.concat(symlinks, "/.target.ww");
let hiddenlink: str = strings.concat(symlinks, "/_link.ww");
let hiddendevice: str = strings.concat(symlinks, "/_device.ww");
let visiblelink: str = strings.concat(symlinks, "/visible-link.ww");
let warmvisible: str = strings.concat(warm, "/warm.ww");
let warmhidden: str = strings.concat(warm, "/_warm.ww");
writefile(hiddenbuild, malformed);
writefile(dotbuild, missingmain);
writefile(dottest, missingtest);
writefile(visiblewrong, maintext);
writefile(visiblewrongtest, testtext);
writefile(hiddenparentmain, maintext);
writefile(visibletarget, maintext);
writefile(hiddentarget, maintext);
assert(os.symlink(visibletarget, hiddenlink) == 0);
assert(os.symlink("/dev/null", hiddendevice) == 0);
assert(os.symlink(hiddentarget, visiblelink) == 0);
writefile(warmvisible, maintext);
let stages: []str = ["ww", "ww_ww"];
let tags: []str = ["c", "ww"];
let rootartifacts: []str = ["/__root.unit.ww", "/__root.wwi",
"/__root.s", "/__root.o", "/__root.a",
"/__root.init.unit.ww", "/__root.init.s", "/__root.init.o"];
let visiblebuildbin: str = "";
let visiblebuildartifacts: []str = alloc([], rootartifacts.len: u64)!;
let visibletestbin: str = "";
let visibletestartifacts: []str = alloc([], rootartifacts.len: u64)!;
let visibleteststdout: str = "";
let hiddendiagnostics: []str = alloc([], 20u64)!;
let si: i32 = 0;
for (si < stages.len) {
let prefix: str = strings.concat(tags[si], "-");
let coldwork: str = strings.concat(root, "/cold-work-", tags[si]);
let coldout: str = strings.concat(root, "/cold-output-", tags[si]);
let out: commandout;
// A final requested basename, rather than any parent component, owns
// Go's unconditional editor-temporary exclusion.
let av: []str = [driver(stages[si]), "build", "-w", coldwork,
"-o", coldout, "_broken_windows_test.ww"];
runcommanddir(root, strings.concat(prefix, "relative-hidden-build"),
source, av, (30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
let relativebuilddiag: str =
"ww: .: directory contains no WW package sources\n";
assert(out.stdout.len == 0 && same(out.stderr, relativebuilddiag)
&& !os.exists(coldwork) && !os.exists(coldout)
&& !os.exists(strings.concat(coldout, ".sepwork")));
append(hiddendiagnostics, strings.dup(out.stderr));
let dotbuildav: []str = [driver(stages[si]), "build", "-o",
strings.concat(root, "/dot-output-", tags[si]), dotbuild];
runcommand(root, strings.concat(prefix, "dot-missing-build"), dotbuildav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
let sourcediag: str = strings.concat("ww: ", source,
": directory contains no WW package sources\n");
assert(out.stdout.len == 0 && same(out.stderr, sourcediag)
&& !has(out.stderr, "absent.pkg")
&& !os.exists(strings.concat(root, "/dot-output-", tags[si]))
&& !os.exists(strings.concat(root, "/dot-output-", tags[si],
".sepwork")));
append(hiddendiagnostics, strings.dup(out.stderr));
let testcoldwork: str = strings.concat(root, "/cold-test-work-",
tags[si]);
let testcoldout: str = strings.concat(root, "/cold-test-output-",
tags[si]);
let hiddentestrunav: []str = [driver(stages[si]), "test", "-w",
testcoldwork, "-o",
testcoldout, hiddentest];
runcommand(root, strings.concat(prefix, "hidden-test-run"),
hiddentestrunav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
assert(same(out.stdout, "FAIL\n") && same(out.stderr, sourcediag)
&& !has(out.stderr, "invalid or missing package clause")
&& !os.exists(testcoldwork) && !os.exists(testcoldout)
&& !os.exists(strings.concat(testcoldout, ".sepwork")));
append(hiddendiagnostics, strings.dup(out.stderr));
let compiled: str = strings.concat(root, "/hidden-compiled-", tags[si]);
let hiddencompileav: []str = [driver(stages[si]), "test", "-c", "-o",
compiled,
hiddentest];
runcommand(root, strings.concat(prefix, "hidden-test-compile"),
hiddencompileav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
assert(out.stdout.len == 0 && same(out.stderr, sourcediag)
&& !os.exists(compiled)
&& !os.exists(strings.concat(compiled, ".sepwork")));
append(hiddendiagnostics, strings.dup(out.stderr));
let assembly: str = strings.concat(root, "/hidden-assembly-", tags[si]);
let hiddenasmav: []str = [driver(stages[si]), "test", "-S", "-o",
assembly,
hiddentest];
runcommand(root, strings.concat(prefix, "hidden-test-assembly"),
hiddenasmav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
assert(out.stdout.len == 0 && same(out.stderr, sourcediag)
&& !os.exists(assembly)
&& !os.exists(strings.concat(assembly, ".sepwork")));
append(hiddendiagnostics, strings.dup(out.stderr));
let dottestav: []str = [driver(stages[si]), "test", dottest];
runcommand(root, strings.concat(prefix, "dot-missing-test"), dottestav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
assert(same(out.stdout, "FAIL\n") && same(out.stderr, sourcediag)
&& !has(out.stderr, "absent.pkg"));
append(hiddendiagnostics, strings.dup(out.stderr));
let visiblework: str = strings.concat(root, "/visible-work-", tags[si]);
let visibleout: str = strings.concat(root, "/visible-output-", tags[si]);
mkdirall(visiblework);
let visiblebuildav: []str = [driver(stages[si]), "build", "-w",
visiblework, "-o",
visibleout, visiblewrong];
runcommand(root, strings.concat(prefix, "visible-wrong-platform-build"),
visiblebuildav, (60i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 0);
assert(out.stdout.len == 0 && out.stderr.len == 0
&& os.exists(visibleout));
let runav: []str = [visibleout];
runcommand(root, strings.concat(prefix, "visible-wrong-platform-run"),
runav, (10i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 0);
assert(out.stdout.len == 0 && out.stderr.len == 0);
let visiblebytes: str = strings.dup(readfile(visibleout));
let ai: i32 = 0;
if (si == 0) { visiblebuildbin = strings.dup(visiblebytes); } else {
assert(same(visiblebuildbin, visiblebytes));
};
for (ai < rootartifacts.len) {
let bytes: str = strings.dup(readfile(strings.concat(visiblework,
rootartifacts[ai])));
if (si == 0) { append(visiblebuildartifacts, bytes); }
else { assert(same(visiblebuildartifacts[ai], bytes)); };
ai += 1;
};
let testwork: str = strings.concat(root, "/visible-test-work-", tags[si]);
mkdirall(testwork);
let visibletestav: []str = [driver(stages[si]), "test", "-w", testwork,
visiblewrongtest];
runcommand(root, strings.concat(prefix, "visible-wrong-platform-test"),
visibletestav, (60i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 0);
assert(out.stderr.len == 0
&& occurrences(out.stdout, "selected ... ok\n") == 1
&& occurrences(out.stdout,
"1 passed, 0 failed, 0 skipped, 0 harness errors\n") == 1);
let testbytes: str = strings.dup(readfile(strings.concat(testwork,
"/main")));
if (si == 0) {
visibletestbin = strings.dup(testbytes);
visibleteststdout = strings.dup(out.stdout);
} else {
assert(same(visibletestbin, testbytes)
&& same(visibleteststdout, out.stdout));
};
ai = 0;
for (ai < rootartifacts.len) {
let bytes: str = strings.dup(readfile(strings.concat(testwork,
rootartifacts[ai])));
if (si == 0) { append(visibletestartifacts, bytes); }
else { assert(same(visibletestartifacts[ai], bytes)); };
ai += 1;
};
let parentout: str = strings.concat(root, "/hidden-parent-", tags[si]);
let parentwork: str = strings.concat(root, "/hidden-parent-work-",
tags[si]);
mkdirall(parentwork);
let parentav: []str = [driver(stages[si]), "build", "-w", parentwork,
"-o", parentout, hiddenparentmain];
runcommand(root, strings.concat(prefix, "hidden-parent-visible-base"),
parentav, (30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 0);
assert(out.stdout.len == 0 && out.stderr.len == 0
&& same(visiblebuildbin, readfile(parentout)));
let hiddenlinkout: str = strings.concat(root, "/hidden-link-", tags[si]);
let hiddenlinkav: []str = [driver(stages[si]), "build", "-o",
hiddenlinkout, hiddenlink];
runcommand(root, strings.concat(prefix, "hidden-request-symlink"),
hiddenlinkav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
let symlinkdiag: str = strings.concat("ww: ", symlinks,
": directory contains no WW package sources\n");
assert(out.stdout.len == 0 && same(out.stderr, symlinkdiag)
&& !os.exists(hiddenlinkout)
&& !os.exists(strings.concat(hiddenlinkout, ".sepwork")));
append(hiddendiagnostics, strings.dup(out.stderr));
let deviceout: str = strings.concat(root, "/hidden-device-", tags[si]);
let devicework: str = strings.concat(root, "/hidden-device-work-",
tags[si]);
let deviceav: []str = [driver(stages[si]), "build", "-w", devicework,
"-o", deviceout, hiddendevice];
runcommand(root, strings.concat(prefix, "hidden-device-build"), deviceav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
assert(out.stdout.len == 0 && same(out.stderr, symlinkdiag)
&& !os.exists(devicework) && !os.exists(deviceout)
&& !os.exists(strings.concat(deviceout, ".sepwork")));
append(hiddendiagnostics, strings.dup(out.stderr));
let devicetestwork: str = strings.concat(root,
"/hidden-device-test-work-", tags[si]);
let devicetestout: str = strings.concat(root,
"/hidden-device-test-output-", tags[si]);
let devicetestav: []str = [driver(stages[si]), "test", "-w",
devicetestwork, "-o", devicetestout, hiddendevice, "selected"];
runcommand(root, strings.concat(prefix, "hidden-device-test"),
devicetestav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
assert(same(out.stdout, "FAIL\n") && same(out.stderr, symlinkdiag)
&& !os.exists(devicetestwork) && !os.exists(devicetestout)
&& !os.exists(strings.concat(devicetestout, ".sepwork")));
append(hiddendiagnostics, strings.dup(out.stderr));
let visiblelinkout: str = strings.concat(root, "/visible-link-", tags[si]);
let visiblelinkwork: str = strings.concat(root, "/visible-link-work-",
tags[si]);
mkdirall(visiblelinkwork);
let visiblelinkav: []str = [driver(stages[si]), "build", "-w",
visiblelinkwork, "-o", visiblelinkout, visiblelink];
runcommand(root, strings.concat(prefix, "visible-request-symlink"),
visiblelinkav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 0);
assert(out.stdout.len == 0 && out.stderr.len == 0
&& same(visiblebuildbin, readfile(visiblelinkout)));
let warmwork: str = strings.concat(root, "/warm-work-", tags[si]);
let warmout: str = strings.concat(root, "/warm-output-", tags[si]);
mkdirall(warmwork);
let warmvalidav: []str = [driver(stages[si]), "build", "-w",
warmwork, "-o",
warmout, warmvisible];
runcommand(root, strings.concat(prefix, "warm-visible"), warmvalidav,
(60i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 0);
assert(out.stdout.len == 0 && out.stderr.len == 0
&& os.exists(warmout));
let warmbin: str = strings.dup(readfile(warmout));
let warmsnapshots: []str = alloc([], rootartifacts.len: u64)!;
ai = 0;
for (ai < rootartifacts.len) {
append(warmsnapshots, strings.dup(readfile(strings.concat(warmwork,
rootartifacts[ai]))));
ai += 1;
};
assert(os.rename(warmvisible, warmhidden) == 0);
let warmhiddenav: []str = [driver(stages[si]), "build", "-w",
warmwork, "-o",
warmout, warmhidden];
runcommand(root, strings.concat(prefix, "warm-hidden"), warmhiddenav,
(30i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 1);
let warmdiag: str = strings.concat("ww: ", warm,
": directory contains no WW package sources\n");
assert(out.stdout.len == 0 && same(out.stderr, warmdiag)
&& same(warmbin, readfile(warmout))
&& !os.exists(strings.concat(warmout, ".new"))
&& !os.exists(strings.concat(warmout, ".sepwork")));
append(hiddendiagnostics, strings.dup(out.stderr));
ai = 0;
for (ai < rootartifacts.len) {
assert(same(warmsnapshots[ai], readfile(strings.concat(warmwork,
rootartifacts[ai]))));
ai += 1;
};
assert(!directoryhasnew(warmwork)
&& !directoryhasfragment(warmwork, ".wwtxn.")
&& !directoryhasfragment(warmwork, ".install")
&& !directoryhasfragment(warmwork, ".sepwork"));
assert(os.rename(warmhidden, warmvisible) == 0);
runcommand(root, strings.concat(prefix, "warm-restored"), warmvalidav,
(60i64 * (time.second: i64)): time.duration, &out);
expectexit(&out, 0);
assert(out.stdout.len == 0 && out.stderr.len == 0
&& same(warmbin, readfile(warmout)));
ai = 0;
for (ai < rootartifacts.len) {
assert(same(warmsnapshots[ai], readfile(strings.concat(warmwork,
rootartifacts[ai]))));
ai += 1;
};
assert(!directoryhasnew(warmwork)
&& !directoryhasfragment(warmwork, ".wwtxn.")
&& !directoryhasfragment(warmwork, ".install")
&& !directoryhasfragment(warmwork, ".sepwork"));
si += 1;
};
let half: i32 = hiddendiagnostics.len / 2;
let di: i32 = 0;
for (di < half) {
assert(same(hiddendiagnostics[di], hiddendiagnostics[di + half]));
di += 1;
};
assert(!directoryhasnew(root)
&& !directoryhasfragment(root, ".wwtxn.")
&& !directoryhasfragment(root, ".install")
&& !directoryhasfragment(root, ".sepwork")
&& !directoryhasfragment(root, ".capture")
&& !directoryhasfragment(root, ".result")
&& !directoryhasfragment(root, ".request"));
clean(root);
};
// A source file has one contiguous import section immediately after its
// package clause. The parser may continue after a late import for recovery,
// but the imports-only loader and the full compiler parser both reject it.