Skip to content

Commit 6fcf55f

Browse files
authored
Merge pull request #217 from PyO3/find-rust-toolchain
Also find `rust-toolchain` file in parent directories
2 parents 3392822 + bdcb2cc commit 6fcf55f

File tree

2 files changed

+81
-47
lines changed

2 files changed

+81
-47
lines changed

dist/index.js

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11496,7 +11496,7 @@ function getRustTarget(args) {
1149611496
}
1149711497
return ((_c = TARGET_ALIASES[process.platform]) === null || _c === void 0 ? void 0 : _c[target]) || target;
1149811498
}
11499-
function getManifestDir(args) {
11499+
function getWorkingDirectory() {
1150011500
const workspace = process.env.GITHUB_WORKSPACE;
1150111501
let workdir = core.getInput('working-directory');
1150211502
if (workdir.length > 0) {
@@ -11505,6 +11505,10 @@ function getManifestDir(args) {
1150511505
else {
1150611506
workdir = workspace;
1150711507
}
11508+
return workdir;
11509+
}
11510+
function getManifestDir(args) {
11511+
const workdir = getWorkingDirectory();
1150811512
const manifestPath = getCliValue(args, '--manifest-path') || getCliValue(args, '-m');
1150911513
return manifestPath ? path.dirname(path.join(workdir, manifestPath)) : workdir;
1151011514
}
@@ -11518,21 +11522,37 @@ async function getRustToolchain(args) {
1151811522
if (rustToolchain.length > 0) {
1151911523
return rustToolchain;
1152011524
}
11525+
const root = process.env.GITHUB_WORKSPACE;
1152111526
const manifestDir = getManifestDir(args);
11522-
const rustToolchainToml = path.join(manifestDir, 'rust-toolchain.toml');
11523-
if ((0, fs_1.existsSync)(rustToolchainToml)) {
11524-
const content = await fs_1.promises.readFile(rustToolchainToml);
11525-
rustToolchain = parseRustToolchain(content.toString());
11526-
core.info(`Found Rust toolchain ${rustToolchain} in rust-toolchain.toml `);
11527-
}
11528-
else if ((0, fs_1.existsSync)(path.join(manifestDir, 'rust-toolchain'))) {
11529-
rustToolchain = (await fs_1.promises.readFile(path.join(manifestDir, 'rust-toolchain')))
11530-
.toString()
11531-
.trim();
11532-
if (rustToolchain.includes('[toolchain]')) {
11533-
rustToolchain = parseRustToolchain(rustToolchain);
11527+
let currentDir = manifestDir;
11528+
while (true) {
11529+
const toolchainToml = path.join(currentDir, 'rust-toolchain.toml');
11530+
const toolchain = path.join(currentDir, 'rust-toolchain');
11531+
if ((0, fs_1.existsSync)(toolchainToml)) {
11532+
const content = await fs_1.promises.readFile(toolchainToml);
11533+
rustToolchain = parseRustToolchain(content.toString());
11534+
core.info(`Found Rust toolchain ${rustToolchain} in rust-toolchain.toml `);
11535+
break;
1153411536
}
11535-
core.info(`Found Rust toolchain ${rustToolchain} in rust-toolchain `);
11537+
else {
11538+
core.debug(`${toolchainToml} doesn't exist`);
11539+
}
11540+
if ((0, fs_1.existsSync)(toolchain)) {
11541+
rustToolchain = (await fs_1.promises.readFile(toolchain)).toString().trim();
11542+
if (rustToolchain.includes('[toolchain]')) {
11543+
rustToolchain = parseRustToolchain(rustToolchain);
11544+
}
11545+
core.info(`Found Rust toolchain ${rustToolchain} in rust-toolchain `);
11546+
break;
11547+
}
11548+
else {
11549+
core.debug(`${toolchain} doesn't exist`);
11550+
}
11551+
if (currentDir === root) {
11552+
core.debug(`No rust-toolchain.toml or rust-toolchain found inside ${root}`);
11553+
break;
11554+
}
11555+
currentDir = path.dirname(currentDir);
1153611556
}
1153711557
return rustToolchain;
1153811558
}
@@ -11744,10 +11764,11 @@ async function dockerBuild(container, maturinRelease, args) {
1174411764
'echo "::group::Install Rust"',
1174511765
`which rustup > /dev/null || curl --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain ${rustToolchain}`,
1174611766
'export PATH="$HOME/.cargo/bin:$PATH"',
11767+
`echo "Install Rust toolchain ${rustToolchain}"`,
1174711768
`rustup override set ${rustToolchain}`,
1174811769
`rustup component add llvm-tools-preview || true`,
1174911770
'echo "::endgroup::"',
11750-
'export PATH="$PATH:/opt/python/cp37-cp37m/bin:/opt/python/cp38-cp38/bin:/opt/python/cp39-cp39/bin:/opt/python/cp310-cp310/bin:/opt/python/cp311-cp311/bin"',
11771+
'export PATH="$PATH:/opt/python/cp37-cp37m/bin:/opt/python/cp38-cp38/bin:/opt/python/cp39-cp39/bin:/opt/python/cp310-cp310/bin:/opt/python/cp311-cp311/bin:/opt/python/cp312-cp312/bin"',
1175111772
'echo "::group::Install maturin"',
1175211773
`curl -L ${url} | tar -xz -C /usr/local/bin`,
1175311774
'maturin --version || true',
@@ -11814,13 +11835,7 @@ async function dockerBuild(container, maturinRelease, args) {
1181411835
dockerEnvs.push(env);
1181511836
}
1181611837
}
11817-
let workdir = core.getInput('working-directory');
11818-
if (workdir.length > 0) {
11819-
workdir = path.join(workspace, workdir);
11820-
}
11821-
else {
11822-
workdir = workspace;
11823-
}
11838+
const workdir = getWorkingDirectory();
1182411839
const dockerVolumes = [];
1182511840
const ssh_auth_sock = process.env.SSH_AUTH_SOCK;
1182611841
if (ssh_auth_sock) {
@@ -11927,11 +11942,12 @@ async function hostBuild(maturinRelease, args) {
1192711942
const target = getRustTarget(args);
1192811943
const rustToolchain = await getRustToolchain(args);
1192911944
const rustupComponents = core.getInput('rustup-components');
11930-
const workdir = core.getInput('working-directory') || process.cwd();
11945+
const workdir = getWorkingDirectory();
1193111946
const sccache = core.getBooleanInput('sccache');
1193211947
const isUniversal2 = args.includes('--universal2') || target === 'universal2-apple-darwin';
1193311948
core.startGroup('Install Rust target');
1193411949
if (rustToolchain.length > 0) {
11950+
core.info(`Installing Rust toolchain ${rustToolchain}`);
1193511951
await exec.exec('rustup', ['override', 'set', rustToolchain]);
1193611952
await exec.exec('rustup', ['component', 'add', 'llvm-tools-preview'], {
1193711953
ignoreReturnCode: true

src/index.ts

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ function getRustTarget(args: string[]): string {
175175
return TARGET_ALIASES[process.platform]?.[target] || target
176176
}
177177

178-
function getManifestDir(args: string[]): string {
178+
function getWorkingDirectory(): string {
179179
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
180180
const workspace = process.env.GITHUB_WORKSPACE!
181181
let workdir = core.getInput('working-directory')
@@ -184,6 +184,11 @@ function getManifestDir(args: string[]): string {
184184
} else {
185185
workdir = workspace
186186
}
187+
return workdir
188+
}
189+
190+
function getManifestDir(args: string[]): string {
191+
const workdir = getWorkingDirectory()
187192
const manifestPath =
188193
getCliValue(args, '--manifest-path') || getCliValue(args, '-m')
189194
return manifestPath ? path.dirname(path.join(workdir, manifestPath)) : workdir
@@ -200,22 +205,39 @@ async function getRustToolchain(args: string[]): Promise<string> {
200205
if (rustToolchain.length > 0) {
201206
return rustToolchain
202207
}
208+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
209+
const root = process.env.GITHUB_WORKSPACE!
203210
const manifestDir = getManifestDir(args)
204-
const rustToolchainToml = path.join(manifestDir, 'rust-toolchain.toml')
205-
if (existsSync(rustToolchainToml)) {
206-
const content = await fs.readFile(rustToolchainToml)
207-
rustToolchain = parseRustToolchain(content.toString())
208-
core.info(`Found Rust toolchain ${rustToolchain} in rust-toolchain.toml `)
209-
} else if (existsSync(path.join(manifestDir, 'rust-toolchain'))) {
210-
rustToolchain = (
211-
await fs.readFile(path.join(manifestDir, 'rust-toolchain'))
212-
)
213-
.toString()
214-
.trim()
215-
if (rustToolchain.includes('[toolchain]')) {
216-
rustToolchain = parseRustToolchain(rustToolchain)
211+
let currentDir = manifestDir
212+
// eslint-disable-next-line no-constant-condition
213+
while (true) {
214+
const toolchainToml = path.join(currentDir, 'rust-toolchain.toml')
215+
const toolchain = path.join(currentDir, 'rust-toolchain')
216+
if (existsSync(toolchainToml)) {
217+
const content = await fs.readFile(toolchainToml)
218+
rustToolchain = parseRustToolchain(content.toString())
219+
core.info(`Found Rust toolchain ${rustToolchain} in rust-toolchain.toml `)
220+
break
221+
} else {
222+
core.debug(`${toolchainToml} doesn't exist`)
223+
}
224+
if (existsSync(toolchain)) {
225+
rustToolchain = (await fs.readFile(toolchain)).toString().trim()
226+
if (rustToolchain.includes('[toolchain]')) {
227+
rustToolchain = parseRustToolchain(rustToolchain)
228+
}
229+
core.info(`Found Rust toolchain ${rustToolchain} in rust-toolchain `)
230+
break
231+
} else {
232+
core.debug(`${toolchain} doesn't exist`)
217233
}
218-
core.info(`Found Rust toolchain ${rustToolchain} in rust-toolchain `)
234+
if (currentDir === root) {
235+
core.debug(
236+
`No rust-toolchain.toml or rust-toolchain found inside ${root}`
237+
)
238+
break
239+
}
240+
currentDir = path.dirname(currentDir)
219241
}
220242
return rustToolchain
221243
}
@@ -494,11 +516,12 @@ async function dockerBuild(
494516
'echo "::group::Install Rust"',
495517
`which rustup > /dev/null || curl --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain ${rustToolchain}`,
496518
'export PATH="$HOME/.cargo/bin:$PATH"',
519+
`echo "Install Rust toolchain ${rustToolchain}"`,
497520
`rustup override set ${rustToolchain}`,
498521
`rustup component add llvm-tools-preview || true`,
499522
'echo "::endgroup::"',
500523
// Add all supported python versions to PATH
501-
'export PATH="$PATH:/opt/python/cp37-cp37m/bin:/opt/python/cp38-cp38/bin:/opt/python/cp39-cp39/bin:/opt/python/cp310-cp310/bin:/opt/python/cp311-cp311/bin"',
524+
'export PATH="$PATH:/opt/python/cp37-cp37m/bin:/opt/python/cp38-cp38/bin:/opt/python/cp39-cp39/bin:/opt/python/cp310-cp310/bin:/opt/python/cp311-cp311/bin:/opt/python/cp312-cp312/bin"',
502525
// Install maturin
503526
'echo "::group::Install maturin"',
504527
`curl -L ${url} | tar -xz -C /usr/local/bin`,
@@ -601,13 +624,7 @@ async function dockerBuild(
601624
}
602625
}
603626

604-
let workdir = core.getInput('working-directory')
605-
if (workdir.length > 0) {
606-
workdir = path.join(workspace, workdir)
607-
} else {
608-
workdir = workspace
609-
}
610-
627+
const workdir = getWorkingDirectory()
611628
const dockerVolumes = []
612629

613630
// forward ssh agent
@@ -744,13 +761,14 @@ async function hostBuild(
744761
const target = getRustTarget(args)
745762
const rustToolchain = await getRustToolchain(args)
746763
const rustupComponents = core.getInput('rustup-components')
747-
const workdir = core.getInput('working-directory') || process.cwd()
764+
const workdir = getWorkingDirectory()
748765
const sccache = core.getBooleanInput('sccache')
749766
const isUniversal2 =
750767
args.includes('--universal2') || target === 'universal2-apple-darwin'
751768

752769
core.startGroup('Install Rust target')
753770
if (rustToolchain.length > 0) {
771+
core.info(`Installing Rust toolchain ${rustToolchain}`)
754772
await exec.exec('rustup', ['override', 'set', rustToolchain])
755773
await exec.exec('rustup', ['component', 'add', 'llvm-tools-preview'], {
756774
ignoreReturnCode: true

0 commit comments

Comments
 (0)