mirror of https://github.com/aminya/setup-cpp
fix: refactor setupPythonAndPip function
This commit is contained in:
parent
623216a193
commit
e9be714c29
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -14,6 +14,10 @@ import { setupDnfPack } from "../utils/setup/setupDnfPack"
|
||||||
import { isUbuntu } from "../utils/env/isUbuntu"
|
import { isUbuntu } from "../utils/env/isUbuntu"
|
||||||
import { getExecOutput } from "@actions/exec"
|
import { getExecOutput } from "@actions/exec"
|
||||||
import { existsSync } from "fs"
|
import { existsSync } from "fs"
|
||||||
|
import { isBinUptoDate } from "../utils/setup/version"
|
||||||
|
import { getVersion } from "../versions/versions"
|
||||||
|
import assert from "assert"
|
||||||
|
import execa from "execa"
|
||||||
|
|
||||||
export async function setupPython(version: string, setupDir: string, arch: string) {
|
export async function setupPython(version: string, setupDir: string, arch: string) {
|
||||||
if (ciDetect() !== "github-actions") {
|
if (ciDetect() !== "github-actions") {
|
||||||
|
@ -78,6 +82,52 @@ export async function setupPythonViaSystem(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let setupPythonAndPipTried = false
|
||||||
|
|
||||||
|
/// setup python and pip if needed
|
||||||
|
export async function setupPythonAndPip(): Promise<string> {
|
||||||
|
let foundPython: string
|
||||||
|
|
||||||
|
// install python
|
||||||
|
if (which.sync("python3", { nothrow: true }) !== null) {
|
||||||
|
foundPython = "python3"
|
||||||
|
} else if (which.sync("python", { nothrow: true }) !== null && (await isBinUptoDate("python", "3.0.0"))) {
|
||||||
|
foundPython = "python"
|
||||||
|
} else {
|
||||||
|
info("python3 was not found. Installing python")
|
||||||
|
await setupPython(getVersion("python", undefined), "", process.arch)
|
||||||
|
// try again
|
||||||
|
if (setupPythonAndPipTried) {
|
||||||
|
throw new Error("Failed to install python")
|
||||||
|
}
|
||||||
|
setupPythonAndPipTried = true
|
||||||
|
return setupPythonAndPip() // recurse
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(typeof foundPython === "string")
|
||||||
|
|
||||||
|
// install pip
|
||||||
|
if (process.platform === "win32") {
|
||||||
|
// downgrade pip on Windows
|
||||||
|
// https://github.com/pypa/pip/issues/10875#issuecomment-1030293005
|
||||||
|
execa.sync(foundPython, ["-m", "pip", "install", "-U", "pip==21.3.1"], { stdio: "inherit" })
|
||||||
|
} else if (process.platform === "linux") {
|
||||||
|
// ensure that pip is installed on Linux (happens when python is found but pip not installed)
|
||||||
|
if (isArch()) {
|
||||||
|
setupPacmanPack("python-pip")
|
||||||
|
} else if (hasDnf()) {
|
||||||
|
setupDnfPack("python3-pip")
|
||||||
|
} else if (isUbuntu()) {
|
||||||
|
await setupAptPack("python3-pip")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// install wheel (required for Conan, Meson, etc.)
|
||||||
|
execa.sync(foundPython, ["-m", "pip", "install", "-U", "wheel"], { stdio: "inherit" })
|
||||||
|
|
||||||
|
return foundPython
|
||||||
|
}
|
||||||
|
|
||||||
export async function addPythonBaseExecPrefix(python: string) {
|
export async function addPythonBaseExecPrefix(python: string) {
|
||||||
let dirs: string[] = []
|
let dirs: string[] = []
|
||||||
|
|
||||||
|
|
|
@ -1,60 +1,18 @@
|
||||||
/* eslint-disable require-atomic-updates */
|
/* eslint-disable require-atomic-updates */
|
||||||
import execa from "execa"
|
import execa from "execa"
|
||||||
import which from "which"
|
|
||||||
import { info } from "@actions/core"
|
import { info } from "@actions/core"
|
||||||
import { addPythonBaseExecPrefix, setupPython } from "../../python/python"
|
import { addPythonBaseExecPrefix, setupPythonAndPip } from "../../python/python"
|
||||||
import { isBinUptoDate } from "./version"
|
|
||||||
import { getVersion } from "../../versions/versions"
|
|
||||||
import { InstallationInfo } from "./setupBin"
|
import { InstallationInfo } from "./setupBin"
|
||||||
import { setupAptPack } from "./setupAptPack"
|
|
||||||
import { setupPacmanPack } from "./setupPacmanPack"
|
|
||||||
import { isArch } from "../env/isArch"
|
|
||||||
import { isUbuntu } from "../env/isUbuntu"
|
|
||||||
import { hasDnf } from "../env/hasDnf"
|
|
||||||
import { setupDnfPack } from "./setupDnfPack"
|
|
||||||
|
|
||||||
let python: string | undefined
|
let python: string | undefined
|
||||||
let binDir: string | undefined
|
let binDir: string | undefined
|
||||||
|
|
||||||
let tried = false
|
|
||||||
|
|
||||||
/** A function that installs a package using pip */
|
/** A function that installs a package using pip */
|
||||||
export async function setupPipPack(name: string, version?: string): Promise<InstallationInfo> {
|
export async function setupPipPack(name: string, version?: string): Promise<InstallationInfo> {
|
||||||
info(`Installing ${name} ${version ?? ""} via pip`)
|
info(`Installing ${name} ${version ?? ""} via pip`)
|
||||||
|
|
||||||
// setup python and pip if needed
|
|
||||||
if (python === undefined) {
|
if (python === undefined) {
|
||||||
if (which.sync("python3", { nothrow: true }) !== null) {
|
python = await setupPythonAndPip()
|
||||||
python = "python3"
|
|
||||||
} else if (which.sync("python", { nothrow: true }) !== null && (await isBinUptoDate("python", "3.0.0"))) {
|
|
||||||
python = "python"
|
|
||||||
} else {
|
|
||||||
info("python3 was not found. Installing python")
|
|
||||||
await setupPython(getVersion("python", undefined), "", process.arch)
|
|
||||||
// try again
|
|
||||||
if (tried) {
|
|
||||||
throw new Error("Failed to install python")
|
|
||||||
}
|
|
||||||
tried = true
|
|
||||||
return setupPipPack(name, version)
|
|
||||||
}
|
|
||||||
if (process.platform === "win32") {
|
|
||||||
// downgrade pip on Windows
|
|
||||||
// https://github.com/pypa/pip/issues/10875#issuecomment-1030293005
|
|
||||||
execa.sync(python, ["-m", "pip", "install", "-U", "pip==21.3.1"], { stdio: "inherit" })
|
|
||||||
} else if (process.platform === "linux") {
|
|
||||||
// ensure that pip is installed on Linux (happens when python is found but pip not installed)
|
|
||||||
if (isArch()) {
|
|
||||||
setupPacmanPack("python-pip")
|
|
||||||
} else if (hasDnf()) {
|
|
||||||
setupDnfPack("python3-pip")
|
|
||||||
} else if (isUbuntu()) {
|
|
||||||
await setupAptPack("python3-pip")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// install wheel (required for Conan, Meson, etc.)
|
|
||||||
execa.sync(python, ["-m", "pip", "install", "-U", "wheel"], { stdio: "inherit" })
|
|
||||||
}
|
}
|
||||||
|
|
||||||
execa.sync(python, ["-m", "pip", "install", version !== undefined && version !== "" ? `${name}==${version}` : name], {
|
execa.sync(python, ["-m", "pip", "install", version !== undefined && version !== "" ? `${name}==${version}` : name], {
|
||||||
|
|
Loading…
Reference in New Issue