diff --git a/dev/docker/arch_node.dockerfile b/dev/docker/arch_node.dockerfile index d01e310f..79daace3 100644 --- a/dev/docker/arch_node.dockerfile +++ b/dev/docker/arch_node.dockerfile @@ -15,7 +15,7 @@ COPY "./dist/" "/" WORKDIR "/" # run installation -RUN node ./setup_cpp.js --compiler llvm --cmake true --ninja true --cppcheck true --ccache true --vcpkg true --doxygen true --gcovr true --task true +RUN node ./setup_cpp.js --compiler llvm --cmake true --ninja true --cppcheck true --ccache true --vcpkg true --doxygen true --gcovr true --task true --powershell true # clean up RUN pacman -Scc --noconfirm diff --git a/dev/docker/fedora_node.dockerfile b/dev/docker/fedora_node.dockerfile index a81d6283..3b577935 100644 --- a/dev/docker/fedora_node.dockerfile +++ b/dev/docker/fedora_node.dockerfile @@ -12,7 +12,7 @@ COPY "./dist/" "/" WORKDIR "/" # run installation -RUN node ./setup_cpp.js --compiler llvm --cmake true --ninja true --cppcheck true --ccache true --vcpkg true --doxygen true --gcovr true --task true +RUN node ./setup_cpp.js --compiler llvm --cmake true --ninja true --cppcheck true --ccache true --vcpkg true --doxygen true --gcovr true --task true --powershell true # clean up RUN rm -rf /tmp/* diff --git a/dev/docker/ubuntu_node.dockerfile b/dev/docker/ubuntu_node.dockerfile index 7c856b7e..eb7c7703 100644 --- a/dev/docker/ubuntu_node.dockerfile +++ b/dev/docker/ubuntu_node.dockerfile @@ -8,7 +8,7 @@ COPY "./dist/" "/" WORKDIR "/" # run installation -RUN node ./setup_cpp.js --compiler llvm --cmake true --ninja true --cppcheck true --ccache true --vcpkg true --doxygen true --gcovr true --task true +RUN node ./setup_cpp.js --compiler llvm --cmake true --ninja true --cppcheck true --ccache true --vcpkg true --doxygen true --gcovr true --task true --powershell true # clean up RUN apt-get clean && rm -rf /var/lib/apt/lists/* diff --git a/src/main.ts b/src/main.ts index b5d80d2f..138753dd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -44,6 +44,7 @@ import { setupSevenZip } from "./sevenzip/sevenzip" import { setupGraphviz } from "./graphviz/graphviz" import { setupNala } from "./nala/nala" import { setupBazel } from "./bazel/bazel" +import { setupPowershell } from "./powershell/powershell" /** The setup functions */ const setups = { @@ -61,6 +62,7 @@ const setups = { gcc: setupGcc, choco: setupChocolatey, brew: setupBrew, + powershell: setupPowershell, ccache: setupCcache, doxygen: setupDoxygen, graphviz: setupGraphviz, @@ -81,6 +83,7 @@ const tools: Array = [ "choco", "brew", "python", + "powershell", "vcpkg", "bazel", "cmake", diff --git a/src/powershell/__tests__/powershell.test.ts b/src/powershell/__tests__/powershell.test.ts new file mode 100644 index 00000000..62ca4be4 --- /dev/null +++ b/src/powershell/__tests__/powershell.test.ts @@ -0,0 +1,12 @@ +import { setupPowershell } from "../powershell" +import { testBin } from "../../utils/tests/test-helpers" +import { getVersion } from "../../default_versions" + +jest.setTimeout(300000) +describe("setup-powershell", () => { + it("should setup powershell", async () => { + const installInfo = await setupPowershell(getVersion("powershell", undefined), "", process.arch) + + await testBin("pwsh", ["--version"], installInfo.binDir) + }) +}) diff --git a/src/powershell/powershell.ts b/src/powershell/powershell.ts new file mode 100644 index 00000000..411ed033 --- /dev/null +++ b/src/powershell/powershell.ts @@ -0,0 +1,51 @@ +import { addPath } from "../utils/env/addEnv" +import { addAptKeyViaDownload, setupAptPack } from "../utils/setup/setupAptPack" +import { setupPacmanPack } from "../utils/setup/setupPacmanPack" +import { setupBrewPack } from "../utils/setup/setupBrewPack" +import { setupChocoPack } from "../utils/setup/setupChocoPack" +import { isArch } from "../utils/env/isArch" +import { hasDnf } from "../utils/env/hasDnf" +import { setupDnfPack } from "../utils/setup/setupDnfPack" +import { isUbuntu } from "../utils/env/isUbuntu" +import { execSudo } from "../utils/exec/sudo" + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export async function setupPowershell(version: string | undefined, _setupDir: string, _arch: string) { + switch (process.platform) { + case "win32": { + await setupChocoPack("powershell", version) + const binDir = "C:/Program Files/PowerShell/7" + await addPath(binDir) + return { binDir } + } + case "darwin": { + return setupBrewPack("powershell", version, ["--cask"]) + } + case "linux": { + if (isArch()) { + return setupPacmanPack("powershell-bin", version, "yay") + } else if (hasDnf()) { + setupDnfPack("curl") + execSudo("/bin/bash", [ + "-c", + `curl https://packages.microsoft.com/config/rhel/8/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo`, + ]) + return setupDnfPack("powershell", version) + } else if (isUbuntu()) { + const keyFileName = await addAptKeyViaDownload( + "microsoft.asc", + "https://packages.microsoft.com/keys/microsoft.asc" + ) + execSudo("/bin/bash", [ + "-c", + `echo "deb [arch=amd64 signed-by=${keyFileName}] https://packages.microsoft.com/repos/microsoft-debian-bullseye-prod bullseye main" > /etc/apt/sources.list.d/microsoft.list`, + ]) + return setupAptPack("powershell", version) + } + throw new Error(`Unsupported linux distribution`) + } + default: { + throw new Error(`Unsupported platform`) + } + } +} diff --git a/src/utils/setup/setupBrewPack.ts b/src/utils/setup/setupBrewPack.ts index c3b3a2d4..a822b3a1 100644 --- a/src/utils/setup/setupBrewPack.ts +++ b/src/utils/setup/setupBrewPack.ts @@ -8,7 +8,7 @@ import { InstallationInfo } from "./setupBin" let hasBrew = false /** A function that installs a package using brew */ -export function setupBrewPack(name: string, version?: string): InstallationInfo { +export function setupBrewPack(name: string, version?: string, extraArgs: string[] = []): InstallationInfo { info(`Installing ${name} ${version ?? ""} via brew`) if (!hasBrew || which.sync("brew", { nothrow: true }) === null) { @@ -17,7 +17,7 @@ export function setupBrewPack(name: string, version?: string): InstallationInfo } // brew is not thread-safe - execa.sync("brew", ["install", version !== undefined && version !== "" ? `${name}@${version}` : name], { + execa.sync("brew", ["install", version !== undefined && version !== "" ? `${name}@${version}` : name, ...extraArgs], { stdio: "inherit", })