From 1115cc38b193d0bdad1eea13f3dadacf908f453b Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 22 Sep 2026 17:01:57 +0800 Subject: [PATCH 1/2] Harden static Git evidence and restore truthful dogfood validation Centralize static Git helper suppression and reject incomplete reads; preserve literal filename identity and native Git object formats. Handle child input errors, reject incomplete Python helper results, and collect parser output in inventory order. Repair dogfood lifecycle and evidence assertions, add its CI gate, 16 regression tests, audit notes, and regenerated dist artifacts. --- .github/workflows/ci.yml | 2 + ARCHITECTURE.md | 4 +- CHANGELOG.md | 7 +++ CONTRIBUTING.md | 2 + SECURITY.md | 2 + dist/adapters/python.d.ts.map | 2 +- dist/adapters/python.js | 4 +- dist/adapters/python.js.map | 2 +- dist/git-command.d.ts | 13 ++++ dist/git-command.d.ts.map | 1 + dist/git-command.js | 76 +++++++++++++++++++++++ dist/git-command.js.map | 1 + dist/git.d.ts | 5 +- dist/git.d.ts.map | 2 +- dist/git.js | 85 ++++---------------------- dist/git.js.map | 2 +- dist/graph.js | 14 +++-- dist/graph.js.map | 2 +- dist/process.d.ts.map | 2 +- dist/process.js | 7 ++- dist/process.js.map | 2 +- dist/selection-workspace.d.ts.map | 2 +- dist/selection-workspace.js | 47 ++------------ dist/selection-workspace.js.map | 2 +- dist/test-map-binding.d.ts.map | 2 +- dist/test-map-binding.js | 28 +-------- dist/test-map-binding.js.map | 2 +- docs/production-readiness-audit.md | 39 ++++++++++++ docs/troubleshooting.md | 12 ++++ package.json | 3 +- scripts/dogfood.mjs | 18 ++++-- scripts/verify-test-manifest.mjs | 4 +- src/adapters/python.ts | 3 +- src/git-command.ts | 79 ++++++++++++++++++++++++ src/git.ts | 89 +++++---------------------- src/graph.ts | 12 ++-- src/process.ts | 7 ++- src/selection-workspace.ts | 47 ++------------ src/test-map-binding.ts | 28 +-------- tests/adapters.test.ts | 15 +++++ tests/analyze.test.ts | 17 ++++++ tests/checks.test.ts | 10 +++ tests/git.test.ts | 98 +++++++++++++++++++++++++++++- tests/process.test.ts | 29 +++++++++ tests/selection-workspace.test.ts | 34 +++++++++++ 45 files changed, 541 insertions(+), 323 deletions(-) create mode 100644 dist/git-command.d.ts create mode 100644 dist/git-command.d.ts.map create mode 100644 dist/git-command.js create mode 100644 dist/git-command.js.map create mode 100644 docs/production-readiness-audit.md create mode 100644 src/git-command.ts create mode 100644 tests/process.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6b2107d..e7167b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,6 +77,8 @@ jobs: cache: npm - run: npm ci - run: npm run test:action + - name: Verify dogfood evidence boundaries + run: npm run dogfood published-action: name: Action smoke / published v0.5.3 diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index d213e26..9bc6b43 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -12,7 +12,7 @@ check discovery → target qualification → per-target observation ## Modules -- `src/git.ts` uses `git` argument arrays without a shell. It validates revisions, parses NUL-delimited paths, includes untracked files for the default selection, and extracts zero-context hunk ranges. Read commands suppress hooks, filesystem monitors, external diff/text conversion, and configured content drivers. +- `src/git.ts` validates revisions, parses NUL-delimited paths, includes untracked files for the default selection, and extracts zero-context hunk ranges using literal per-file pathspecs. `src/git-command.ts` supplies the shared argument-array, no-shell boundary for all static Git reads, including immutable workspace and test-map binding checks. It suppresses hooks, filesystem monitors, external diff/text conversion, and configured content drivers, refreshing bounded driver discovery (including linked-worktree config) before each operation. Timed-out, failed-to-start, and truncated reads fail closed. Unborn repositories derive their empty-tree object from Git rather than assuming SHA-1. - `src/adapters/` contains the small `LanguageAdapter` boundary. JavaScript/TypeScript use `@babel/parser`. Python sends source text to `python -I -S` and the standard `ast` module; it does not import repository modules. Built-in adapters retain line-numbered call sites so reports can show structural call references that intersect changed lines. - `src/graph.ts` resolves only local, statically identifiable imports. It builds reverse dependencies for impact estimates and broad test-like relationship discovery. Test-like path heuristics do not establish runnable identity. - `src/resolution.ts` adds a fail-closed metadata layer for non-relative JavaScript/TypeScript imports. It reads bounded JSON/JSONC only, supports a narrow subset of compiler `paths` and package self-exports, retains inspectable graph evidence for successful edges, and never invokes a compiler, package manager, or repository resolver. @@ -52,6 +52,8 @@ Every report is derived during one run and can be serialized as JSON or HTML. Th - Files larger than 1 MB and binary files are not parsed. - At most 5,000 repository files are structurally analyzed per run. +- Source parsing runs concurrently, but analyses and diagnostics are collected in inventory order rather than completion order. +- Git stdout/stderr is capped at 8 MB per ordinary read, driver-name discovery at 64 KB, ignored-workspace inventory at 512 KB, and test-map snapshot reads at 256 KiB plus one byte. A reached output cap aborts analysis rather than parsing a partial record. Git reads have a 30-second timeout. - The displayed/risk-scored reverse-impact list is capped at 250 files per changed file; test-like relationship and qualification traversal is separately bounded by the 5,000-file analyzed inventory. - Static module metadata is capped at 256 KB per file, 64 compiler files, 256 package files, 32 ancestor directories, 8 inherited-config levels, 128 path keys, 8 targets per key, 32 custom conditions, 64 candidates per import, 8 export-condition levels, 64 visited export branches, 50,000 non-relative import observations, 10,000 retained resolution records, and 100 emitted resolution diagnostics. A reached bound creates no edge. - Check stdout/stderr defaults to 256 KB, runner observations are separately capped at 64 KB, and check duration defaults to 120 seconds. diff --git a/CHANGELOG.md b/CHANGELOG.md index 18caf9e..e6bf8fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ All notable changes are documented here. This project follows Semantic Versionin ### Fixed +- Repaired the dogfood gate by moving test preparation into npm's `pretest` lifecycle and retaining a direct serial `node --test` command. It now requires positive observations for every related compiled target while correctly retaining partial evidence for filename-mapped TypeScript source. Added a self-discovery regression and a PR CI dogfood step; shell-chain recognition and compiled-source confidence remain conservative. +- Unified static Git execution so immutable workspace checks and test-map snapshot reads receive the same helper suppression as diff inspection. Driver discovery now includes worktree configuration, refreshes on each operation, uses NUL-delimited names, and fails closed when incomplete. +- Rejected truncated, timed-out, or failed Git reads instead of treating partial paths or patches as complete evidence. Per-file patch failures now stop analysis with exit code 2. +- Treated per-file Git paths literally, including both sides of a rename, so brackets, wildcards, and pathspec magic cannot mix another file's hunks into evidence. +- Derived the empty-tree object from the repository's object format, supporting SHA-256 repositories before their first commit. +- Handled early child-stdin closure as a process error instead of an unhandled `EPIPE` crash. Python analysis rejects otherwise-valid output from failed, timed-out, or truncated helpers and retries or reports a lexical fallback. +- Preserved inventory order when collecting concurrent source analyses and diagnostics, eliminating parser/I/O completion order from those results. - Preserved ignored-file path identity across platforms when enforcing immutable workspace alignment. POSIX filenames containing literal backslashes are no longer rewritten as directory separators, so a distinct ignored runtime input such as `coverage\proof.lcov` cannot alias an explicitly allowed `coverage/proof.lcov` data artifact and bypass the pre-execution fail-closed gate. - Failed closed on unattributed targeted-runner process failures even when another qualified batch target is unavailable. An unavailable target can no longer act as a sink that lets unrelated observed passes survive an ambiguous process-level failure; only explicitly failed targets retain localized failure attribution. - Failed closed on deletion-only zero-context hunks when attributing current changed symbols and call references. Git represents a deletion-only hunk with a zero-length new-side range anchored to a neighboring current line; ProofDiff now reconciles reconstructed current-line spans with Git numstat additions before treating those anchors as changed current code. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 043f8a3..0589dad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,6 +22,8 @@ npm run dogfood npm pack --dry-run ``` +`npm test` runs its `pretest` lifecycle first to build, compile tests, and validate the explicit test manifest. Keep preparation there: the `test` script itself must remain an exact serial `node --test` invocation so ProofDiff can qualify its own test targets without interpreting shell chains. CI also runs `npm run dogfood`: all checks and related compiled targets must pass, while the TypeScript source correctly remains partially verified because filename mapping does not attest compilation provenance. + ## Expectations - Add observable-behavior tests for fixes and features. diff --git a/SECURITY.md b/SECURITY.md index b3677ab..9c91808 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -21,6 +21,8 @@ ProofDiff's safe default performs these local operations: - writes reports only to paths explicitly requested by the user; - performs no network requests and sends no telemetry. +All static Git reads share the same hardened launcher, including the filesystem-alignment check for immutable selections and test-map snapshot reads. Content-driver names are read as bounded NUL-delimited data from the effective repository/worktree configuration before each operation; the configuration is not cached across library calls. Incomplete configuration discovery or Git output aborts analysis. Per-file diff paths use literal pathspecs, so filename wildcards cannot change the scope of evidence. These measures retain the separate trusted-Git-directory boundary above; they do not protect against another process concurrently replacing repository/configuration files during analysis. + User-controlled revisions cannot begin with `-` or contain control/whitespace characters. ProofDiff's process launcher disables Node's shell mode. Git and parser operations are always started directly; on Windows, explicitly selected npm, pnpm, and Yarn checks use `cmd.exe` only to start the standard `.cmd` package-manager shim with fixed arguments. Package managers may then interpret their own configuration only within the documented boundaries. Filenames and report content are HTML-escaped; terminal control characters from untrusted report fields and check output are removed. GitHub job summaries HTML-escape repository-controlled paths, project analysis notes into fixed source-free categories (malformed/non-applicable compiler configuration, unsupported/ambiguous local resolution, unavailable source analysis, and explicit bounds), and omit source text, parser excerpts, symbols, commands, check output, observer payloads, and absolute repository paths. Malformed `package.json` produces a fixed parse note rather than copying the parser's source excerpt. Unclassified diagnostics are represented only by a count and cause the summary to recommend inspecting static limitations before runtime evidence. The Action writes only to GitHub's per-step summary file and does not require a write-capable token or call the GitHub API. ## Repository check execution diff --git a/dist/adapters/python.d.ts.map b/dist/adapters/python.d.ts.map index 4a2870f..b8276e0 100644 --- a/dist/adapters/python.d.ts.map +++ b/dist/adapters/python.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/adapters/python.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAwElD,KAAK,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEhH,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,eAAe,EAAE,CAI3G;AAOD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,mBAAmB,CAAA;CAAO,GACtE,OAAO,CAAC,cAAc,CAAC,CA4CzB;AAED,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,EAAE,EAAG,QAAQ,CAAU;IAChC,QAAQ,CAAC,UAAU,2BAA4B;IAEzC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAGpF"} \ No newline at end of file +{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/adapters/python.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAwElD,KAAK,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAEhH,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,eAAe,EAAE,CAI3G;AAQD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAAC,GAAG,CAAC,EAAE,mBAAmB,CAAA;CAAO,GACtE,OAAO,CAAC,cAAc,CAAC,CA4CzB;AAED,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,EAAE,EAAG,QAAQ,CAAU;IAChC,QAAQ,CAAC,UAAU,2BAA4B;IAEzC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAGpF"} \ No newline at end of file diff --git a/dist/adapters/python.js b/dist/adapters/python.js index e782c42..60fec43 100644 --- a/dist/adapters/python.js +++ b/dist/adapters/python.js @@ -68,6 +68,8 @@ export function pythonInterpreterCandidates(platform = process.platform) { function failureReason(result) { if (result.timedOut) return "timed out"; + if (result.truncated) + return "AST helper output exceeded its byte limit"; return result.stderr.trim() || result.error || `exited with ${String(result.exitCode)}`; } export async function analyzePythonSource(source, root, options = {}) { @@ -81,7 +83,7 @@ export async function analyzePythonSource(source, root, options = {}) { maxOutputBytes: 1_000_000, env: { PATH: safeExecutablePath(), PYTHONIOENCODING: "utf-8" }, }); - if (result.exitCode === 0) { + if (result.exitCode === 0 && !result.timedOut && !result.truncated && result.error === undefined) { try { const parsed = JSON.parse(result.stdout); if (parsed.error) diff --git a/dist/adapters/python.js.map b/dist/adapters/python.js.map index 1d08cef..00ec6ac 100644 --- a/dist/adapters/python.js.map +++ b/dist/adapters/python.js.map @@ -1 +1 @@ -{"version":3,"file":"python.js","sourceRoot":"","sources":["../../src/adapters/python.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"python.js","sourceRoot":"","sources":["../../src/adapters/python.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/git-command.d.ts b/dist/git-command.d.ts new file mode 100644 index 0000000..50625d3 --- /dev/null +++ b/dist/git-command.d.ts @@ -0,0 +1,13 @@ +import { type ProcessResult } from "./process.js"; +export declare class GitError extends Error { + name: string; +} +export declare function gitNullDevice(platform?: NodeJS.Platform): string; +interface GitOptions { + maxOutputBytes?: number; + stdin?: string; +} +/** All static Git reads share one boundary, including snapshot/workspace checks. */ +export declare function runGit(root: string, args: string[], options?: GitOptions): Promise; +export {}; +//# sourceMappingURL=git-command.d.ts.map \ No newline at end of file diff --git a/dist/git-command.d.ts.map b/dist/git-command.d.ts.map new file mode 100644 index 0000000..a90d2d1 --- /dev/null +++ b/dist/git-command.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"git-command.d.ts","sourceRoot":"","sources":["../src/git-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAElF,qBAAa,QAAS,SAAQ,KAAK;IACxB,IAAI,SAAc;CAC5B;AAED,wBAAgB,aAAa,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAElF;AAoBD,UAAU,UAAU;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0BD,oFAAoF;AACpF,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAoB3G"} \ No newline at end of file diff --git a/dist/git-command.js b/dist/git-command.js new file mode 100644 index 0000000..e24a77a --- /dev/null +++ b/dist/git-command.js @@ -0,0 +1,76 @@ +import { runProcess, safeExecutablePath } from "./process.js"; +export class GitError extends Error { + name = "GitError"; +} +export function gitNullDevice(platform = process.platform) { + return platform === "win32" ? "NUL" : "/dev/null"; +} +function gitEnvironment() { + const env = { + PATH: safeExecutablePath(), + GIT_CONFIG_NOSYSTEM: "1", + GIT_CONFIG_GLOBAL: gitNullDevice(), + GIT_ATTR_NOSYSTEM: "1", + GIT_NO_REPLACE_OBJECTS: "1", + GIT_TERMINAL_PROMPT: "0", + GIT_PAGER: "cat", + GIT_OPTIONAL_LOCKS: "0", + LC_ALL: "C", + }; + for (const key of ["SystemRoot", "WINDIR", "TMPDIR", "TMP", "TEMP"]) { + if (process.env[key] !== undefined) + env[key] = process.env[key]; + } + return env; +} +async function rawGit(root, args, overrides, options) { + const maxOutputBytes = options.maxOutputBytes ?? 8_000_000; + const result = await runProcess("git", [ + "--no-pager", + "-c", "core.quotepath=false", + "-c", "core.fsmonitor=false", + "-c", `core.hooksPath=${gitNullDevice()}`, + "-c", "diff.external=", + "-c", "attr.tree=refs/proofdiff/no-attributes", + ...overrides, + ...args, + ], { + cwd: root, + timeoutMs: 30_000, + maxOutputBytes, + env: gitEnvironment(), + ...(options.stdin === undefined ? {} : { stdin: options.stdin }), + }); + if (result.error !== undefined) + throw new GitError(`Could not run Git: ${result.error}`); + if (result.timedOut) + throw new GitError("Git inspection timed out; incomplete output cannot establish evidence."); + if (result.truncated) + throw new GitError(`Git output exceeded the ${maxOutputBytes} byte limit; incomplete output cannot establish evidence. Narrow the selected diff or use a smaller checkout.`); + return result; +} +/** All static Git reads share one boundary, including snapshot/workspace checks. */ +export async function runGit(root, args, options = {}) { + // Do not cache across calls: library callers and linked worktrees can change configuration. + // The sanitized environment excludes system/global config while retaining worktree config. + const config = await rawGit(root, ["config", "--includes", "--null", "--name-only", "--get-regexp", "^(filter|diff)\\..*\\.(clean|smudge|process|required|command|textconv)$"], [], { maxOutputBytes: 64_000 }); + if (config.exitCode !== 0 && !(config.exitCode === 1 && config.stdout === "")) { + throw new GitError("Could not inspect Git content-driver configuration; static inspection failed closed."); + } + const prefixes = new Set(); + for (const key of config.stdout.split("\0").filter(Boolean)) { + const match = key.match(/^((?:filter|diff)\..+)\.(?:clean|smudge|process|required|command|textconv)$/is); + if (match?.[1]) + prefixes.add(match[1]); + } + const overrides = []; + for (const prefix of prefixes) { + const properties = prefix.toLowerCase().startsWith("filter.") + ? ["clean", "smudge", "process", "required"] + : ["command", "textconv"]; + for (const property of properties) + overrides.push("-c", `${prefix}.${property}=${property === "required" ? "false" : ""}`); + } + return await rawGit(root, args, overrides, options); +} +//# sourceMappingURL=git-command.js.map \ No newline at end of file diff --git a/dist/git-command.js.map b/dist/git-command.js.map new file mode 100644 index 0000000..2e4575a --- /dev/null +++ b/dist/git-command.js.map @@ -0,0 +1 @@ +{"version":3,"file":"git-command.js","sourceRoot":"","sources":["../src/git-command.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/git.d.ts b/dist/git.d.ts index 16aea35..57fa720 100644 --- a/dist/git.d.ts +++ b/dist/git.d.ts @@ -1,8 +1,5 @@ import type { ChangedFile, DiffSelection, RepositoryInfo } from "./types.js"; -export declare class GitError extends Error { - name: string; -} -export declare function gitNullDevice(platform?: NodeJS.Platform): string; +export { GitError, gitNullDevice } from "./git-command.js"; export declare function findRepository(value: string): Promise; export declare function resolveRevisionCommit(root: string, value: string): Promise; export declare function diffTargetCommit(root: string, selection: DiffSelection): Promise; diff --git a/dist/git.d.ts.map b/dist/git.d.ts.map index 73b0452..cd83463 100644 --- a/dist/git.d.ts.map +++ b/dist/git.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAwB,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKnG,qBAAa,QAAS,SAAQ,KAAK;IACxB,IAAI,SAAc;CAC5B;AAED,wBAAgB,aAAa,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAElF;AAyED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASnE;AAmBD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKxF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQrG;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA+BlK;AAwFD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAuCjJ;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMxE;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAQ,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAQvH;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAW1E"} \ No newline at end of file +{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAwB,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGnG,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAW3D,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASnE;AAmBD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKxF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQrG;AAWD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA+BlK;AAwFD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAuCjJ;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMxE;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAQ,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAQvH;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAW1E"} \ No newline at end of file diff --git a/dist/git.js b/dist/git.js index df1841b..8c011cf 100644 --- a/dist/git.js +++ b/dist/git.js @@ -1,74 +1,7 @@ import path from "node:path"; -import { runProcess, safeExecutablePath } from "./process.js"; +import { GitError, runGit as gitResult } from "./git-command.js"; import { compareCodeUnits, isLikelyBinaryFile, languageForPath, normalizeRepoPath, readUtf8File, resolveRepositoryPath, unique } from "./util.js"; -const EMPTY_TREE = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"; -export class GitError extends Error { - name = "GitError"; -} -export function gitNullDevice(platform = process.platform) { - return platform === "win32" ? "NUL" : "/dev/null"; -} -function gitEnvironment() { - const env = { - PATH: safeExecutablePath(), - GIT_CONFIG_NOSYSTEM: "1", - GIT_CONFIG_GLOBAL: gitNullDevice(), - GIT_ATTR_NOSYSTEM: "1", - GIT_NO_REPLACE_OBJECTS: "1", - GIT_TERMINAL_PROMPT: "0", - GIT_PAGER: "cat", - GIT_OPTIONAL_LOCKS: "0", - LC_ALL: "C", - }; - for (const key of ["SystemRoot", "WINDIR", "TMPDIR", "TMP", "TEMP"]) { - if (process.env[key] !== undefined) - env[key] = process.env[key]; - } - return env; -} -const driverOverrideCache = new Map(); -async function rawGitResult(root, args, driverOverrides = []) { - return await runProcess("git", [ - "--no-pager", - "-c", "core.quotepath=false", - "-c", "core.fsmonitor=false", - "-c", `core.hooksPath=${gitNullDevice()}`, - "-c", "diff.external=", - "-c", "attr.tree=refs/proofdiff/no-attributes", - ...driverOverrides, - ...args, - ], { - cwd: root, - timeoutMs: 30_000, - maxOutputBytes: 8_000_000, - env: gitEnvironment(), - }); -} -async function configuredDriverOverrides(root) { - const cached = driverOverrideCache.get(root); - if (cached) - return cached; - const result = await rawGitResult(root, ["config", "--local", "--includes", "--name-only", "--get-regexp", "^(filter|diff)\\..*\\.(clean|smudge|process|required|command|textconv)$"]); - const prefixes = new Set(); - for (const key of result.stdout.split("\n").map((value) => value.trim()).filter(Boolean)) { - const match = key.match(/^((?:filter|diff)\..+)\.(?:clean|smudge|process|required|command|textconv)$/i); - if (match?.[1]) - prefixes.add(match[1]); - } - const overrides = []; - for (const prefix of prefixes) { - const properties = prefix.toLowerCase().startsWith("filter.") - ? ["clean", "smudge", "process", "required"] - : ["command", "textconv"]; - for (const property of properties) - overrides.push("-c", `${prefix}.${property}=${property === "required" ? "false" : ""}`); - } - driverOverrideCache.set(root, overrides); - return overrides; -} -async function gitResult(root, args) { - return await rawGitResult(root, args, await configuredDriverOverrides(root)); -} +export { GitError, gitNullDevice } from "./git-command.js"; async function git(root, args, allowFailure = false) { const result = await gitResult(root, args); if (!allowFailure && result.exitCode !== 0) { @@ -121,6 +54,14 @@ export async function diffTargetCommit(root, selection) { } return null; } +async function emptyTree(root) { + const result = await gitResult(root, ["hash-object", "-t", "tree", "--stdin"], { stdin: "" }); + const object = result.stdout.trim(); + if (result.exitCode !== 0 || !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(object)) { + throw new GitError("Could not resolve the empty tree for this repository object format."); + } + return object; +} export async function selectDiff(root, options) { const selected = Number(options.base !== undefined) + Number(options.range !== undefined) + Number(options.staged === true); if (selected > 1) @@ -148,10 +89,10 @@ export async function selectDiff(root, options) { }; } if (options.staged === true) { - const args = (await hasHead(root)) ? ["--cached"] : ["--cached", EMPTY_TREE]; + const args = (await hasHead(root)) ? ["--cached"] : ["--cached", await emptyTree(root)]; return { selection: { mode: "staged", description: "staged changes" }, args }; } - const args = (await hasHead(root)) ? ["HEAD"] : [EMPTY_TREE]; + const args = (await hasHead(root)) ? ["HEAD"] : [await emptyTree(root)]; return { selection: { mode: "working-tree", description: "working tree vs HEAD" }, args }; } function parseNameStatus(raw) { @@ -266,7 +207,7 @@ export async function changedFiles(root, diffArgs, includeUntracked, knownUntrac } else { const pathspec = entry.previousPath === undefined ? [entry.path] : [entry.previousPath, entry.path]; - patch = await git(root, ["diff", ...safeDiffOptions, "--unified=0", "--find-renames", ...diffArgs, "--", ...pathspec], true); + patch = await git(root, ["diff", ...safeDiffOptions, "--unified=0", "--find-renames", ...diffArgs, "--", ...pathspec.map((file) => `:(literal)${file}`)]); } files.push({ path: entry.path, diff --git a/dist/git.js.map b/dist/git.js.map index c895568..08fbdd4 100644 --- a/dist/git.js.map +++ b/dist/git.js.map @@ -1 +1 @@ -{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/graph.js b/dist/graph.js index dba2954..e12f29e 100644 --- a/dist/graph.js +++ b/dist/graph.js @@ -35,14 +35,16 @@ export async function buildRepositoryGraph(root, repositoryFiles, changedFiles) const concurrency = 16; for (let offset = 0; offset < sourceFiles.length; offset += concurrency) { const batch = sourceFiles.slice(offset, offset + concurrency); - await Promise.all(batch.map(async (file) => { + const results = await Promise.all(batch.map(async (file) => { const source = await readUtf8File(path.join(root, file)); - if (source === null) { - diagnostics.push(`Skipped ${file}: unreadable, binary, or larger than 1 MB.`); - return; - } - analyses.set(file, await analyzeSource(file, source, root)); + return { file, analysis: source === null ? null : await analyzeSource(file, source, root) }; })); + for (const { file, analysis } of results) { + if (analysis === null) + diagnostics.push(`Skipped ${file}: unreadable, binary, or larger than 1 MB.`); + else + analyses.set(file, analysis); + } } for (const [file, analysis] of [...analyses.entries()].sort(([left], [right]) => compareCodeUnits(left, right))) { const targets = new Set(); diff --git a/dist/graph.js.map b/dist/graph.js.map index d0012f2..26079cf 100644 --- a/dist/graph.js.map +++ b/dist/graph.js.map @@ -1 +1 @@ -{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/process.d.ts.map b/dist/process.d.ts.map index 4c86759..e0ce1da 100644 --- a/dist/process.d.ts.map +++ b/dist/process.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAwKjH;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAAC,UAAU,CAc/D"} \ No newline at end of file +{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA6KjH;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAAC,UAAU,CAc/D"} \ No newline at end of file diff --git a/dist/process.js b/dist/process.js index 08993aa..117b2c1 100644 --- a/dist/process.js +++ b/dist/process.js @@ -12,6 +12,7 @@ export async function runProcess(command, args, options) { let truncated = false; let observationTruncated = false; let timedOut = false; + let inputError; let settled = false; let childExited = false; let childExitCode = null; @@ -57,6 +58,7 @@ export async function runProcess(command, args, options) { clearTimeout(timer); if (terminationFallback !== undefined) clearTimeout(terminationFallback); + const finalError = error ?? inputError; resolve({ exitCode, stdout: stdout.toString("utf8"), @@ -65,7 +67,7 @@ export async function runProcess(command, args, options) { durationMs: Date.now() - started, truncated, ...(options.observe ? { observation: observation.toString("utf8"), observationTruncated } : {}), - ...(error === undefined ? {} : { error }), + ...(finalError === undefined ? {} : { error: finalError }), }); }; const closeChildStreams = () => { @@ -104,6 +106,9 @@ export async function runProcess(command, args, options) { } }); if (options.stdin !== undefined) { + // A parser can exit before consuming its input. Wait for close/timeout, but never + // turn an incomplete write into successful analysis or an unhandled EPIPE crash. + child.stdin?.on("error", (error) => { inputError = `Could not write process stdin: ${error.message}`; }); child.stdin?.end(options.stdin); } const forceTimedOutFinish = (error) => { diff --git a/dist/process.js.map b/dist/process.js.map index 4a0a343..06242a4 100644 --- a/dist/process.js.map +++ b/dist/process.js.map @@ -1 +1 @@ -{"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/selection-workspace.d.ts.map b/dist/selection-workspace.d.ts.map index a86b5f5..273490f 100644 --- a/dist/selection-workspace.d.ts.map +++ b/dist/selection-workspace.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"selection-workspace.d.ts","sourceRoot":"","sources":["../src/selection-workspace.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA4IhD,MAAM,WAAW,yBAAyB;IACxC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCpJ"} \ No newline at end of file +{"version":3,"file":"selection-workspace.d.ts","sourceRoot":"","sources":["../src/selection-workspace.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAqGhD,MAAM,WAAW,yBAAyB;IACxC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCpJ"} \ No newline at end of file diff --git a/dist/selection-workspace.js b/dist/selection-workspace.js index 0ffd8f1..d17e75d 100644 --- a/dist/selection-workspace.js +++ b/dist/selection-workspace.js @@ -1,6 +1,6 @@ import path from "node:path"; -import { diffTargetCommit, GitError, gitNullDevice, listUntrackedFiles, resolveRevisionCommit } from "./git.js"; -import { runProcess, safeExecutablePath } from "./process.js"; +import { diffTargetCommit, GitError, listUntrackedFiles, resolveRevisionCommit } from "./git.js"; +import { runGit } from "./git-command.js"; import { normalizeRepoPath } from "./util.js"; const ROOT_DISCOVERY_METADATA = new Set([ "package.json", @@ -38,40 +38,6 @@ function exclusionPathspecs(directories) { } const IGNORED_DISCOVERY_EXCLUSIONS = exclusionPathspecs(STATIC_PYTHON_SCAN_EXCLUDED_DIRECTORIES); const IGNORED_EXECUTION_EXCLUSIONS = exclusionPathspecs(EXECUTION_ENVIRONMENT_DIRECTORIES); -function gitEnvironment() { - const env = { - PATH: safeExecutablePath(), - GIT_CONFIG_NOSYSTEM: "1", - GIT_CONFIG_GLOBAL: gitNullDevice(), - GIT_ATTR_NOSYSTEM: "1", - GIT_NO_REPLACE_OBJECTS: "1", - GIT_TERMINAL_PROMPT: "0", - GIT_PAGER: "cat", - GIT_OPTIONAL_LOCKS: "0", - LC_ALL: "C", - }; - for (const key of ["SystemRoot", "WINDIR", "TMPDIR", "TMP", "TEMP"]) { - if (process.env[key] !== undefined) - env[key] = process.env[key]; - } - return env; -} -async function runGit(root, args, maxOutputBytes = 64_000) { - return await runProcess("git", [ - "--no-pager", - "-c", "core.quotepath=false", - "-c", "core.fsmonitor=false", - "-c", `core.hooksPath=${gitNullDevice()}`, - "-c", "diff.external=", - "-c", "attr.tree=refs/proofdiff/no-attributes", - ...args, - ], { - cwd: root, - timeoutMs: 30_000, - maxOutputBytes, - env: gitEnvironment(), - }); -} async function trackedFilesystemMatches(root, target) { const result = await runGit(root, [ "diff", @@ -81,9 +47,7 @@ async function trackedFilesystemMatches(root, target) { "--ignore-submodules=all", ...(target === null ? [] : [target]), "--", - ]); - if (result.timedOut) - throw new GitError("Timed out while checking whether the selected immutable snapshot matches the checked-out filesystem."); + ], { maxOutputBytes: 64_000 }); if (result.exitCode === 0) return true; if (result.exitCode === 1) @@ -101,10 +65,7 @@ async function ignoredFiles(root, pathspecs, exclusions) { "--", ...pathspecs, ...exclusions, - ], 512_000); - if (result.timedOut || result.truncated) { - throw new GitError("Could not completely establish whether ignored files can influence immutable analysis within ProofDiff's bounded Git limits."); - } + ], { maxOutputBytes: 512_000 }); if (result.exitCode !== 0) { const message = result.stderr.trim() || result.error || `git ls-files exited with ${String(result.exitCode)}`; throw new GitError(`Could not inspect ignored immutable-workspace inputs: ${message}`); diff --git a/dist/selection-workspace.js.map b/dist/selection-workspace.js.map index a4a21bf..a2049d6 100644 --- a/dist/selection-workspace.js.map +++ b/dist/selection-workspace.js.map @@ -1 +1 @@ -{"version":3,"file":"selection-workspace.js","sourceRoot":"","sources":["../src/selection-workspace.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"selection-workspace.js","sourceRoot":"","sources":["../src/selection-workspace.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/test-map-binding.d.ts.map b/dist/test-map-binding.d.ts.map index fda9e00..38c3ee4 100644 --- a/dist/test-map-binding.d.ts.map +++ b/dist/test-map-binding.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"test-map-binding.d.ts","sourceRoot":"","sources":["../src/test-map-binding.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAgDD,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,aAAa,EACxB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAiCjC"} \ No newline at end of file +{"version":3,"file":"test-map-binding.d.ts","sourceRoot":"","sources":["../src/test-map-binding.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AA0BD,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,aAAa,EACxB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,sBAAsB,CAAC,CAiCjC"} \ No newline at end of file diff --git a/dist/test-map-binding.js b/dist/test-map-binding.js index 002e1fc..fe9519e 100644 --- a/dist/test-map-binding.js +++ b/dist/test-map-binding.js @@ -1,25 +1,8 @@ import path from "node:path"; import { readFile } from "node:fs/promises"; -import { diffTargetCommit, gitNullDevice } from "./git.js"; -import { runProcess, safeExecutablePath } from "./process.js"; +import { diffTargetCommit } from "./git.js"; +import { runGit } from "./git-command.js"; const MAX_BINDING_BYTES = 256 * 1024; -function gitEnvironment() { - const env = { - PATH: safeExecutablePath(), - GIT_CONFIG_NOSYSTEM: "1", - GIT_CONFIG_GLOBAL: gitNullDevice(), - GIT_NO_REPLACE_OBJECTS: "1", - GIT_TERMINAL_PROMPT: "0", - GIT_PAGER: "cat", - GIT_OPTIONAL_LOCKS: "0", - LC_ALL: "C", - }; - for (const key of ["SystemRoot", "WINDIR", "TMPDIR", "TMP", "TEMP"]) { - if (process.env[key] !== undefined) - env[key] = process.env[key]; - } - return env; -} function canonicalJson(value) { if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`; @@ -40,12 +23,7 @@ function parseBoundedJson(value) { } } async function snapshotBlob(root, object) { - const result = await runProcess("git", ["--no-pager", "cat-file", "blob", object], { - cwd: root, - timeoutMs: 30_000, - maxOutputBytes: MAX_BINDING_BYTES + 1, - env: gitEnvironment(), - }); + const result = await runGit(root, ["cat-file", "blob", object], { maxOutputBytes: MAX_BINDING_BYTES + 1 }); if (result.exitCode !== 0 || result.truncated) return null; return result.stdout; diff --git a/dist/test-map-binding.js.map b/dist/test-map-binding.js.map index 31ed737..1cc7346 100644 --- a/dist/test-map-binding.js.map +++ b/dist/test-map-binding.js.map @@ -1 +1 @@ -{"version":3,"file":"test-map-binding.js","sourceRoot":"","sources":["../src/test-map-binding.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"test-map-binding.js","sourceRoot":"","sources":["../src/test-map-binding.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docs/production-readiness-audit.md b/docs/production-readiness-audit.md new file mode 100644 index 0000000..143b1d4 --- /dev/null +++ b/docs/production-readiness-audit.md @@ -0,0 +1,39 @@ +# Production readiness audit — 2026-09-22 + +Baseline: `74ac7c8ba00ac98d830532b231fc73d9b4e85a59`. + +This pass reviewed Git selection and filesystem alignment, static parsing and graph construction, process execution, runner observation boundaries, report generation, dependency installation, and CI/release gates. The baseline suite passed all 154 tests. Passing that suite did not rule out the failures below; targeted reproductions exposed eleven failing cases before the fixes. + +## Prioritized fixes + +| Priority | Observed weakness | Change and regression evidence | +| --- | --- | --- | +| High | The immutable-workspace `git diff --quiet` path bypassed content-driver suppression and could run a configured clean filter during static analysis. Long-lived driver caching and omitted worktree config left additional bypasses. | One shared static Git launcher, refreshed effective driver discovery, NUL-delimited keys, and fail-closed discovery bounds. Regressions cover base/range/staged modes, linked worktrees, changed config in the same process, and oversized config. | +| High | Truncated Git output was parsed as evidence, and per-file patch failures were ignored. A patch above 8 MB could produce a partial report. | Reject incomplete Git reads before parsing. Tests cover a real oversized patch, an incomplete path record, and CLI exit 2 with no newly written report even under `--fail-on never`. | +| High | A path such as `src/[a].js` also matched `src/a.js`, mixing per-file hunks. Renames had the same ambiguity. | Literal pathspecs for both old and new names. Tests check exact hunk ranges for bracket names, renames, and pathspec-magic names. | +| Medium | A child that exited without consuming its stdin caused an unhandled `EPIPE`; Python accepted valid-looking JSON even when process metadata reported failure. | Record input errors without crashing; Python retries or reports a low-confidence fallback. Tests include failed spawn, full input consumption, early exit, timeout, and truncation. | +| Medium | Unborn repositories assumed Git's SHA-1 empty-tree object. | Ask Git for its native empty-tree object without writing it. Working-tree and staged regressions use a real SHA-256 repository; existing SHA-1 tests remain. | +| Medium | Concurrent parser/I/O completion order leaked into collected analyses and diagnostics. | Collect results in inventory order after concurrent parsing. A mixed Python/JavaScript/TypeScript regression failed with the original implementation. | +| Medium | Dogfood expected verified source evidence despite an opaque chained test script and filename-only compiled mappings. | Move preparation to npm `pretest`, retain an exact serial test list, and require every compiled target to have a positive passing observation while source evidence stays partial. Add self-discovery regression coverage and a PR CI gate. Command-chain recognition and compiled-source confidence remain conservative. | + +## Trust and compatibility + +No runtime network, telemetry, source upload, LLM, dependency, automatic test execution, or new evidence status is introduced. Static analysis remains the default. JSON schema `1.0` and the meaning of `verified` remain unchanged: an observed related test-file pass, not changed-code coverage or correctness. + +Large or incomplete Git reads now stop analysis instead of returning partial results; this is an intentional fail-closed behavior change. The 5,000-file structural-analysis cap remains a separately reported limitation. Driver configuration is inspected before each Git operation instead of cached, trading additional local Git calls for consistent suppression across long-lived library use. This is not protection against concurrent mutation of the trusted Git directory. + +## Validation + +Local validation uses Linux, Node 24.19.0, Git 2.51.1, Python 3.12.14, and the unchanged lockfile (TypeScript 5.9.3 and Babel parser 7.29.8). The expanded suite has 170 tests. Validation commands and their actual outcomes are recorded in the pull request; cross-platform success must come from the existing Linux/macOS/Windows × Node 22/24/26 CI matrix, not extrapolation from local results. + +The repository's `lint` command is TypeScript typechecking, not a separate stylistic linter. Release checks also include Action smoke, dogfood, generated demos, packaging lifecycle tests, and clean-build `dist/` parity. Dependency audit results are point-in-time advisory data, not a guarantee of security. + +## Remaining boundaries + +- Git submodule contents are not analyzed; current diff inspection ignores submodules. The superproject report must not be interpreted as verification of nested repositories. +- Immutable selections still require alignment with the checked-out filesystem; arbitrary historical snapshots and concurrent filesystem changes are not isolated. +- Exact-target support remains limited to the documented runner/configuration subsets. Monorepo scripts, dynamic imports, and unsupported resolvers remain explicit limitations. +- Check execution remains arbitrary repository code with reduced environment and bounded output, not an OS sandbox or authenticated coverage attestation. +- Dependency major-version PRs are separate compatibility decisions and were not merged by this audit. + +This is a tested hardening pass, not a claim that every real-world repository or threat has been verified. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 7fab5e9..e1aa529 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -24,6 +24,18 @@ proofdiff --range v1.0.0..HEAD For `--base`, fetch enough history for Git to find a merge base. For `--range`, both endpoints must resolve to commits. +## Git output exceeded its limit or inspection could not complete + +ProofDiff exits with code `2` when a Git read times out, cannot start, fails to read a patch, or exceeds its output cap. It does not produce a report from a partial inventory or patch, even with `--fail-on never`. Ordinary Git reads have an 8,000,000-byte combined stdout/stderr cap and a 30-second timeout. Driver-name discovery has a 64,000-byte cap, and ignored-workspace inventory has a 512,000-byte cap. + +Narrow the committed diff or use a smaller checkout. For a driver-configuration error, inspect the trusted repository and linked-worktree Git configuration; ProofDiff must discover and disable configured content helpers before static inspection. This is an analysis error, not evidence that tests failed. Existing output files from an earlier run are not refreshed after an error, so CI must check the current exit status before consuming them. + +Filenames containing brackets or wildcard characters are supported literally. Repositories using SHA-256 object IDs also support working-tree and staged analysis before the first commit. + +## Python reports a helper input error or lexical fallback + +A Python helper that exits before consuming its input, times out, or exceeds its output cap cannot supply structural AST evidence, even if it printed valid JSON. ProofDiff retries the alternate interpreter, then reports low-confidence lexical analysis if neither helper completes. Confirm a working Python installation is available on the trusted executable path. No repository modules are imported during this parsing step. + ## Immutable base/range/staged analysis is rejected for workspace drift This is a fail-closed provenance check, not a verification failure. ProofDiff currently reads graph/config/test inputs from the checked-out filesystem, so v0.5.3 refuses to combine an immutable diff with another filesystem state. For `--base` and `--range`, make sure the selected target is the checked-out `HEAD` and the tracked worktree is clean relative to it. For `--staged`, make sure there are no unstaged tracked changes so the worktree matches the index. To inspect a historical `A..B` range, check out `B` or create a separate worktree at `B` first. diff --git a/package.json b/package.json index 034f4bc..53bbaba 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,8 @@ "clean": "node scripts/clean.mjs", "typecheck": "tsc -p tsconfig.json --noEmit", "test:compile": "tsc -p tsconfig.test.json && npm run evaluation:validate", - "test": "npm run build && npm run test:compile && node scripts/verify-test-manifest.mjs && node --test --test-concurrency=1 dist-test/tests/adapters.test.js dist-test/tests/analyze.test.js dist-test/tests/checks.test.js dist-test/tests/coverage.test.js dist-test/tests/demo.test.js dist-test/tests/e2e.test.js dist-test/tests/explanation.test.js dist-test/tests/git.test.js dist-test/tests/js-runners.test.js dist-test/tests/privacy.test.js dist-test/tests/report.test.js dist-test/tests/resolution.test.js dist-test/tests/selection-workspace.test.js dist-test/tests/test-map.test.js", + "pretest": "npm run build && npm run test:compile && node scripts/verify-test-manifest.mjs", + "test": "node --test --test-concurrency=1 dist-test/tests/adapters.test.js dist-test/tests/analyze.test.js dist-test/tests/checks.test.js dist-test/tests/coverage.test.js dist-test/tests/demo.test.js dist-test/tests/e2e.test.js dist-test/tests/explanation.test.js dist-test/tests/git.test.js dist-test/tests/js-runners.test.js dist-test/tests/privacy.test.js dist-test/tests/process.test.js dist-test/tests/report.test.js dist-test/tests/resolution.test.js dist-test/tests/selection-workspace.test.js dist-test/tests/test-map.test.js", "test:e2e": "npm run build && npm run test:compile && node --test dist-test/tests/e2e.test.js", "test:action": "npm run build && node scripts/verify-action.mjs", "test:coverage": "npm run build && npm run test:compile && node scripts/run-compiled-tests.mjs --coverage", diff --git a/scripts/dogfood.mjs b/scripts/dogfood.mjs index 1e47408..0fbc6d0 100644 --- a/scripts/dogfood.mjs +++ b/scripts/dogfood.mjs @@ -1,4 +1,5 @@ import { execFileSync } from "node:child_process"; +import assert from "node:assert/strict"; import { cp, mkdir, mkdtemp, readFile, rm, symlink, writeFile } from "node:fs/promises"; import os from "node:os"; import path from "node:path"; @@ -44,10 +45,19 @@ try { await writeFile(path.join(scratchRoot, "dogfood-report.html"), renderHtmlReport(report)); await writeFile(path.join(scratchRoot, "dogfood-terminal.txt"), `${renderTerminalReport(report, { color: false, width: 100 }).trimStart()}\n`); - if (report.summary.filesChanged !== 1 || report.summary.overallStatus !== "verified" || report.checks.some((check) => check.status !== "passed")) { - throw new Error(`Dogfood invariant failed: ${report.summary.filesChanged} files, ${report.summary.overallStatus}, checks ${report.checks.map((check) => check.status).join(", ")}.`); - } - process.stdout.write(`Dogfood passed: ${report.assessments[0].file.path} had a related test-file pass; all ${report.checks.length} executed checks passed.\n`); + assert.equal(report.summary.filesChanged, 1); + assert.equal(report.assessments[0]?.file.path, "src/evidence.ts"); + assert.equal(report.summary.overallStatus, "partially-verified", "Filename-based compiled mappings must not verify TypeScript source identity"); + assert.deepEqual(report.assessments[0]?.executedTests, []); + assert.deepEqual(report.checks.map((check) => check.id).sort(), ["js:lint:lint", "js:test:test", "js:test:test:targeted", "js:typecheck:typecheck"]); + assert.ok(report.checks.every((check) => check.status === "passed"), "Every discovered check must pass"); + const targeted = report.checks.find((check) => check.id === "js:test:test:targeted"); + assert.ok(targeted?.targetQualifications?.length, "Dogfood must qualify related compiled targets"); + assert.ok(targeted.targetQualifications.every((target) => target.basis === "compiled-source-map" && target.confidence === "medium")); + const observations = targeted.targetObservations ?? []; + assert.deepEqual(observations.map((item) => item.path).sort(), targeted.targetQualifications.map((item) => item.path).sort()); + assert.ok(observations.every((item) => item.outcome === "passed" && item.testsObserved > 0), "Each compiled target must have a positive passing observation"); + process.stdout.write(`Dogfood passed: all ${report.checks.length} checks passed and ${observations.length} compiled targets had positive observations; TypeScript source evidence correctly remained partially verified.\n`); } finally { await rm(target, { recursive: true, force: true }); } diff --git a/scripts/verify-test-manifest.mjs b/scripts/verify-test-manifest.mjs index 74f7b41..714cab7 100644 --- a/scripts/verify-test-manifest.mjs +++ b/scripts/verify-test-manifest.mjs @@ -7,10 +7,10 @@ const projectRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), " const manifest = JSON.parse(await readFile(path.join(projectRoot, "package.json"), "utf8")); const command = manifest.scripts?.test; assert.equal(typeof command, "string", "package.json is missing its test script"); -const invocation = command.match(/(?:^|&& )node --test (.+)$/)?.[1]?.trim().split(/\s+/); +const invocation = command.match(/^node --test (.+)$/)?.[1]?.trim().split(/\s+/); assert.ok(invocation?.includes("--test-concurrency=1"), "The test suite must run serially because its integration tests launch competing Git, Python, and Node subprocesses"); const explicit = invocation?.filter((argument) => !argument.startsWith("--")).sort(); -assert.ok(explicit?.length, "The test script must end with an explicit cross-platform node --test file list"); +assert.ok(explicit?.length, "The test script must be an exact node --test command for dogfood target qualification; keep preparation in pretest"); const compiled = (await readdir(path.join(projectRoot, "dist-test", "tests"))) .filter((file) => file.endsWith(".test.js")) diff --git a/src/adapters/python.ts b/src/adapters/python.ts index f194206..de32b08 100644 --- a/src/adapters/python.ts +++ b/src/adapters/python.ts @@ -87,6 +87,7 @@ export function pythonInterpreterCandidates(platform: NodeJS.Platform = process. function failureReason(result: ProcessResult): string { if (result.timedOut) return "timed out"; + if (result.truncated) return "AST helper output exceeded its byte limit"; return result.stderr.trim() || result.error || `exited with ${String(result.exitCode)}`; } @@ -105,7 +106,7 @@ export async function analyzePythonSource( maxOutputBytes: 1_000_000, env: { PATH: safeExecutablePath(), PYTHONIOENCODING: "utf-8" }, }); - if (result.exitCode === 0) { + if (result.exitCode === 0 && !result.timedOut && !result.truncated && result.error === undefined) { try { const parsed = JSON.parse(result.stdout) as PythonOutput; if (parsed.error) return lexicalFallback(source, parsed.error); diff --git a/src/git-command.ts b/src/git-command.ts new file mode 100644 index 0000000..f36a7af --- /dev/null +++ b/src/git-command.ts @@ -0,0 +1,79 @@ +import { runProcess, safeExecutablePath, type ProcessResult } from "./process.js"; + +export class GitError extends Error { + override name = "GitError"; +} + +export function gitNullDevice(platform: NodeJS.Platform = process.platform): string { + return platform === "win32" ? "NUL" : "/dev/null"; +} + +function gitEnvironment(): NodeJS.ProcessEnv { + const env: NodeJS.ProcessEnv = { + PATH: safeExecutablePath(), + GIT_CONFIG_NOSYSTEM: "1", + GIT_CONFIG_GLOBAL: gitNullDevice(), + GIT_ATTR_NOSYSTEM: "1", + GIT_NO_REPLACE_OBJECTS: "1", + GIT_TERMINAL_PROMPT: "0", + GIT_PAGER: "cat", + GIT_OPTIONAL_LOCKS: "0", + LC_ALL: "C", + }; + for (const key of ["SystemRoot", "WINDIR", "TMPDIR", "TMP", "TEMP"]) { + if (process.env[key] !== undefined) env[key] = process.env[key]; + } + return env; +} + +interface GitOptions { + maxOutputBytes?: number; + stdin?: string; +} + +async function rawGit(root: string, args: string[], overrides: string[], options: GitOptions): Promise { + const maxOutputBytes = options.maxOutputBytes ?? 8_000_000; + const result = await runProcess("git", [ + "--no-pager", + "-c", "core.quotepath=false", + "-c", "core.fsmonitor=false", + "-c", `core.hooksPath=${gitNullDevice()}`, + "-c", "diff.external=", + "-c", "attr.tree=refs/proofdiff/no-attributes", + ...overrides, + ...args, + ], { + cwd: root, + timeoutMs: 30_000, + maxOutputBytes, + env: gitEnvironment(), + ...(options.stdin === undefined ? {} : { stdin: options.stdin }), + }); + if (result.error !== undefined) throw new GitError(`Could not run Git: ${result.error}`); + if (result.timedOut) throw new GitError("Git inspection timed out; incomplete output cannot establish evidence."); + if (result.truncated) throw new GitError(`Git output exceeded the ${maxOutputBytes} byte limit; incomplete output cannot establish evidence. Narrow the selected diff or use a smaller checkout.`); + return result; +} + +/** All static Git reads share one boundary, including snapshot/workspace checks. */ +export async function runGit(root: string, args: string[], options: GitOptions = {}): Promise { + // Do not cache across calls: library callers and linked worktrees can change configuration. + // The sanitized environment excludes system/global config while retaining worktree config. + const config = await rawGit(root, ["config", "--includes", "--null", "--name-only", "--get-regexp", "^(filter|diff)\\..*\\.(clean|smudge|process|required|command|textconv)$"], [], { maxOutputBytes: 64_000 }); + if (config.exitCode !== 0 && !(config.exitCode === 1 && config.stdout === "")) { + throw new GitError("Could not inspect Git content-driver configuration; static inspection failed closed."); + } + const prefixes = new Set(); + for (const key of config.stdout.split("\0").filter(Boolean)) { + const match = key.match(/^((?:filter|diff)\..+)\.(?:clean|smudge|process|required|command|textconv)$/is); + if (match?.[1]) prefixes.add(match[1]); + } + const overrides: string[] = []; + for (const prefix of prefixes) { + const properties = prefix.toLowerCase().startsWith("filter.") + ? ["clean", "smudge", "process", "required"] + : ["command", "textconv"]; + for (const property of properties) overrides.push("-c", `${prefix}.${property}=${property === "required" ? "false" : ""}`); + } + return await rawGit(root, args, overrides, options); +} diff --git a/src/git.ts b/src/git.ts index d651ac2..8ca69bd 100644 --- a/src/git.ts +++ b/src/git.ts @@ -1,79 +1,9 @@ import path from "node:path"; -import { runProcess, safeExecutablePath, type ProcessResult } from "./process.js"; +import { GitError, runGit as gitResult } from "./git-command.js"; import type { ChangedFile, ChangeKind, DiffHunk, DiffSelection, RepositoryInfo } from "./types.js"; import { compareCodeUnits, isLikelyBinaryFile, languageForPath, normalizeRepoPath, readUtf8File, resolveRepositoryPath, unique } from "./util.js"; -const EMPTY_TREE = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"; - -export class GitError extends Error { - override name = "GitError"; -} - -export function gitNullDevice(platform: NodeJS.Platform = process.platform): string { - return platform === "win32" ? "NUL" : "/dev/null"; -} - -function gitEnvironment(): NodeJS.ProcessEnv { - const env: NodeJS.ProcessEnv = { - PATH: safeExecutablePath(), - GIT_CONFIG_NOSYSTEM: "1", - GIT_CONFIG_GLOBAL: gitNullDevice(), - GIT_ATTR_NOSYSTEM: "1", - GIT_NO_REPLACE_OBJECTS: "1", - GIT_TERMINAL_PROMPT: "0", - GIT_PAGER: "cat", - GIT_OPTIONAL_LOCKS: "0", - LC_ALL: "C", - }; - for (const key of ["SystemRoot", "WINDIR", "TMPDIR", "TMP", "TEMP"]) { - if (process.env[key] !== undefined) env[key] = process.env[key]; - } - return env; -} - -const driverOverrideCache = new Map(); - -async function rawGitResult(root: string, args: string[], driverOverrides: string[] = []): Promise { - return await runProcess("git", [ - "--no-pager", - "-c", "core.quotepath=false", - "-c", "core.fsmonitor=false", - "-c", `core.hooksPath=${gitNullDevice()}`, - "-c", "diff.external=", - "-c", "attr.tree=refs/proofdiff/no-attributes", - ...driverOverrides, - ...args, - ], { - cwd: root, - timeoutMs: 30_000, - maxOutputBytes: 8_000_000, - env: gitEnvironment(), - }); -} - -async function configuredDriverOverrides(root: string): Promise { - const cached = driverOverrideCache.get(root); - if (cached) return cached; - const result = await rawGitResult(root, ["config", "--local", "--includes", "--name-only", "--get-regexp", "^(filter|diff)\\..*\\.(clean|smudge|process|required|command|textconv)$"]); - const prefixes = new Set(); - for (const key of result.stdout.split("\n").map((value) => value.trim()).filter(Boolean)) { - const match = key.match(/^((?:filter|diff)\..+)\.(?:clean|smudge|process|required|command|textconv)$/i); - if (match?.[1]) prefixes.add(match[1]); - } - const overrides: string[] = []; - for (const prefix of prefixes) { - const properties = prefix.toLowerCase().startsWith("filter.") - ? ["clean", "smudge", "process", "required"] - : ["command", "textconv"]; - for (const property of properties) overrides.push("-c", `${prefix}.${property}=${property === "required" ? "false" : ""}`); - } - driverOverrideCache.set(root, overrides); - return overrides; -} - -async function gitResult(root: string, args: string[]): Promise { - return await rawGitResult(root, args, await configuredDriverOverrides(root)); -} +export { GitError, gitNullDevice } from "./git-command.js"; async function git(root: string, args: string[], allowFailure = false): Promise { const result = await gitResult(root, args); @@ -129,6 +59,15 @@ export async function diffTargetCommit(root: string, selection: DiffSelection): return null; } +async function emptyTree(root: string): Promise { + const result = await gitResult(root, ["hash-object", "-t", "tree", "--stdin"], { stdin: "" }); + const object = result.stdout.trim(); + if (result.exitCode !== 0 || !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(object)) { + throw new GitError("Could not resolve the empty tree for this repository object format."); + } + return object; +} + export async function selectDiff(root: string, options: { base?: string; range?: string; staged?: boolean }): Promise<{ selection: DiffSelection; args: string[] }> { const selected = Number(options.base !== undefined) + Number(options.range !== undefined) + Number(options.staged === true); if (selected > 1) throw new GitError("Choose only one of --base, --range, or --staged."); @@ -155,10 +94,10 @@ export async function selectDiff(root: string, options: { base?: string; range?: }; } if (options.staged === true) { - const args = (await hasHead(root)) ? ["--cached"] : ["--cached", EMPTY_TREE]; + const args = (await hasHead(root)) ? ["--cached"] : ["--cached", await emptyTree(root)]; return { selection: { mode: "staged", description: "staged changes" }, args }; } - const args = (await hasHead(root)) ? ["HEAD"] : [EMPTY_TREE]; + const args = (await hasHead(root)) ? ["HEAD"] : [await emptyTree(root)]; return { selection: { mode: "working-tree", description: "working tree vs HEAD" }, args }; } @@ -272,7 +211,7 @@ export async function changedFiles(root: string, diffArgs: string[], includeUntr patch = content === null ? "" : `@@ -0,0 +1,${lines} @@\n${content.split("\n").map((line) => `+${line}`).join("\n")}`; } else { const pathspec = entry.previousPath === undefined ? [entry.path] : [entry.previousPath, entry.path]; - patch = await git(root, ["diff", ...safeDiffOptions, "--unified=0", "--find-renames", ...diffArgs, "--", ...pathspec], true); + patch = await git(root, ["diff", ...safeDiffOptions, "--unified=0", "--find-renames", ...diffArgs, "--", ...pathspec.map((file) => `:(literal)${file}`)]); } files.push({ path: entry.path, diff --git a/src/graph.ts b/src/graph.ts index 6882c84..4f92a4b 100644 --- a/src/graph.ts +++ b/src/graph.ts @@ -47,14 +47,14 @@ export async function buildRepositoryGraph(root: string, repositoryFiles: string const concurrency = 16; for (let offset = 0; offset < sourceFiles.length; offset += concurrency) { const batch = sourceFiles.slice(offset, offset + concurrency); - await Promise.all(batch.map(async (file) => { + const results = await Promise.all(batch.map(async (file) => { const source = await readUtf8File(path.join(root, file)); - if (source === null) { - diagnostics.push(`Skipped ${file}: unreadable, binary, or larger than 1 MB.`); - return; - } - analyses.set(file, await analyzeSource(file, source, root)); + return { file, analysis: source === null ? null : await analyzeSource(file, source, root) }; })); + for (const { file, analysis } of results) { + if (analysis === null) diagnostics.push(`Skipped ${file}: unreadable, binary, or larger than 1 MB.`); + else analyses.set(file, analysis); + } } for (const [file, analysis] of [...analyses.entries()].sort(([left], [right]) => compareCodeUnits(left, right))) { diff --git a/src/process.ts b/src/process.ts index 0495463..52a27c7 100644 --- a/src/process.ts +++ b/src/process.ts @@ -35,6 +35,7 @@ export async function runProcess(command: string, args: string[], options: Proce let truncated = false; let observationTruncated = false; let timedOut = false; + let inputError: string | undefined; let settled = false; let childExited = false; let childExitCode: number | null = null; @@ -79,6 +80,7 @@ export async function runProcess(command: string, args: string[], options: Proce settled = true; if (timer !== undefined) clearTimeout(timer); if (terminationFallback !== undefined) clearTimeout(terminationFallback); + const finalError = error ?? inputError; resolve({ exitCode, stdout: stdout.toString("utf8"), @@ -87,7 +89,7 @@ export async function runProcess(command: string, args: string[], options: Proce durationMs: Date.now() - started, truncated, ...(options.observe ? { observation: observation.toString("utf8"), observationTruncated } : {}), - ...(error === undefined ? {} : { error }), + ...(finalError === undefined ? {} : { error: finalError }), }); }; @@ -127,6 +129,9 @@ export async function runProcess(command: string, args: string[], options: Proce }); if (options.stdin !== undefined) { + // A parser can exit before consuming its input. Wait for close/timeout, but never + // turn an incomplete write into successful analysis or an unhandled EPIPE crash. + child.stdin?.on("error", (error) => { inputError = `Could not write process stdin: ${error.message}`; }); child.stdin?.end(options.stdin); } diff --git a/src/selection-workspace.ts b/src/selection-workspace.ts index 0fe75bb..5b80923 100644 --- a/src/selection-workspace.ts +++ b/src/selection-workspace.ts @@ -1,6 +1,6 @@ import path from "node:path"; -import { diffTargetCommit, GitError, gitNullDevice, listUntrackedFiles, resolveRevisionCommit } from "./git.js"; -import { runProcess, safeExecutablePath, type ProcessResult } from "./process.js"; +import { diffTargetCommit, GitError, listUntrackedFiles, resolveRevisionCommit } from "./git.js"; +import { runGit } from "./git-command.js"; import type { DiffSelection } from "./types.js"; import { normalizeRepoPath } from "./util.js"; @@ -43,41 +43,6 @@ function exclusionPathspecs(directories: string[]): string[] { const IGNORED_DISCOVERY_EXCLUSIONS = exclusionPathspecs(STATIC_PYTHON_SCAN_EXCLUDED_DIRECTORIES); const IGNORED_EXECUTION_EXCLUSIONS = exclusionPathspecs(EXECUTION_ENVIRONMENT_DIRECTORIES); -function gitEnvironment(): NodeJS.ProcessEnv { - const env: NodeJS.ProcessEnv = { - PATH: safeExecutablePath(), - GIT_CONFIG_NOSYSTEM: "1", - GIT_CONFIG_GLOBAL: gitNullDevice(), - GIT_ATTR_NOSYSTEM: "1", - GIT_NO_REPLACE_OBJECTS: "1", - GIT_TERMINAL_PROMPT: "0", - GIT_PAGER: "cat", - GIT_OPTIONAL_LOCKS: "0", - LC_ALL: "C", - }; - for (const key of ["SystemRoot", "WINDIR", "TMPDIR", "TMP", "TEMP"]) { - if (process.env[key] !== undefined) env[key] = process.env[key]; - } - return env; -} - -async function runGit(root: string, args: string[], maxOutputBytes = 64_000): Promise { - return await runProcess("git", [ - "--no-pager", - "-c", "core.quotepath=false", - "-c", "core.fsmonitor=false", - "-c", `core.hooksPath=${gitNullDevice()}`, - "-c", "diff.external=", - "-c", "attr.tree=refs/proofdiff/no-attributes", - ...args, - ], { - cwd: root, - timeoutMs: 30_000, - maxOutputBytes, - env: gitEnvironment(), - }); -} - async function trackedFilesystemMatches(root: string, target: string | null): Promise { const result = await runGit(root, [ "diff", @@ -87,8 +52,7 @@ async function trackedFilesystemMatches(root: string, target: string | null): Pr "--ignore-submodules=all", ...(target === null ? [] : [target]), "--", - ]); - if (result.timedOut) throw new GitError("Timed out while checking whether the selected immutable snapshot matches the checked-out filesystem."); + ], { maxOutputBytes: 64_000 }); if (result.exitCode === 0) return true; if (result.exitCode === 1) return false; const message = result.stderr.trim() || result.error || `git diff exited with ${String(result.exitCode)}`; @@ -105,10 +69,7 @@ async function ignoredFiles(root: string, pathspecs: string[], exclusions: strin "--", ...pathspecs, ...exclusions, - ], 512_000); - if (result.timedOut || result.truncated) { - throw new GitError("Could not completely establish whether ignored files can influence immutable analysis within ProofDiff's bounded Git limits."); - } + ], { maxOutputBytes: 512_000 }); if (result.exitCode !== 0) { const message = result.stderr.trim() || result.error || `git ls-files exited with ${String(result.exitCode)}`; throw new GitError(`Could not inspect ignored immutable-workspace inputs: ${message}`); diff --git a/src/test-map-binding.ts b/src/test-map-binding.ts index 5eefc25..9b631e8 100644 --- a/src/test-map-binding.ts +++ b/src/test-map-binding.ts @@ -1,7 +1,7 @@ import path from "node:path"; import { readFile } from "node:fs/promises"; -import { diffTargetCommit, gitNullDevice } from "./git.js"; -import { runProcess, safeExecutablePath } from "./process.js"; +import { diffTargetCommit } from "./git.js"; +import { runGit } from "./git-command.js"; import type { DiffSelection } from "./types.js"; const MAX_BINDING_BYTES = 256 * 1024; @@ -12,23 +12,6 @@ export interface TestMapSnapshotBinding { detail: string; } -function gitEnvironment(): NodeJS.ProcessEnv { - const env: NodeJS.ProcessEnv = { - PATH: safeExecutablePath(), - GIT_CONFIG_NOSYSTEM: "1", - GIT_CONFIG_GLOBAL: gitNullDevice(), - GIT_NO_REPLACE_OBJECTS: "1", - GIT_TERMINAL_PROMPT: "0", - GIT_PAGER: "cat", - GIT_OPTIONAL_LOCKS: "0", - LC_ALL: "C", - }; - for (const key of ["SystemRoot", "WINDIR", "TMPDIR", "TMP", "TEMP"]) { - if (process.env[key] !== undefined) env[key] = process.env[key]; - } - return env; -} - function canonicalJson(value: unknown): string { if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`; if (value !== null && typeof value === "object") { @@ -48,12 +31,7 @@ function parseBoundedJson(value: string): string | null { } async function snapshotBlob(root: string, object: string): Promise { - const result = await runProcess("git", ["--no-pager", "cat-file", "blob", object], { - cwd: root, - timeoutMs: 30_000, - maxOutputBytes: MAX_BINDING_BYTES + 1, - env: gitEnvironment(), - }); + const result = await runGit(root, ["cat-file", "blob", object], { maxOutputBytes: MAX_BINDING_BYTES + 1 }); if (result.exitCode !== 0 || result.truncated) return null; return result.stdout; } diff --git a/tests/adapters.test.ts b/tests/adapters.test.ts index 6b881df..91e9c9a 100644 --- a/tests/adapters.test.ts +++ b/tests/adapters.test.ts @@ -89,3 +89,18 @@ test("Python AST analysis retries the alternate interpreter after a candidate ti assert.equal(result.confidence, "high"); assert.ok(result.symbols.some((symbol) => symbol.name === "public" && symbol.exported)); }); + +test("valid-looking Python helper JSON cannot override process failure or truncation", async () => { + for (const failure of [{ error: "Could not write process stdin" }, { truncated: true }, { timedOut: true }]) { + let attempts = 0; + const result = await analyzePythonSource("def public():\n return 1\n", process.cwd(), { + run: async () => { + attempts += 1; + return { exitCode: 0, stdout: "{}", stderr: "", timedOut: false, durationMs: 1, truncated: false, ...failure }; + }, + }); + assert.equal(attempts, 2); + assert.equal(result.parser, "lexical fallback"); + assert.equal(result.confidence, "low"); + } +}); diff --git a/tests/analyze.test.ts b/tests/analyze.test.ts index 6ad3d3a..bfb6aea 100644 --- a/tests/analyze.test.ts +++ b/tests/analyze.test.ts @@ -2,6 +2,7 @@ import assert from "node:assert/strict"; import { rm } from "node:fs/promises"; import test from "node:test"; import { analyzeRepository } from "../src/analyze.js"; +import { buildRepositoryGraph } from "../src/graph.js"; import { renderGithubSummary } from "../src/report/github.js"; import { initializeRepository, writeFiles } from "./helpers.js"; @@ -11,6 +12,22 @@ const baseline = { "test/math.test.js": `import test from "node:test";\nimport assert from "node:assert/strict";\nimport { add } from "../src/math.js";\ntest("add", () => assert.equal(add(1, 2), 3));\n`, }; +test("concurrent source parsing retains inventory order for analyses and diagnostics", async (context) => { + const root = await initializeRepository({ + "a.py": "def value():\n return 1\n", + "b.js": "export const value = 1;\n", + "c.ts": "export const value: number = 1;\n", + }); + context.after(() => rm(root, { recursive: true, force: true })); + const files = ["a.py", "missing-a.js", "b.js", "missing-b.py", "c.ts"]; + const graph = await buildRepositoryGraph(root, files, []); + assert.deepEqual([...graph.analyses.keys()], ["a.py", "b.js", "c.ts"]); + assert.deepEqual(graph.diagnostics, [ + "Skipped missing-a.js: unreadable, binary, or larger than 1 MB.", + "Skipped missing-b.py: unreadable, binary, or larger than 1 MB.", + ]); +}); + test("static-only analysis is useful and does not claim verification", async (context) => { const root = await initializeRepository(baseline); context.after(() => rm(root, { recursive: true, force: true })); diff --git a/tests/checks.test.ts b/tests/checks.test.ts index 5dade48..c6d6307 100644 --- a/tests/checks.test.ts +++ b/tests/checks.test.ts @@ -2,9 +2,19 @@ import assert from "node:assert/strict"; import { rm, symlink, writeFile } from "node:fs/promises"; import path from "node:path"; import test from "node:test"; +import { fileURLToPath } from "node:url"; import { discoverChecks, packageManagerInvocation, parseTargetObservations, runChecks, targetedTestChecks } from "../src/checks.js"; import { initializeRepository } from "./helpers.js"; +test("ProofDiff's own test command qualifies without interpreting lifecycle command chains", async () => { + const projectRoot = fileURLToPath(new URL("../../", import.meta.url)); + const { checks } = await discoverChecks(projectRoot); + const ownTest = checks.find((check) => check.id === "js:test:test"); + assert.equal(ownTest?.targetRunner, "node-test"); + assert.ok(ownTest?.targetPatterns?.includes("dist-test/tests/process.test.js")); + assert.equal(checks.some((check) => check.id.includes("pretest")), false); +}); + test("repository scripts are discovered but execution is a separate operation", async (context) => { const root = await initializeRepository({ "package.json": JSON.stringify({ scripts: { test: "node -e \"console.log('ok')\"", postinstall: "exit 99", deploy: "exit 98" } }) }); context.after(() => rm(root, { recursive: true, force: true })); diff --git a/tests/git.test.ts b/tests/git.test.ts index 721704e..2eb76e0 100644 --- a/tests/git.test.ts +++ b/tests/git.test.ts @@ -3,8 +3,9 @@ import { mkdir, rm, symlink, writeFile } from "node:fs/promises"; import test from "node:test"; import path from "node:path"; import { changedFiles, findRepository, gitNullDevice, repositoryInfo, selectDiff } from "../src/git.js"; +import { runGit } from "../src/git-command.js"; import { pathExists, readUtf8File } from "../src/util.js"; -import { git, initializeRepository, temporaryDirectory, writeFiles } from "./helpers.js"; +import { git, initializeRepository, runCli, temporaryDirectory, writeFiles } from "./helpers.js"; test("Git uses the native null device accepted by each platform", () => { assert.equal(gitNullDevice("win32"), "NUL"); @@ -207,3 +208,98 @@ test("static Git inspection suppresses repository-configured helper execution", await repositoryInfo(root); assert.equal(await pathExists(path.join(root, "helper-ran")), false); }); + +test("per-file hunks treat bracket filenames literally", async (context) => { + const root = await initializeRepository({ + "src/[a].js": "export const bracket = 1;\n", + "src/a.js": "\n\nexport const other = 1;\n", + }); + context.after(() => rm(root, { recursive: true, force: true })); + await writeFiles(root, { + "src/[a].js": "export const bracket = 2;\n", + "src/a.js": "\n\nexport const other = 2;\n", + }); + const files = await changedFiles(root, (await selectDiff(root, {})).args, true); + assert.deepEqual(files.map((file) => [file.path, file.hunks]), [ + ["src/[a].js", [{ oldRange: { start: 1, end: 1 }, newRange: { start: 1, end: 1 } }]], + ["src/a.js", [{ oldRange: { start: 3, end: 3 }, newRange: { start: 3, end: 3 } }]], + ]); +}); + +test("renamed wildcard paths preserve exact old and new hunk identity", async (context) => { + const content = "export function target() {\n const a = 1;\n const b = 2;\n return a + b;\n}\n"; + const root = await initializeRepository({ "old[a].js": content, "olda.js": "export const decoy = 1;\n" }); + context.after(() => rm(root, { recursive: true, force: true })); + git(root, "mv", "old[a].js", "new[a].js"); + await writeFiles(root, { "new[a].js": content.replace("b = 2", "b = 3"), "olda.js": "export const decoy = 2;\n" }); + const files = await changedFiles(root, (await selectDiff(root, {})).args, true); + const renamed = files.find((file) => file.path === "new[a].js"); + assert.equal(renamed?.previousPath, "old[a].js"); + assert.deepEqual(renamed?.hunks, [{ oldRange: { start: 3, end: 3 }, newRange: { start: 3, end: 3 } }]); +}); + +test("pathspec magic in a filename cannot select other files", { skip: process.platform === "win32" }, async (context) => { + const root = await initializeRepository({ ":(exclude)victim.js": "export const literal = 1;\n", "victim.js": "\n\nexport const victim = 1;\n" }); + context.after(() => rm(root, { recursive: true, force: true })); + await writeFiles(root, { ":(exclude)victim.js": "export const literal = 2;\n", "victim.js": "\n\nexport const victim = 2;\n" }); + const files = await changedFiles(root, (await selectDiff(root, {})).args, true); + assert.deepEqual(files[0]?.hunks, [{ oldRange: { start: 1, end: 1 }, newRange: { start: 1, end: 1 } }]); +}); + +test("oversized per-file Git patches fail closed instead of returning partial evidence", async (context) => { + const root = await initializeRepository({ "large.txt": "baseline\n" }); + context.after(() => rm(root, { recursive: true, force: true })); + await writeFiles(root, { "large.txt": `${"x".repeat(8_000_100)}\n` }); + await assert.rejects(changedFiles(root, (await selectDiff(root, {})).args, false), /Git output exceeded.*incomplete/i); + const output = path.join(root, "report.json"); + const result = runCli(["--repo", root, "--json", "--output", output, "--fail-on", "never"]); + assert.equal(result.status, 2); + assert.match(result.stderr, /Git output exceeded.*incomplete/i); + assert.equal(await pathExists(output), false); +}); + +test("helper suppression refreshes after configuration changes in the same process", async (context) => { + const root = await initializeRepository({ + ".gitattributes": "*.txt filter=late\n", + "data.txt": "baseline\n", + "helper.cjs": "require('node:fs').writeFileSync('helper-ran','yes');process.stdin.pipe(process.stdout);\n", + }); + context.after(() => rm(root, { recursive: true, force: true })); + await findRepository(root); + git(root, "config", "filter.late.clean", "node helper.cjs"); + await writeFiles(root, { "data.txt": "changed\n" }); + await changedFiles(root, (await selectDiff(root, {})).args, false); + assert.equal(await pathExists(path.join(root, "helper-ran")), false); +}); + +test("unborn SHA-256 repositories support working-tree and staged selections", async (context) => { + const root = await temporaryDirectory(); + context.after(() => rm(root, { recursive: true, force: true })); + git(root, "init", "-q", "--object-format=sha256"); + await writeFiles(root, { "first.ts": "export const first = 1;\n" }); + git(root, "add", "."); + for (const options of [{}, { staged: true }]) { + const [file] = await changedFiles(root, (await selectDiff(root, options)).args, !options.staged); + assert.equal(file?.path, "first.ts"); + assert.equal(file?.additions, 1); + } +}); + +test("bounded Git inventories reject an incomplete path record", async (context) => { + const root = await initializeRepository({ "a-long-filename.js": "export const value = 1;\n" }); + context.after(() => rm(root, { recursive: true, force: true })); + await assert.rejects(runGit(root, ["ls-files", "-z"], { maxOutputBytes: 8 }), /Git output exceeded.*incomplete/i); +}); + +test("oversized driver configuration stops inspection before any helper can run", async (context) => { + const root = await initializeRepository({ + ".gitattributes": "*.txt filter=probe\n", + "value.txt": "baseline\n", + "probe.cjs": "require('node:fs').writeFileSync('probe-ran','yes');process.stdin.pipe(process.stdout);\n", + }); + context.after(() => rm(root, { recursive: true, force: true })); + const drivers = Array.from({ length: 1_000 }, (_, i) => `[filter "${"x".repeat(70)}${i}"]\nclean = false\n`).join(""); + await writeFile(path.join(root, ".git", "config"), `${drivers}[filter "probe"]\nclean = node probe.cjs\n`); + await assert.rejects(findRepository(root), /Git output exceeded the 64000 byte limit/); + assert.equal(await pathExists(path.join(root, "probe-ran")), false); +}); diff --git a/tests/process.test.ts b/tests/process.test.ts new file mode 100644 index 0000000..1e198c8 --- /dev/null +++ b/tests/process.test.ts @@ -0,0 +1,29 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { runProcess } from "../src/process.js"; + +test("an early stdin close reports an input error without crashing ProofDiff", async () => { + const result = await runProcess(process.execPath, ["-e", "process.exit(0)"], { + cwd: process.cwd(), stdin: "x".repeat(1_000_000), timeoutMs: 5_000, + }); + assert.equal(result.exitCode, 0); + assert.equal(result.timedOut, false); + assert.match(result.error ?? "", /stdin/i); +}); + +test("a failed spawn with pending stdin returns a process error", async () => { + const result = await runProcess("proofdiff-nonexistent-command", [], { + cwd: process.cwd(), stdin: "x".repeat(1_000_000), timeoutMs: 5_000, + }); + assert.equal(result.exitCode, null); + assert.match(result.error ?? "", /ENOENT/); +}); + +test("a child that consumes all stdin retains its successful result", async () => { + const result = await runProcess(process.execPath, ["-e", "let n=0;process.stdin.on('data',b=>n+=b.length);process.stdin.on('end',()=>console.log(n));"], { + cwd: process.cwd(), stdin: "x".repeat(1_000_000), timeoutMs: 5_000, + }); + assert.equal(result.exitCode, 0); + assert.equal(result.stdout.trim(), "1000000"); + assert.equal(result.error, undefined); +}); diff --git a/tests/selection-workspace.test.ts b/tests/selection-workspace.test.ts index 6598b2a..202209c 100644 --- a/tests/selection-workspace.test.ts +++ b/tests/selection-workspace.test.ts @@ -1,7 +1,9 @@ import assert from "node:assert/strict"; +import path from "node:path"; import { rm } from "node:fs/promises"; import test from "node:test"; import { analyzeRepository } from "../src/analyze.js"; +import { pathExists } from "../src/util.js"; import { git, initializeRepository, writeFiles } from "./helpers.js"; const fixture = { @@ -10,6 +12,38 @@ const fixture = { "test/value.test.js": "import test from 'node:test'; import assert from 'node:assert/strict'; import { value } from '../src/value.js'; test('value', () => assert.equal(value, 1));\n", }; +test("all immutable static modes suppress configured Git clean filters", async (context) => { + const root = await initializeRepository({ + ".gitattributes": "*.txt filter=probe\n", + "value.txt": "baseline\n", + "probe.cjs": "require('node:fs').writeFileSync('probe-ran','yes');process.stdin.pipe(process.stdout);\n", + }); + context.after(() => rm(root, { recursive: true, force: true })); + git(root, "config", "filter.probe.clean", "node probe.cjs"); + for (const selection of [{ base: "HEAD" }, { range: "HEAD..HEAD" }, { staged: true }]) { + const report = await analyzeRepository({ repo: root, ...selection }); + assert.equal(await pathExists(path.join(root, "probe-ran")), false, JSON.stringify(selection)); + assert.equal(report.trust.repositoryCodeExecuted, false); + } +}); + +test("linked worktree configuration cannot enable static Git helper execution", async (context) => { + const root = await initializeRepository({ + ".gitattributes": "*.txt filter=probe\n", + "value.txt": "baseline\n", + "probe.cjs": "require('node:fs').writeFileSync('probe-ran','yes');process.stdin.pipe(process.stdout);\n", + }); + const linked = `${root}-linked`; + context.after(() => rm(linked, { recursive: true, force: true })); + context.after(() => rm(root, { recursive: true, force: true })); + git(root, "config", "extensions.worktreeConfig", "true"); + git(root, "worktree", "add", "--detach", linked, "HEAD"); + git(linked, "config", "--worktree", "filter.probe.clean", "node probe.cjs"); + const report = await analyzeRepository({ repo: linked, base: "HEAD" }); + assert.equal(await pathExists(path.join(linked, "probe-ran")), false); + assert.equal(report.trust.repositoryCodeExecuted, false); +}); + async function commitChange(root: string, content: string, message: string): Promise { await writeFiles(root, { "src/value.js": content }); git(root, "add", "src/value.js"); From a68cd22ec75d0efdd2f8c315d67fc4d0575bc5bc Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 22 Sep 2026 17:07:51 +0800 Subject: [PATCH 2/2] Pin linked-worktree fixture line endings for Windows CI --- tests/selection-workspace.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/selection-workspace.test.ts b/tests/selection-workspace.test.ts index 202209c..4d18650 100644 --- a/tests/selection-workspace.test.ts +++ b/tests/selection-workspace.test.ts @@ -29,7 +29,9 @@ test("all immutable static modes suppress configured Git clean filters", async ( test("linked worktree configuration cannot enable static Git helper execution", async (context) => { const root = await initializeRepository({ - ".gitattributes": "*.txt filter=probe\n", + // The checkout must remain byte-aligned even when the host has global autocrlf=true; + // static Git reads deliberately exclude global configuration. + ".gitattributes": "* text eol=lf\n*.txt filter=probe\n", "value.txt": "baseline\n", "probe.cjs": "require('node:fs').writeFileSync('probe-ran','yes');process.stdin.pipe(process.stdout);\n", });