Unnamed repository; edit this file 'description' to name the repository.
Fix new-project log handling
Point the new project failure flow at the extension logs and make the
log-opening command available when the language server is not running.
Also add tests for the env-aware cargo path resolution path introduced
for project creation.
| -rw-r--r-- | editors/code/src/new_project.ts | 6 | ||||
| -rw-r--r-- | editors/code/src/util.ts | 6 | ||||
| -rw-r--r-- | editors/code/tests/unit/launch_config.test.ts | 44 |
3 files changed, 51 insertions, 5 deletions
diff --git a/editors/code/src/new_project.ts b/editors/code/src/new_project.ts index da3181ea3e..f5f6d86da0 100644 --- a/editors/code/src/new_project.ts +++ b/editors/code/src/new_project.ts @@ -228,10 +228,10 @@ async function showNewProjectError( } const selection = await vscode.window.showErrorMessage( details ? `${message}\n${details}` : message, - "Open Logs", + "Open Extension Logs", ); - if (selection === "Open Logs") { - await vscode.commands.executeCommand("rust-analyzer.openLogs"); + if (selection === "Open Extension Logs") { + log.show(); } } diff --git a/editors/code/src/util.ts b/editors/code/src/util.ts index 05b475080c..ddeec814b4 100644 --- a/editors/code/src/util.ts +++ b/editors/code/src/util.ts @@ -22,6 +22,10 @@ class Log { log: true, }); + show(): void { + this.output.show(true); + } + trace(...messages: [unknown, ...unknown[]]): void { this.output.trace(this.stringify(messages)); } @@ -40,7 +44,7 @@ class Log { error(...messages: [unknown, ...unknown[]]): void { this.output.error(this.stringify(messages)); - this.output.show(true); + this.show(); } private stringify(messages: unknown[]): string { diff --git a/editors/code/tests/unit/launch_config.test.ts b/editors/code/tests/unit/launch_config.test.ts index eeb8608a42..69be84dcea 100644 --- a/editors/code/tests/unit/launch_config.test.ts +++ b/editors/code/tests/unit/launch_config.test.ts @@ -1,5 +1,8 @@ import * as assert from "assert"; -import { Cargo } from "../../src/toolchain"; +import * as os from "os"; +import * as path from "path"; +import { mkdtemp, mkdir, rm, writeFile } from "fs/promises"; +import { Cargo, cargoPath } from "../../src/toolchain"; import type { Context } from "."; export async function getTests(ctx: Context) { @@ -96,4 +99,43 @@ export async function getTests(ctx: Context) { assert.notDeepStrictEqual(args.filter, undefined); }); }); + + await ctx.suite("Toolchain resolution", (suite) => { + suite.addTest("prefers explicit CARGO from provided env", async () => { + const explicitCargo = path.join(os.tmpdir(), "custom-cargo"); + assert.strictEqual(await cargoPath({ CARGO: explicitCargo }), explicitCargo); + }); + + suite.addTest("resolves cargo from provided PATH", async () => { + const tempDir = await mkdtemp(path.join(os.tmpdir(), "ra-cargo-path-")); + try { + const cargoBinary = path.join(tempDir, process.platform === "win32" ? "cargo.exe" : "cargo"); + await writeFile(cargoBinary, ""); + + assert.strictEqual(await cargoPath({ PATH: tempDir }), "cargo"); + } finally { + await rm(tempDir, { recursive: true, force: true }); + } + }); + + suite.addTest("resolves cargo from provided CARGO_HOME", async () => { + const cargoHome = await mkdtemp(path.join(os.tmpdir(), "ra-cargo-home-")); + try { + const binDir = path.join(cargoHome, "bin"); + await mkdir(binDir); + const cargoBinary = path.join( + binDir, + process.platform === "win32" ? "cargo.exe" : "cargo", + ); + await writeFile(cargoBinary, ""); + + assert.strictEqual( + await cargoPath({ PATH: "", CARGO_HOME: cargoHome }), + cargoBinary, + ); + } finally { + await rm(cargoHome, { recursive: true, force: true }); + } + }); + }); } |