mirror of
https://github.com/github/codeql-action.git
synced 2026-01-01 12:10:20 +08:00
Revert "Prefer gtar if available"
This commit is contained in:
38
src/tar.ts
38
src/tar.ts
@@ -15,13 +15,12 @@ const MIN_REQUIRED_BSD_TAR_VERSION = "3.4.3";
|
||||
const MIN_REQUIRED_GNU_TAR_VERSION = "1.31";
|
||||
|
||||
export type TarVersion = {
|
||||
name: string;
|
||||
type: "gnu" | "bsd";
|
||||
version: string;
|
||||
};
|
||||
|
||||
async function getTarVersion(programName: string): Promise<TarVersion> {
|
||||
const tar = await io.which(programName, true);
|
||||
async function getTarVersion(): Promise<TarVersion> {
|
||||
const tar = await io.which("tar", true);
|
||||
let stdout = "";
|
||||
const exitCode = await new ToolRunner(tar, ["--version"], {
|
||||
listeners: {
|
||||
@@ -31,43 +30,28 @@ async function getTarVersion(programName: string): Promise<TarVersion> {
|
||||
},
|
||||
}).exec();
|
||||
if (exitCode !== 0) {
|
||||
throw new Error(`Failed to call ${programName} --version`);
|
||||
throw new Error("Failed to call tar --version");
|
||||
}
|
||||
// Return whether this is GNU tar or BSD tar, and the version number
|
||||
if (stdout.includes("GNU tar")) {
|
||||
const match = stdout.match(/tar \(GNU tar\) ([0-9.]+)/);
|
||||
if (!match || !match[1]) {
|
||||
throw new Error(`Failed to parse output of ${programName} --version.`);
|
||||
throw new Error("Failed to parse output of tar --version.");
|
||||
}
|
||||
|
||||
return { name: programName, type: "gnu", version: match[1] };
|
||||
return { type: "gnu", version: match[1] };
|
||||
} else if (stdout.includes("bsdtar")) {
|
||||
const match = stdout.match(/bsdtar ([0-9.]+)/);
|
||||
if (!match || !match[1]) {
|
||||
throw new Error(`Failed to parse output of ${programName} --version.`);
|
||||
throw new Error("Failed to parse output of tar --version.");
|
||||
}
|
||||
|
||||
return { name: programName, type: "bsd", version: match[1] };
|
||||
return { type: "bsd", version: match[1] };
|
||||
} else {
|
||||
throw new Error("Unknown tar version");
|
||||
}
|
||||
}
|
||||
|
||||
async function pickTarCommand(): Promise<TarVersion> {
|
||||
// bsdtar 3.5.3 on the macos-14 (arm) action runner image is prone to crash with the following
|
||||
// error messages when extracting zstd archives:
|
||||
//
|
||||
// tar: Child process exited with status 1
|
||||
// tar: Error exit delayed from previous errors.
|
||||
//
|
||||
// To avoid this problem, prefer GNU tar under the name "gtar" if it is available.
|
||||
try {
|
||||
return await getTarVersion("gtar");
|
||||
} catch {
|
||||
return await getTarVersion("tar");
|
||||
}
|
||||
}
|
||||
|
||||
export interface ZstdAvailability {
|
||||
available: boolean;
|
||||
foundZstdBinary: boolean;
|
||||
@@ -79,7 +63,7 @@ export async function isZstdAvailable(
|
||||
): Promise<ZstdAvailability> {
|
||||
const foundZstdBinary = await isBinaryAccessible("zstd", logger);
|
||||
try {
|
||||
const tarVersion = await pickTarCommand();
|
||||
const tarVersion = await getTarVersion();
|
||||
const { type, version } = tarVersion;
|
||||
logger.info(`Found ${type} tar version ${version}.`);
|
||||
switch (type) {
|
||||
@@ -178,10 +162,10 @@ export async function extractTarZst(
|
||||
|
||||
args.push("-f", tar instanceof stream.Readable ? "-" : tar, "-C", dest);
|
||||
|
||||
process.stdout.write(`[command]${tarVersion.name} ${args.join(" ")}\n`);
|
||||
process.stdout.write(`[command]tar ${args.join(" ")}\n`);
|
||||
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
const tarProcess = spawn(tarVersion.name, args, { stdio: "pipe" });
|
||||
const tarProcess = spawn("tar", args, { stdio: "pipe" });
|
||||
|
||||
let stdout = "";
|
||||
tarProcess.stdout?.on("data", (data: Buffer) => {
|
||||
@@ -212,7 +196,7 @@ export async function extractTarZst(
|
||||
if (code !== 0) {
|
||||
reject(
|
||||
new CommandInvocationError(
|
||||
tarVersion.name,
|
||||
"tar",
|
||||
args,
|
||||
code ?? undefined,
|
||||
stdout,
|
||||
|
||||
Reference in New Issue
Block a user