driver: ignore wrong-suffix files as named sources
This commit is contained in:
@@ -8660,13 +8660,17 @@ fn basenameoff(p: *u8, plen: u64) u64 = {
|
||||
return start;
|
||||
};
|
||||
|
||||
fn sourceoperandnamed(path: *u8) bool = {
|
||||
return cstrendswithlit(path, ".ww");
|
||||
};
|
||||
|
||||
// A named Go source still passes through matchFile's leading-dot/underscore
|
||||
// exclusion even when UseAllFiles bypasses platform suffixes and build tags.
|
||||
// Inspect the public operand spelling so a hidden parent is not source identity
|
||||
// and a hidden symlink spelling cannot be resurrected by a non-directory
|
||||
// target's name or file kind.
|
||||
fn sourceoperandignored(path: *u8) bool = {
|
||||
if (!cstrendswithlit(path, ".ww")) { return false; };
|
||||
if (!sourceoperandnamed(path)) { return false; };
|
||||
let fi: os.filestat;
|
||||
match (os.stat(&fi, pathstr(path))) {
|
||||
case void => {
|
||||
@@ -8741,13 +8745,6 @@ fn buildsearchpath(selfdir: *u8, incs: *u8) *u8 = {
|
||||
fn resolvemodule(selfdir: *u8, name: *u8, incs: *u8, isdir: *i32) *u8 = {
|
||||
let nlen: u64 = cstrlen(name);
|
||||
|
||||
if (cstrendswithlit(name, ".ww")) {
|
||||
if (os.access(pathstr(name), 0i32) == 0) {
|
||||
*isdir = 0;
|
||||
return arenadupcstr(name, nlen);
|
||||
};
|
||||
};
|
||||
|
||||
let fi: os.filestat;
|
||||
let sr: (void | os.oserror) = os.stat(&fi, pathstr(name));
|
||||
let found: bool = false;
|
||||
@@ -8760,10 +8757,16 @@ fn resolvemodule(selfdir: *u8, name: *u8, incs: *u8, isdir: *i32) *u8 = {
|
||||
};
|
||||
case let e: os.oserror => void;
|
||||
};
|
||||
if (found) {
|
||||
if (foundisdir != 0) {
|
||||
*isdir = foundisdir;
|
||||
return arenadupcstr(name, nlen);
|
||||
};
|
||||
if (sourceoperandnamed(name)) {
|
||||
if (os.access(pathstr(name), 0i32) == 0 || found) {
|
||||
*isdir = 0;
|
||||
return arenadupcstr(name, nlen);
|
||||
};
|
||||
};
|
||||
if (reservedimportpath(name)) { return nil; };
|
||||
|
||||
let search: *u8 = buildsearchpath(selfdir, incs);
|
||||
@@ -9043,9 +9046,11 @@ fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
|
||||
let requestedstat: os.filestat;
|
||||
match (os.stat(&requestedstat, pathstr(src))) {
|
||||
case void => {
|
||||
requestedliteral = true;
|
||||
let typ: u32 = (requestedstat.mode: u32) & 61440u32;
|
||||
requestednondirectory = typ != os.mode.DIR: u32;
|
||||
requestedliteral = typ == os.mode.DIR: u32
|
||||
|| sourceoperandnamed(src);
|
||||
requestednondirectory = requestedliteral
|
||||
&& typ != os.mode.DIR: u32;
|
||||
};
|
||||
case let e: os.oserror => void;
|
||||
};
|
||||
@@ -9071,7 +9076,7 @@ fn dobuild(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
|
||||
let isdir: i32 = 0;
|
||||
let resolved: *u8 = nil;
|
||||
if (requestedliteral && !requestednondirectory
|
||||
&& cstrendswithlit(src, ".ww")) {
|
||||
&& sourceoperandnamed(src)) {
|
||||
isdir = 1;
|
||||
resolved = src;
|
||||
} else {
|
||||
@@ -9318,12 +9323,16 @@ fn dorun(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
|
||||
let requestedliteral: bool = false;
|
||||
let requestedstat: os.filestat;
|
||||
match (os.stat(&requestedstat, pathstr(src))) {
|
||||
case void => requestedliteral = true;
|
||||
case void => {
|
||||
let typ: u32 = (requestedstat.mode: u32) & 61440u32;
|
||||
requestedliteral = typ == os.mode.DIR: u32
|
||||
|| sourceoperandnamed(src);
|
||||
};
|
||||
case let e: os.oserror => void;
|
||||
};
|
||||
if (requestedliteral
|
||||
&& ((requestedstat.mode: u32) & 61440u32) == os.mode.DIR: u32
|
||||
&& cstrendswithlit(src, ".ww")) {
|
||||
&& sourceoperandnamed(src)) {
|
||||
if (cstrendswithlit(src, "_test.ww")) {
|
||||
cerrpath("ww: cannot run *_test.ww files (", src, ")\n");
|
||||
} else {
|
||||
@@ -9987,22 +9996,27 @@ fn dotest(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
|
||||
let first: os.filestat;
|
||||
let firstregular: bool = false;
|
||||
let firstfound: bool = false;
|
||||
let firstisdirphysical: bool = false;
|
||||
match (os.stat(&first, pathstr(target))) {
|
||||
case void => {
|
||||
firstfound = true;
|
||||
firstisdirphysical = ((first.mode: u32) & 61440u32)
|
||||
== os.mode.DIR: u32;
|
||||
firstregular = (((first.mode: u32) & 61440u32)
|
||||
== (os.mode.REG: u32));
|
||||
== (os.mode.REG: u32)) && sourceoperandnamed(target);
|
||||
};
|
||||
case let e: os.oserror => void;
|
||||
};
|
||||
if (!firstregular) {
|
||||
let firstresolved: *u8 = nil;
|
||||
let firstisdir: i32 = 0;
|
||||
if (!firstfound) {
|
||||
let firstlogical: bool = !firstfound
|
||||
|| (!firstisdirphysical && !sourceoperandnamed(target));
|
||||
if (firstlogical) {
|
||||
firstresolved = resolvemodule(selfdir, target, incs.ptr,
|
||||
&firstisdir);
|
||||
};
|
||||
if (firstfound || firstresolved == nil || firstisdir != 0) {
|
||||
if (!firstlogical || firstresolved == nil || firstisdir != 0) {
|
||||
let replacement: *u8 = nil;
|
||||
let identity: *u8 = requestidentity;
|
||||
if (firstisdir != 0) {
|
||||
@@ -10049,7 +10063,9 @@ fn dotest(selfdir: *u8, argv: **u8, argc: i32, start: i32) i32 = {
|
||||
case void => {
|
||||
let t: u32 = (fi.mode: u32) & 61440u32;
|
||||
if (t == os.mode.DIR: u32) { isdir = 1; found = true; }
|
||||
else { if (t == os.mode.REG: u32) { found = true; }; };
|
||||
else { if (t == os.mode.REG: u32 && sourceoperandnamed(target)) {
|
||||
found = true;
|
||||
}; };
|
||||
};
|
||||
case let e: os.oserror => void;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user