Skip to content

Commit e486e36

Browse files
authored
Merge pull request #264 from aminya/powershell-ubuntu-24 [skip ci]
2 parents 35ec48a + c2afe42 commit e486e36

File tree

17 files changed

+322
-151
lines changed

17 files changed

+322
-151
lines changed

.github/workflows/CI.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ jobs:
8484
- windows-2022
8585
- ubuntu-24.04
8686
- macos-13
87-
- macos-12
87+
# - macos-12
8888
node:
8989
- 22
9090
pnpm:

dist/actions/setup-cpp.js

+28-28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/actions/setup-cpp.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/legacy/setup-cpp.js

+28-28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/legacy/setup-cpp.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/modern/setup-cpp.js

+28-28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/modern/setup-cpp.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/cmake/cmake.ts

-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { addExeExt } from "patha"
22
import semverCoerce from "semver/functions/coerce"
33
import semverLte from "semver/functions/lte"
4-
import { extractTarByExe, extractZip } from "../utils/setup/extract.js"
54
import { type InstallationInfo, type PackageInfo, setupBin } from "../utils/setup/setupBin.js"
65

76
/** Get the platform data for cmake */
@@ -21,7 +20,6 @@ function getCmakePackageInfo(version: string, platform: NodeJS.Platform, arch: s
2120
binRelativeDir: "bin/",
2221
binFileName: addExeExt("cmake"),
2322
extractedFolderName: folderName,
24-
extractFunction: extractZip,
2523
url: `https://github.com/Kitware/CMake/releases/download/v${version}/${folderName}.zip`,
2624
}
2725
}
@@ -33,7 +31,6 @@ function getCmakePackageInfo(version: string, platform: NodeJS.Platform, arch: s
3331
binRelativeDir: "CMake.app/Contents/bin/",
3432
binFileName: addExeExt("cmake"),
3533
extractedFolderName: folderName,
36-
extractFunction: extractTarByExe,
3734
url: `https://github.com/Kitware/CMake/releases/download/v${version}/${folderName}.tar.gz`,
3835
}
3936
}
@@ -50,7 +47,6 @@ function getCmakePackageInfo(version: string, platform: NodeJS.Platform, arch: s
5047
binRelativeDir: "bin/",
5148
binFileName: addExeExt("cmake"),
5249
extractedFolderName: folderName,
53-
extractFunction: extractTarByExe,
5450
url: `https://github.com/Kitware/CMake/releases/download/v${version}/${folderName}.tar.gz`,
5551
}
5652
}

src/doxygen/doxygen.ts

-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { addPath } from "envosman"
33
import { addExeExt, join } from "patha"
44
import { installAptPack } from "setup-apt"
55
import { setupGraphviz } from "../graphviz/graphviz.js"
6-
import { extractTar, extractZip } from "../utils/setup/extract.js"
76
import { type InstallationInfo, type PackageInfo, setupBin } from "../utils/setup/setupBin.js"
87
import { setupBrewPack } from "../utils/setup/setupBrewPack.js"
98
import { setupChocoPack } from "../utils/setup/setupChocoPack.js"
@@ -31,7 +30,6 @@ function getDoxygenPackageInfo(version: string, platform: NodeJS.Platform, _arch
3130
binRelativeDir: "bin/",
3231
binFileName: addExeExt("doxygen"),
3332
extractedFolderName: folderName,
34-
extractFunction: extractTar,
3533
url: `https://www.doxygen.nl/files/${folderName}.linux.bin.tar.gz`,
3634
}
3735
}
@@ -41,7 +39,6 @@ function getDoxygenPackageInfo(version: string, platform: NodeJS.Platform, _arch
4139
binRelativeDir: "",
4240
binFileName: addExeExt("doxygen"),
4341
extractedFolderName: folderName,
44-
extractFunction: extractZip,
4542
url: `https://www.doxygen.nl/files/${folderName}.windows.x64.bin.zip`,
4643
}
4744
}

