Skip to content

Commit 15f3a89

Browse files
committed
feat: find brew package installation dir
1 parent c99abc9 commit 15f3a89

File tree

8 files changed

+107
-12
lines changed

8 files changed

+107
-12
lines changed

dist/legacy/setup-cpp.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/legacy/setup-cpp.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/modern/setup-cpp.mjs

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

dist/modern/setup-cpp.mjs.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/setup-brew/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "setup-brew",
3-
"version": "1.0.2",
3+
"version": "1.1.0",
44
"description": "Setup brew and brew packages",
55
"repository": "https://github.com/aminya/setup-cpp",
66
"homepage": "https://github.com/aminya/setup-cpp/tree/master/packages/setup-brew",

packages/setup-brew/src/install-pack.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { join } from "path"
2-
import { info } from "ci-log"
2+
import { info, warning } from "ci-log"
33
import { execaSync } from "execa"
44
import which from "which"
55
import type { InstallationInfo } from "./InstallationInfo.js"
66
import type { BrewPackOptions } from "./install-pack-options.js"
7-
import { getBrewBinDir, setupBrew } from "./install.js"
7+
import { getBrewBinDir, getBrewBinPath, setupBrew } from "./install.js"
8+
import { brewPackInstallDir, brewPackNameAndVersion } from "./pack-install-dir.js"
89

910
/* eslint-disable require-atomic-updates */
1011
let hasBrew = false
@@ -36,14 +37,13 @@ export async function installBrewPack(
3637
hasBrew = true
3738
}
3839

39-
const binDir = getBrewBinDir()
40-
const brewPath = join(binDir, "brew")
40+
const brewPath = getBrewBinPath()
4141

42-
// Args
4342
const args = [
4443
"install",
45-
(version !== undefined && version !== "") ? `${name}@${version}` : name,
44+
brewPackNameAndVersion(name, version),
4645
]
46+
4747
// Add options to args
4848
for (const [key, value] of Object.entries(options)) {
4949
if (typeof value === "boolean" && value) {
@@ -56,5 +56,12 @@ export async function installBrewPack(
5656
// brew is not thread-safe
5757
execaSync(brewPath, args, { stdio: "inherit" })
5858

59-
return { binDir }
59+
const installDir = await brewPackInstallDir(name, version)
60+
61+
if (installDir === undefined) {
62+
warning(`Failed to find installation directory for ${name} ${version}`)
63+
return { binDir: getBrewBinDir(), installDir: undefined }
64+
}
65+
66+
return { installDir, binDir: join(installDir, "bin") }
6067
}

packages/setup-brew/src/install.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ export function getBrewBinDir() {
7474
return join(getBrewDir(), "bin")
7575
}
7676

77+
export function getBrewBinPath() {
78+
return join(getBrewBinDir(), "brew")
79+
}
80+
7781
/**
7882
* Get the path where brew is installed
7983
* @returns {string} The path where brew is installed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import { existsSync } from "fs"
2+
import { join } from "path"
3+
import { execa } from "execa"
4+
import { getBrewBinPath, getBrewDir } from "./install.js"
5+
6+
export function brewPackNameAndVersion(name: string, version: string | undefined) {
7+
return (version !== undefined && version !== "") ? `${name}@${version}` : name
8+
}
9+
10+
/**
11+
* Get the installation directory of a package
12+
* @param name The name of the package
13+
* @param nameAndVersion The name and version of the package
14+
* @returns The installation directory of the package
15+
*/
16+
17+
export async function brewPackInstallDir(name: string, version: string | undefined) {
18+
const nameAndVersion = brewPackNameAndVersion(name, version)
19+
20+
// first try with --prefix
21+
const nameAndVersionPrefix = await getBrewPackPrefix(nameAndVersion)
22+
if (nameAndVersionPrefix !== undefined) {
23+
return nameAndVersionPrefix
24+
}
25+
26+
// try with --prefix name
27+
const namePrefix = await getBrewPackPrefix(name)
28+
if (namePrefix !== undefined) {
29+
return namePrefix
30+
}
31+
32+
// if that fails, try with searchInstallDir
33+
return searchInstallDir(name, nameAndVersion)
34+
}
35+
36+
async function getBrewPackPrefix(packArg: string) {
37+
try {
38+
const brewPath = getBrewBinPath()
39+
return (await execa(brewPath, ["--prefix", packArg], { stdio: ["pipe", "inherit", "inherit"] })).stdout
40+
} catch {
41+
return undefined
42+
}
43+
}
44+
/**
45+
* Searches for the installation directory of a package
46+
* @param name The name of the package
47+
* @param nameAndVersion The name and version of the package
48+
* @returns The installation directory of the package
49+
*/
50+
function searchInstallDir(name: string, nameAndVersion: string) {
51+
const brewDir = getBrewDir()
52+
53+
// Check in opt directory (most common location)
54+
const nameAndVersionOptDir = join(brewDir, "opt", nameAndVersion)
55+
if (existsSync(nameAndVersionOptDir)) {
56+
return nameAndVersionOptDir
57+
}
58+
const nameOptDir = join(brewDir, "opt", name)
59+
if (existsSync(nameOptDir)) {
60+
return nameOptDir
61+
}
62+
63+
// Check in Cellar (where casks and some formulae are installed)
64+
const nameAndVersionCellarDir = join(brewDir, "Cellar", nameAndVersion)
65+
if (existsSync(nameAndVersionCellarDir)) {
66+
return nameAndVersionCellarDir
67+
}
68+
const nameCellarDir = join(brewDir, "Cellar", name)
69+
if (existsSync(nameCellarDir)) {
70+
return nameCellarDir
71+
}
72+
73+
// Check in lib directory
74+
const nameAndVersionLibDir = join(brewDir, "lib", nameAndVersion)
75+
if (existsSync(nameAndVersionLibDir)) {
76+
return nameAndVersionLibDir
77+
}
78+
const nameLibDir = join(brewDir, "lib", name)
79+
if (existsSync(nameLibDir)) {
80+
return nameLibDir
81+
}
82+
83+
return undefined
84+
}

0 commit comments

Comments
 (0)