setup-cpp/src/chocolatey/chocolatey.ts

72 lines
2.0 KiB
TypeScript
Raw Normal View History

2023-04-22 17:19:33 +08:00
import { execaSync } from "execa"
import { addPath } from "os-env"
2023-04-23 16:09:38 +08:00
import { pathExists } from "path-exists"
import { dirname } from "patha"
2021-09-15 05:01:08 +08:00
import which from "which"
import { rcOptions } from "../cli-options"
2024-08-07 14:44:32 +08:00
import type { InstallationInfo } from "../utils/setup/setupBin"
2021-09-15 05:01:08 +08:00
/* eslint-disable require-atomic-updates */
2021-09-17 02:47:12 +08:00
let binDir: string | undefined
2022-05-13 03:55:00 +08:00
export async function setupChocolatey(
2021-09-17 02:47:12 +08:00
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_version: string,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_setupDir: string,
2021-09-17 02:47:12 +08:00
// eslint-disable-next-line @typescript-eslint/no-unused-vars
2023-07-25 04:20:04 +08:00
_arch: string,
2022-05-13 03:55:00 +08:00
): Promise<InstallationInfo | undefined> {
if (process.platform !== "win32") {
2021-09-17 02:47:12 +08:00
return undefined
}
if (typeof binDir === "string") {
return { binDir }
}
2021-09-17 02:47:12 +08:00
const maybeBinDir = which.sync("choco", { nothrow: true })
if (maybeBinDir !== null) {
binDir = dirname(maybeBinDir)
2021-09-17 02:47:12 +08:00
return { binDir }
2021-09-15 05:01:08 +08:00
}
2021-12-06 18:41:20 +08:00
let powershell = "powershell.exe"
const maybePowerShell = which.sync(`${process.env.SystemRoot}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`, {
nothrow: true,
})
if (maybePowerShell !== null) {
powershell = maybePowerShell
}
2021-09-15 05:01:08 +08:00
// https://docs.chocolatey.org/en-us/choco/setup#install-with-cmd.exe
2023-04-22 17:19:33 +08:00
execaSync(
powershell,
[
"-NoProfile",
"-InputFormat",
"None",
"-ExecutionPolicy",
"Bypass",
"-Command",
"[System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))",
],
2023-07-25 04:20:04 +08:00
{ stdio: "inherit" },
)
2021-12-06 18:41:20 +08:00
const chocoPath = `${process.env.ALLUSERSPROFILE}\\chocolatey\\bin`
await addPath(chocoPath, rcOptions)
2021-09-17 02:47:12 +08:00
2021-09-17 06:44:13 +08:00
const maybeChoco = which.sync("choco", { nothrow: true })
if (maybeChoco !== null) {
binDir = dirname(maybeChoco)
} else {
binDir = `${process.env.ChocolateyInstall ?? "C:/ProgramData/chocolatey"}/bin`
2021-09-17 06:44:13 +08:00
}
2021-09-17 04:08:54 +08:00
if (await pathExists(binDir)) {
2021-09-17 04:08:54 +08:00
return { binDir }
}
return undefined
2021-09-15 05:01:08 +08:00
}