@@ -15,13 +15,12 @@ const MIN_REQUIRED_BSD_TAR_VERSION = "3.4.3";
15
15
const MIN_REQUIRED_GNU_TAR_VERSION = "1.31" ;
16
16
17
17
export type TarVersion = {
18
- name : string ;
19
18
type : "gnu" | "bsd" ;
20
19
version : string ;
21
20
} ;
22
21
23
- async function getTarVersion ( programName : string ) : Promise < TarVersion > {
24
- const tar = await io . which ( programName , true ) ;
22
+ async function getTarVersion ( ) : Promise < TarVersion > {
23
+ const tar = await io . which ( "tar" , true ) ;
25
24
let stdout = "" ;
26
25
const exitCode = await new ToolRunner ( tar , [ "--version" ] , {
27
26
listeners : {
@@ -31,43 +30,28 @@ async function getTarVersion(programName: string): Promise<TarVersion> {
31
30
} ,
32
31
} ) . exec ( ) ;
33
32
if ( exitCode !== 0 ) {
34
- throw new Error ( ` Failed to call ${ programName } --version` ) ;
33
+ throw new Error ( " Failed to call tar --version" ) ;
35
34
}
36
35
// Return whether this is GNU tar or BSD tar, and the version number
37
36
if ( stdout . includes ( "GNU tar" ) ) {
38
37
const match = stdout . match ( / t a r \( G N U t a r \) ( [ 0 - 9 . ] + ) / ) ;
39
38
if ( ! match || ! match [ 1 ] ) {
40
- throw new Error ( ` Failed to parse output of ${ programName } --version.` ) ;
39
+ throw new Error ( " Failed to parse output of tar --version." ) ;
41
40
}
42
41
43
- return { name : programName , type : "gnu" , version : match [ 1 ] } ;
42
+ return { type : "gnu" , version : match [ 1 ] } ;
44
43
} else if ( stdout . includes ( "bsdtar" ) ) {
45
44
const match = stdout . match ( / b s d t a r ( [ 0 - 9 . ] + ) / ) ;
46
45
if ( ! match || ! match [ 1 ] ) {
47
- throw new Error ( ` Failed to parse output of ${ programName } --version.` ) ;
46
+ throw new Error ( " Failed to parse output of tar --version." ) ;
48
47
}
49
48
50
- return { name : programName , type : "bsd" , version : match [ 1 ] } ;
49
+ return { type : "bsd" , version : match [ 1 ] } ;
51
50
} else {
52
51
throw new Error ( "Unknown tar version" ) ;
53
52
}
54
53
}
55
54
56
- async function pickTarCommand ( ) : Promise < TarVersion > {
57
- // bsdtar 3.5.3 on the macos-14 (arm) action runner image is prone to crash with the following
58
- // error messages when extracting zstd archives:
59
- //
60
- // tar: Child process exited with status 1
61
- // tar: Error exit delayed from previous errors.
62
- //
63
- // To avoid this problem, prefer GNU tar under the name "gtar" if it is available.
64
- try {
65
- return await getTarVersion ( "gtar" ) ;
66
- } catch {
67
- return await getTarVersion ( "tar" ) ;
68
- }
69
- }
70
-
71
55
export interface ZstdAvailability {
72
56
available : boolean ;
73
57
foundZstdBinary : boolean ;
@@ -79,7 +63,7 @@ export async function isZstdAvailable(
79
63
) : Promise < ZstdAvailability > {
80
64
const foundZstdBinary = await isBinaryAccessible ( "zstd" , logger ) ;
81
65
try {
82
- const tarVersion = await pickTarCommand ( ) ;
66
+ const tarVersion = await getTarVersion ( ) ;
83
67
const { type, version } = tarVersion ;
84
68
logger . info ( `Found ${ type } tar version ${ version } .` ) ;
85
69
switch ( type ) {
@@ -178,10 +162,10 @@ export async function extractTarZst(
178
162
179
163
args . push ( "-f" , tar instanceof stream . Readable ? "-" : tar , "-C" , dest ) ;
180
164
181
- process . stdout . write ( `[command]${ tarVersion . name } ${ args . join ( " " ) } \n` ) ;
165
+ process . stdout . write ( `[command]tar ${ args . join ( " " ) } \n` ) ;
182
166
183
167
await new Promise < void > ( ( resolve , reject ) => {
184
- const tarProcess = spawn ( tarVersion . name , args , { stdio : "pipe" } ) ;
168
+ const tarProcess = spawn ( "tar" , args , { stdio : "pipe" } ) ;
185
169
186
170
let stdout = "" ;
187
171
tarProcess . stdout ?. on ( "data" , ( data : Buffer ) => {
@@ -212,7 +196,7 @@ export async function extractTarZst(
212
196
if ( code !== 0 ) {
213
197
reject (
214
198
new CommandInvocationError (
215
- tarVersion . name ,
199
+ "tar" ,
216
200
args ,
217
201
code ?? undefined ,
218
202
stdout ,
0 commit comments