src/kcov/kcov.ts

-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ function getDownloadKcovPackageInfo(version: string): PackageInfo {
2323
extractedFolderName: "",
2424
binRelativeDir: "usr/local/bin",
2525
binFileName: addExeExt("kcov"),
26-
extractFunction: extractTarByExe,
2726
}
2827
}
2928

src/ninja/ninja.ts

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { addExeExt } from "patha"
2-
import { extractZip } from "../utils/setup/extract.js"
32
import { type InstallationInfo, type PackageInfo, setupBin } from "../utils/setup/setupBin.js"
43

54
/** Get the platform name Ninja uses in their download links */
@@ -24,7 +23,6 @@ function getNinjaPackageInfo(version: string, platform: NodeJS.Platform, _arch:
2423
binRelativeDir: "",
2524
binFileName: addExeExt("ninja"),
2625
extractedFolderName: "",
27-
extractFunction: extractZip,
2826
url: `https://github.com/ninja-build/ninja/releases/download/v${version}/ninja-${ninjaPlatform}.zip`,
2927
}
3028
}
+12-2
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
import { GITHUB_ACTIONS } from "ci-info"
2-
import { testBin } from "../../utils/tests/test-helpers.js"
2+
import { cleanupTmpDir, setupTmpDir, testBin } from "../../utils/tests/test-helpers.js"
33
import { getVersion } from "../../versions/versions.js"
44
import { setupPowershell } from "../powershell.js"
55

66
jest.setTimeout(300000)
77
describe("setup-powershell", () => {
8+
let directory: string
9+
beforeEach(async () => {
10+
directory = await setupTmpDir("powershell")
11+
process.env.CACHE_TOOLS = "true"
12+
})
13+
814
it("should setup powershell", async () => {
915
if (process.platform === "win32" && GITHUB_ACTIONS) {
1016
// results in errors
1117
return
1218
}
1319

14-
const installInfo = await setupPowershell(getVersion("powershell", undefined), "", process.arch)
20+
const installInfo = await setupPowershell(getVersion("powershell", undefined), directory, process.arch)
1521

1622
await testBin("pwsh", ["--version"], installInfo.binDir)
1723
})
24+
25+
afterEach(async () => {
26+
await cleanupTmpDir("ninja")
27+
}, 100000)
1828
})

src/powershell/powershell.ts

+59-1
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,76 @@
11
import { execRootSync } from "admina"
2+
import { error } from "ci-log"
23
import { addPath } from "envosman"
4+
import { addExeExt } from "patha"
35
import { installAptPack } from "setup-apt"
46
import { rcOptions } from "../cli-options.js"
57
import { hasDnf } from "../utils/env/hasDnf.js"
68
import { isArch } from "../utils/env/isArch.js"
79
import { isUbuntu } from "../utils/env/isUbuntu.js"
810
import { ubuntuVersion } from "../utils/env/ubuntu_version.js"
11+
import { type PackageInfo, setupBin } from "../utils/setup/setupBin.js"
912
import { setupBrewPack } from "../utils/setup/setupBrewPack.js"
1013
import { setupChocoPack } from "../utils/setup/setupChocoPack.js"
1114
import { setupDnfPack } from "../utils/setup/setupDnfPack.js"
1215
import { setupPacmanPack } from "../utils/setup/setupPacmanPack.js"
1316

