mirror of https://github.com/aminya/setup-cpp
fix: add system package manager fallback for pip packages
This commit is contained in:
parent
0916dc5cfb
commit
42d3ea447e
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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -21,7 +21,7 @@ import { isBinUptoDate } from "../utils/setup/version"
|
|||
import { unique } from "../utils/std"
|
||||
import { MinVersions } from "../versions/default_versions"
|
||||
import { pathExists } from "path-exists"
|
||||
import { hasPipx, setupPipPackWithPython } from "../utils/setup/setupPipPack"
|
||||
import { hasPipx, setupPipPackSystem, setupPipPackWithPython } from "../utils/setup/setupPipPack"
|
||||
|
||||
export async function setupPython(version: string, setupDir: string, arch: string): Promise<InstallationInfo> {
|
||||
const installInfo = await findOrSetupPython(version, setupDir, arch)
|
||||
|
@ -44,19 +44,7 @@ export async function setupPython(version: string, setupDir: string, arch: strin
|
|||
async function setupPipx(foundPython: string) {
|
||||
try {
|
||||
if (!(await hasPipx(foundPython))) {
|
||||
try {
|
||||
await setupPipPackWithPython(foundPython, "pipx", undefined, { upgrade: true, usePipx: false })
|
||||
} catch (err) {
|
||||
if (isUbuntu()) {
|
||||
await setupAptPack([{ name: "python3-pipx" }])
|
||||
} else if (isArch()) {
|
||||
await setupPacmanPack("python-pipx")
|
||||
} else if (hasDnf()) {
|
||||
await setupDnfPack([{ name: "python3-pipx" }])
|
||||
} else {
|
||||
throw err
|
||||
}
|
||||
}
|
||||
}
|
||||
await execa(foundPython, ["-m", "pipx", "ensurepath"], { stdio: "inherit" })
|
||||
} catch (err) {
|
||||
|
@ -236,7 +224,9 @@ async function isPipUptoDate(pip: string) {
|
|||
async function setupPip(foundPython: string) {
|
||||
const upgraded = await ensurePipUpgrade(foundPython)
|
||||
if (!upgraded) {
|
||||
await setupPipSystem()
|
||||
// ensure that pip is installed on Linux (happens when python is found but pip not installed)
|
||||
await setupPipPackSystem("pip")
|
||||
|
||||
// upgrade pip
|
||||
await ensurePipUpgrade(foundPython)
|
||||
}
|
||||
|
@ -261,20 +251,6 @@ async function ensurePipUpgrade(foundPython: string) {
|
|||
return false
|
||||
}
|
||||
|
||||
function setupPipSystem() {
|
||||
if (process.platform === "linux") {
|
||||
// ensure that pip is installed on Linux (happens when python is found but pip not installed)
|
||||
if (isArch()) {
|
||||
return setupPacmanPack("python-pip")
|
||||
} else if (hasDnf()) {
|
||||
return setupDnfPack([{ name: "python3-pip" }])
|
||||
} else if (isUbuntu()) {
|
||||
return setupAptPack([{ name: "python3-pip" }])
|
||||
}
|
||||
}
|
||||
throw new Error(`Could not install pip on ${process.platform}`)
|
||||
}
|
||||
|
||||
async function addPythonBaseExecPrefix_raw(python: string) {
|
||||
const dirs: string[] = []
|
||||
|
||||
|
|
|
@ -9,6 +9,12 @@ import { InstallationInfo } from "./setupBin"
|
|||
import { getVersion } from "../../versions/versions"
|
||||
import { ubuntuVersion } from "../env/ubuntu_version"
|
||||
import memoize from "micro-memoize"
|
||||
import { isArch } from "../env/isArch"
|
||||
import { setupPacmanPack } from "./setupPacmanPack"
|
||||
import { hasDnf } from "../env/hasDnf"
|
||||
import { setupDnfPack } from "./setupDnfPack"
|
||||
import { isUbuntu } from "../env/isUbuntu"
|
||||
import { setupAptPack } from "./setupAptPack"
|
||||
|
||||
export type SetupPipPackOptions = {
|
||||
/** Whether to use pipx instead of pip */
|
||||
|
@ -43,6 +49,7 @@ export async function setupPipPackWithPython(
|
|||
|
||||
info(`Installing ${name} ${version ?? ""} via ${pip}`)
|
||||
|
||||
try {
|
||||
const nameAndVersion = version !== undefined && version !== "" ? `${name}==${version}` : name
|
||||
const upgradeFlag = upgrade ? (isPipx ? ["upgrade"] : ["install", "--upgrade"]) : ["install"]
|
||||
const userFlag = !isPipx && user ? ["--user"] : []
|
||||
|
@ -50,6 +57,11 @@ export async function setupPipPackWithPython(
|
|||
execaSync(givenPython, ["-m", pip, ...upgradeFlag, ...userFlag, nameAndVersion], {
|
||||
stdio: "inherit",
|
||||
})
|
||||
} catch (err) {
|
||||
if ((await setupPipPackSystem(name)) === null) {
|
||||
throw new Error(`Failed to install ${name} via ${pip} ${err}`)
|
||||
}
|
||||
}
|
||||
|
||||
const execPaths = await addPythonBaseExecPrefix(givenPython)
|
||||
const binDir = await findBinDir(execPaths, name)
|
||||
|
@ -87,3 +99,16 @@ async function findBinDir(dirs: string[], name: string) {
|
|||
|
||||
return dirs[dirs.length - 1]
|
||||
}
|
||||
|
||||
export function setupPipPackSystem(name: string) {
|
||||
if (process.platform === "linux") {
|
||||
if (isArch()) {
|
||||
return setupPacmanPack(`python-${name}`)
|
||||
} else if (hasDnf()) {
|
||||
return setupDnfPack([{ name: `python3-${name}` }])
|
||||
} else if (isUbuntu()) {
|
||||
return setupAptPack([{ name: `python3-${name}` }])
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue