mirror of
https://github.com/morluto/rea
synced 2026-10-26 22:28:27 -04:00
e8491e023a
Host-file occurrences derived `executable` from POSIX execute bits, which Windows never reports, so every Windows host file (including PE .exe images classified as executable) reported `executable: false`. Derive the fact once through hostExecutable: POSIX hosts keep the execute bits; Windows marks regular files with the extensions it launches directly (.exe, .com, .bat, .cmd), without reading the ambient PATHEXT. Fixes #1819 Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { hostExecutableMarking } from "./hostExecutableMarking.js";
|
|
|
|
const file = (mode: number) => ({ mode, isFile: () => true });
|
|
const directory = (mode: number) => ({ mode, isFile: () => false });
|
|
|
|
describe("hostExecutableMarking", () => {
|
|
it("marks Windows launchable files by extension because NTFS has no execute bit", () => {
|
|
expect(
|
|
hostExecutableMarking("C:\\scratch\\whoami.exe", file(0o666), "win32"),
|
|
).toBe(true);
|
|
expect(
|
|
hostExecutableMarking("C:\\scratch\\SETUP.CMD", file(0o444), "win32"),
|
|
).toBe(true);
|
|
for (const path of [
|
|
"tools/SETUP.EXE",
|
|
"run.Cmd",
|
|
"build.bat",
|
|
"legacy.com",
|
|
])
|
|
expect(hostExecutableMarking(path, file(0o666), "win32")).toBe(true);
|
|
expect(hostExecutableMarking("readonly.exe", file(0o444), "win32")).toBe(
|
|
true,
|
|
);
|
|
expect(
|
|
hostExecutableMarking("C:\\scratch\\library.dll", file(0o666), "win32"),
|
|
).toBe(false);
|
|
expect(
|
|
hostExecutableMarking(
|
|
"C:\\scratch\\tools.exe",
|
|
directory(0o666),
|
|
"win32",
|
|
),
|
|
).toBe(false);
|
|
});
|
|
|
|
it("does not treat other Windows filenames as executable even with execute bits", () => {
|
|
for (const path of ["notes.txt", "README", "archive.exe.bak"])
|
|
expect(hostExecutableMarking(path, file(0o777), "win32")).toBe(false);
|
|
});
|
|
|
|
it("keeps POSIX permission bits authoritative regardless of extension", () => {
|
|
expect(hostExecutableMarking("/scratch/tool", file(0o755), "linux")).toBe(
|
|
true,
|
|
);
|
|
expect(
|
|
hostExecutableMarking("/scratch/whoami.exe", file(0o644), "darwin"),
|
|
).toBe(false);
|
|
});
|
|
});
|