From 5761eb56273e66a3c664ac21ffe0157d3334e5cf Mon Sep 17 00:00:00 2001 From: chiragbiradar Date: Thu, 16 Jul 2026 14:11:08 +0530 Subject: [PATCH] fix(eval): run tar with relative paths so the SWE-chat harness works on Windows GNU tar interprets absolute Windows paths (C:\...) in -f/-C as remote host specs and exits with 'Child returned status 128', so prepareTargetRepo failed for every runner on Windows. Invoke tar from the run directory with paths relative to it instead; behavior on Unix is unchanged. Verified: --fixture-only now completes on Windows (previously failed at extraction) and typecheck/build are clean. --- evals/swechat-plan/build-memory.ts | 6 ++++-- evals/swechat-plan/run.ts | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/evals/swechat-plan/build-memory.ts b/evals/swechat-plan/build-memory.ts index 8384656..af8a4a9 100644 --- a/evals/swechat-plan/build-memory.ts +++ b/evals/swechat-plan/build-memory.ts @@ -9,7 +9,7 @@ import { writeFileSync, } from "node:fs"; import { homedir } from "node:os"; -import { dirname, resolve } from "node:path"; +import { dirname, relative, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import { type CommandResult, @@ -236,7 +236,9 @@ async function prepareTargetRepo(context: Context): Promise { const response = await fetch(`https://codeload.github.com/${context.config.repo.full_name}/tar.gz/${context.config.repo.base_commit}`); if (!response.ok) throw new Error(`Failed to download base archive: ${response.status} ${response.statusText}`); writeFileSync(archivePath, Buffer.from(await response.arrayBuffer())); - const extract = run(["tar", "-xzf", archivePath, "-C", extractDir], context.repoRoot, process.env); + // Run tar from the run directory with relative paths: GNU tar interprets + // absolute Windows paths ("C:\...") as remote host specs and fails. + const extract = run(["tar", "-xzf", relative(context.runDir, archivePath), "-C", relative(context.runDir, extractDir)], context.runDir, process.env); if (extract.exit_code !== 0) throw new Error(`Failed to extract base archive: ${extract.stderr ?? extract.stdout ?? ""}`); const roots = readdirSync(extractDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()); if (roots.length !== 1) throw new Error(`Expected one archive root in ${extractDir}, found ${roots.length}`); diff --git a/evals/swechat-plan/run.ts b/evals/swechat-plan/run.ts index ad35270..28f9a43 100644 --- a/evals/swechat-plan/run.ts +++ b/evals/swechat-plan/run.ts @@ -277,7 +277,9 @@ async function prepareTargetRepo(context: RunContext): Promise const response = await fetch(`https://codeload.github.com/${context.config.repo.full_name}/tar.gz/${context.config.repo.base_commit}`); if (!response.ok) throw new Error(`Failed to download base archive: ${response.status} ${response.statusText}`); writeFileSync(archivePath, Buffer.from(await response.arrayBuffer())); - const extract = run(["tar", "-xzf", archivePath, "-C", extractDir], context.repoRoot, process.env); + // Run tar from the run directory with relative paths: GNU tar interprets + // absolute Windows paths ("C:\...") as remote host specs and fails. + const extract = run(["tar", "-xzf", relative(context.runDir, archivePath), "-C", relative(context.runDir, extractDir)], context.runDir, process.env); if (extract.exit_code !== 0) throw new Error(`Failed to extract base archive: ${extract.stderr ?? extract.stdout ?? ""}`); const roots = readdirSync(extractDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()); if (roots.length !== 1) throw new Error(`Expected one archive root in ${extractDir}, found ${roots.length}`);