17+
/** Get the platform data for cmake */
18+
function getPowerShellPackageInfo(version: string, platform: NodeJS.Platform, arch: string): PackageInfo {
19+
return {
20+
url: getPowershellUrl(platform, arch, version),
21+
binRelativeDir: "",
22+
binFileName: addExeExt("pwsh"),
23+
extractedFolderName: "",
24+
}
25+
}
26+
27+
function getPowershellUrl(
28+
platform: string,
29+
arch: string,
30+
version: string,
31+
) {
32+
switch (platform) {
33+
case "win32": {
34+
const osArchStr = (["ia32", "x86", "i386", "x32"].includes(arch))
35+
? "win-x86"
36+
: "win-x64"
37+
38+
return `https://github.com/PowerShell/PowerShell/releases/download/v${version}/PowerShell-${version}-${osArchStr}.zip`
39+
}
40+
case "darwin": {
41+
const osArchStr = ["arm", "arm64"].includes(arch) ? "osx-arm64" : "osx-x64"
42+
43+
return `https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-${osArchStr}.tar.gz`
44+
}
45+
case "linux": {
46+
const archMap = {
47+
arm64: "linux-arm64",
48+
arm: "linux-arm64",
49+
arm32: "linux-arm32",
50+
aarch64: "linux-arm64",
51+
x64: "linux-x64",
52+
} as Record<string, string | undefined>
53+
const osArchStr = archMap[arch] ?? "linux-x64"
54+
// TODO support musl
55+
return `https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-${osArchStr}.tar.gz`
56+
}
57+
default:
58+
throw new Error(`Unsupported platform '${platform}'`)
59+
}
60+
}
61+
62+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
63+
export async function setupPowershell(version: string, setupDir: string, arch: string) {
64+
try {
65+
return await setupBin("pwsh", version, getPowerShellPackageInfo, setupDir, arch)
66+
} catch (err) {
67+
error(`Failed to setup pwsh via download: ${err}. Trying package managers...`)
68+
return setupPowershellSystem(version, setupDir, arch)
69+
}
70+
}
71+
1472
// eslint-disable-next-line @typescript-eslint/no-unused-vars
15-
export async function setupPowershell(version: string | undefined, _setupDir: string, _arch: string) {
73+
export async function setupPowershellSystem(version: string | undefined, _setupDir: string, _arch: string) {
1674
switch (process.platform) {
1775
case "win32": {
1876
await setupChocoPack("powershell-core", version)

src/task/task.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { addExeExt } from "patha"
2-
import { extractTarByExe, extractZip } from "../utils/setup/extract.js"
32
import { type InstallationInfo, type PackageInfo, setupBin } from "../utils/setup/setupBin.js"
43

54
/** Get the platform name task uses in their download links */
@@ -31,13 +30,11 @@ function getTaskArch(arch: string) {
3130
function getTaskPackageInfo(version: string, platform: NodeJS.Platform, arch: string): PackageInfo {
3231
const taskPlatform = getTaskPlatform(platform)
3332
const taskArch = getTaskArch(arch)
34-
const isZip = platform === "win32"
35-
const extension = isZip ? "zip" : "tar.gz"
33+
const extension = platform === "win32" ? "zip" : "tar.gz"
3634
return {
3735
binRelativeDir: "",
3836
binFileName: addExeExt("task"),
3937
extractedFolderName: "",
40-
extractFunction: isZip ? extractZip : extractTarByExe,
4138
url: `https://github.com/go-task/task/releases/download/v${version}/task_${taskPlatform}_${taskArch}.${extension}`,
4239
}
4340
}

src/utils/setup/extract.ts

+103-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,67 @@
11
import { mkdirP } from "@actions/io"
22
import { grantUserWriteAccess } from "admina"
3-
import { warning } from "ci-log"
3+
import { info, warning } from "ci-log"
44
import { execa } from "execa"
5+
import { installAptPack } from "setup-apt"
56
import which from "which"
67
import { setupSevenZip } from "../../sevenzip/sevenzip.js"
8+
import { hasDnf } from "../env/hasDnf.js"
9+
import { isArch } from "../env/isArch.js"
10+
import { isUbuntu } from "../env/isUbuntu.js"
11+
import { setupDnfPack } from "./setupDnfPack.js"
12+
import { setupPacmanPack } from "./setupPacmanPack.js"
713
export { extractTar, extractXar } from "@actions/tool-cache"
814

15+
export enum ArchiveType {
16+
Tar = 0,
17+
TarGz = 1,
18+
TarXz = 2,
19+
Zip = 3,
20+
SevenZip = 4,
21+
}
22+
23+
export function getArchiveType(file: string): ArchiveType {
24+
const ext = file.split(".").pop()
25+
26+
if (ext === "tar") {
27+
return ArchiveType.Tar
28+
}
29+
30+
if (ext === "gz" || ext === "tgz") {
31+
return ArchiveType.TarGz
32+
}
33+
34+
if (ext === "xz" || ext === "txz") {
35+
return ArchiveType.TarXz
36+
}
37+
38+
if (ext === "zip") {
39+
return ArchiveType.Zip
40+
}
41+
42+
if (ext === "7z" || ext === "exe") {
43+
return ArchiveType.SevenZip
44+
}
45+
46+
// default to 7z
47+
warning(`Unknown archive type: ${ext}. Defaulting to 7z`)
48+
return ArchiveType.SevenZip
49+
}
50+
51+
export function getExtractFunction(archiveType: ArchiveType) {
52+
switch (archiveType) {
53+
case ArchiveType.Tar:
54+
case ArchiveType.TarGz:
55+
return extractTarByExe
56+
case ArchiveType.TarXz:
57+
return extractTarByExe
58+
case ArchiveType.Zip:
59+
return extractZip
60+
default:
61+
return extract7Zip
62+
}
63+
}
64+
965
let sevenZip: string | undefined
1066

1167
/// Extract 7z using 7z
@@ -32,12 +88,21 @@ export function extractExe(file: string, dest: string) {
3288
return extract7Zip(file, dest)
3389
}
3490

35-
/// Extract Zip using 7z
36-
export function extractZip(file: string, dest: string) {
91+
/// Extract Zip using unzip or 7z
92+
export async function extractZip(file: string, dest: string) {
93+
// if unzip is available use it
94+
if (which.sync("unzip", { nothrow: true }) !== null) {
95+
await execa("unzip", [file, "-d", dest], { stdio: "inherit" })
96+
await grantUserWriteAccess(dest)
97+
return dest
98+
}
99+
37100
return extract7Zip(file, dest)
38101
}
39102

40103
export async function extractTarByExe(file: string, dest: string, stripComponents: number = 0, flags: string[] = []) {
104+
await installTarDependencies(getArchiveType(file))
105+
41106
try {
42107
await mkdirP(dest)
43108
} catch {
@@ -60,3 +125,38 @@ export async function extractTarByExe(file: string, dest: string, stripComponent
60125
await grantUserWriteAccess(dest)
61126
return dest
62127
}
128+
129+
async function installTarDependencies(archiveType: ArchiveType) {
130+
info("Installing tar extraction dependencies")
131+
132+
switch (archiveType) {
133+
case ArchiveType.TarGz: {
134+
if (process.platform === "linux") {
135+
if (isArch()) {
136+
await setupPacmanPack("gzip")
137+
await setupPacmanPack("tar")
138+
} else if (hasDnf()) {
139+
await setupDnfPack([{ name: "gzip" }, { name: "tar" }])
140+
} else if (isUbuntu()) {
141+
await installAptPack([{ name: "gzip" }, { name: "tar" }])
142+
}
143+
}
144+
break
145+
}
146+
case ArchiveType.TarXz: {
147+
if (process.platform === "linux") {
148+
if (isArch()) {
149+
await setupPacmanPack("xz")
150+
await setupPacmanPack("tar")
151+
} else if (hasDnf()) {
152+
await setupDnfPack([{ name: "xz" }, { name: "tar" }])
153+
} else if (isUbuntu()) {
154+
await installAptPack([{ name: "xz-utils" }, { name: "tar" }])
155+
}
156+
}
157+
break
158+
}
159+
default:
160+
throw new Error(`Unsupported archive type: ${archiveType} for tar extraction`)
161+
}
162+
}

0 commit comments

Comments
 (0)