Skip to content

Commit 988cdb3

Browse files
committed
fix: extra tar by 7z on windows
1 parent 559fcdd commit 988cdb3

File tree

6 files changed

+70
-29
lines changed

6 files changed

+70
-29
lines changed

dist/legacy/setup-cpp.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/legacy/setup-cpp.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/modern/setup-cpp.mjs

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

dist/modern/setup-cpp.mjs.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/llvm/llvm_url.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ import { loadAssetList, matchAsset } from "../utils/asset/load-assets.js"
77
import { arm64, armv7, powerpc64le, sparc64, sparcv9, x86, x86_64 } from "../utils/env/arch.js"
88
import { hasDnf } from "../utils/env/hasDnf.js"
99
import { ubuntuVersion } from "../utils/env/ubuntu_version.js"
10-
import { ArchiveType, extractTarByExe, getArchiveType, getExtractFunction } from "../utils/setup/extract.js"
10+
import {
11+
ArchiveType,
12+
extract7Zip,
13+
extractTarByExe,
14+
getArchiveType,
15+
getExtractFunction,
16+
} from "../utils/setup/extract.js"
1117
import type { PackageInfo } from "../utils/setup/setupBin.js"
1218

1319
const dirname = typeof __dirname === "string" ? __dirname : path.dirname(fileURLToPath(import.meta.url))
@@ -26,13 +32,14 @@ export async function getLLVMPackageInfo(
2632
extractedFolderName: "",
2733
binRelativeDir: "bin",
2834
binFileName: addExeExt("clang"),
29-
extractFunction: process.platform === "win32"
30-
&& (archiveType === ArchiveType.Tar || archiveType === ArchiveType.TarGz || archiveType === ArchiveType.TarXz)
31-
? (file: string, dest: string) => {
32-
// strip components to get the top folder on Windows
33-
return extractTarByExe(file, dest, 1)
34-
}
35-
: getExtractFunction(archiveType),
35+
extractFunction:
36+
(archiveType === ArchiveType.Tar || archiveType === ArchiveType.TarGz || archiveType === ArchiveType.TarXz)
37+
? (file: string, dest: string) => {
38+
return process.platform === "win32"
39+
? extract7Zip(file, dest, true)
40+
: extractTarByExe(file, dest, 1)
41+
}
42+
: getExtractFunction(archiveType),
3643
}
3744
}
3845

src/utils/setup/extract.ts

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { basename, dirname, join } from "path"
22
import { grantUserWriteAccess } from "admina"
33
import { info, warning } from "ci-log"
44
import { execa } from "execa"
5-
import { mkdirp, move } from "fs-extra"
6-
import { rm } from "fs/promises"
5+
import { mkdirp, move, readdir, remove, stat } from "fs-extra"
76
import which from "which"
87
import { setupSevenZip } from "../../sevenzip/sevenzip.js"
98
import { setupTar } from "../../tar/tar.js"
@@ -50,7 +49,7 @@ export function getExtractFunction(archiveType: ArchiveType) {
5049
case ArchiveType.Tar:
5150
case ArchiveType.TarGz:
5251
case ArchiveType.TarXz:
53-
return extractTarByExe
52+
return process.platform === "win32" ? extract7Zip : extractTarByExe
5453
case ArchiveType.Zip:
5554
return extractZip
5655
default:
@@ -61,23 +60,11 @@ export function getExtractFunction(archiveType: ArchiveType) {
6160
let sevenZip: string | undefined
6261

6362
/// Extract 7z using 7z
64-
export async function extract7Zip(file: string, dest: string) {
63+
export async function extract7Zip(file: string, dest: string, stripComponents: boolean = false) {
6564
const name = basename(file)
6665

6766
if (/.*\.tar\..+$/.test(name)) {
68-
// if the file is tar.*, extract the compression first
69-
const tarDir = dirname(file)
70-
await run7zip(file, tarDir)
71-
// extract the tar
72-
const tarName = name.slice(0, -3)
73-
const tarFile = join(tarDir, tarName)
74-
await run7zip(tarFile, tarDir)
75-
await rm(tarFile)
76-
// Move the extracted files to the destination
77-
const folderName = tarName.slice(0, -4)
78-
const folderPath = join(tarDir, folderName)
79-
info(`Moving ${folderPath} to ${dest}`)
80-
await move(folderPath, dest, { overwrite: true })
67+
await extractTarXzBy7zip(file, name, dest, stripComponents)
8168
} else {
8269
// extract the 7z file directly
8370
await run7zip(file, dest)
@@ -86,6 +73,53 @@ export async function extract7Zip(file: string, dest: string) {
8673
return dest
8774
}
8875

76+
async function extractTarXzBy7zip(file: string, name: string, dest: string, stripComponents: boolean) {
77+
if (!/.*\.tar\..+$/.test(name)) {
78+
throw new Error(`Invalid tar file: ${name}`)
79+
}
80+
// extract the compression first
81+
const tarDir = dirname(file)
82+
await run7zip(file, tarDir)
83+
// extract the tar
84+
const tarName = name.slice(0, -3)
85+
const tarFile = join(tarDir, tarName)
86+
await run7zip(tarFile, tarDir)
87+
await remove(tarFile)
88+
// move the extracted files to the destination
89+
const folderName = tarName.slice(0, -4)
90+
const folderPath = join(tarDir, folderName)
91+
info(`Moving ${folderPath} to ${dest}`)
92+
await move(folderPath, dest, { overwrite: true })
93+
94+
if (stripComponents) {
95+
await stripPathComponents(dest, folderName)
96+
}
97+
}
98+
99+
async function stripPathComponents(dest: string, folderName: string) {
100+
// get all subfolders in the folder
101+
const subFolders = await readdir(join(dest, folderName))
102+
await Promise.all(
103+
subFolders.map(async (subFolder) => {
104+
const subFolderPath = join(dest, subFolder)
105+
if (!(await stat(subFolderPath)).isDirectory()) {
106+
// if the subfolder is not a directory, do nothing
107+
return
108+
}
109+
// for each subfolder, move all files to the destination
110+
const subFiles = await readdir(subFolderPath)
111+
await Promise.all(
112+
subFiles.map((subFile) => {
113+
return move(join(subFolderPath, subFile), join(dest, subFile), { overwrite: true })
114+
}),
115+
)
116+
// remove the subfolder
117+
await remove(subFolderPath)
118+
return
119+
}),
120+
)
121+
}
122+
89123
async function run7zip(file: string, dest: string) {
90124
info(`7z: extracting ${file} to ${dest}`)
91125
await execa(await getSevenZip(), ["x", file, `-o${dest}`, "-y"], { stdio: "inherit" })

0 commit comments

Comments
 (0)