From 73e08126a1e02e4d0be921c3666d2d16cf4596a4 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Mon, 25 Nov 2024 12:13:20 -0800 Subject: [PATCH 1/4] Redirect view logs action to open the terminal instead of output channel --- packages/core/src/shared/sam/build.ts | 11 +++++++++-- packages/core/src/shared/sam/processTerminal.ts | 5 +++-- packages/core/src/shared/sam/utils.ts | 8 ++++++++ packages/core/src/shared/utilities/logAndShowUtils.ts | 7 +++++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/core/src/shared/sam/build.ts b/packages/core/src/shared/sam/build.ts index f07f0a94a5a..233c6f6d7ae 100644 --- a/packages/core/src/shared/sam/build.ts +++ b/packages/core/src/shared/sam/build.ts @@ -19,7 +19,14 @@ import globals from '../extensionGlobals' import { TreeNode } from '../treeview/resourceTreeDataProvider' import { telemetry } from '../telemetry/telemetry' import { getSpawnEnv } from '../env/resolveEnv' -import { getErrorCode, getProjectRoot, getSamCliPathAndVersion, isDotnetRuntime, updateRecentResponse } from './utils' +import { + getErrorCode, + getProjectRoot, + getSamCliPathAndVersion, + getTerminalFromError, + isDotnetRuntime, + updateRecentResponse, +} from './utils' import { getConfigFileUri, validateSamBuildConfig } from './config' import { runInTerminal } from './processTerminal' @@ -240,7 +247,7 @@ export async function runBuild(arg?: TreeNode): Promise { } } catch (error) { throw ToolkitError.chain(error, 'Failed to build SAM template', { - details: { ...resolveBuildArgConflict(buildFlags) }, + details: { terminal: getTerminalFromError(error), ...resolveBuildArgConflict(buildFlags) }, code: getErrorCode(error), }) } diff --git a/packages/core/src/shared/sam/processTerminal.ts b/packages/core/src/shared/sam/processTerminal.ts index 70b7682ce1b..da21b0a43a6 100644 --- a/packages/core/src/shared/sam/processTerminal.ts +++ b/packages/core/src/shared/sam/processTerminal.ts @@ -16,7 +16,7 @@ import { throwIfErrorMatches } from './utils' let oldTerminal: ProcessTerminal | undefined export async function runInTerminal(proc: ChildProcess, cmd: string) { - const handleResult = (result?: ChildProcessResult) => { + const handleResult = (result?: ChildProcessResult, terminal?: vscode.Terminal) => { if (result && result.exitCode !== 0) { throwIfErrorMatches(result) @@ -24,6 +24,7 @@ export async function runInTerminal(proc: ChildProcess, cmd: string) { const defaultMessage = `sam ${cmd} exited with a non-zero exit code: ${result.exitCode}` throw ToolkitError.chain(result.error, defaultMessage, { code: 'NonZeroExitCode', + details: { terminal: terminal }, }) } } @@ -56,7 +57,7 @@ export async function runInTerminal(proc: ChildProcess, cmd: string) { ? ToolkitError.chain(result.error, 'SAM CLI was cancelled before exiting', { cancelled: true }) : new CancellationError('user') } else { - return handleResult(result) + return handleResult(result, terminal) } } diff --git a/packages/core/src/shared/sam/utils.ts b/packages/core/src/shared/sam/utils.ts index 336f1b44742..6fb62b6615c 100644 --- a/packages/core/src/shared/sam/utils.ts +++ b/packages/core/src/shared/sam/utils.ts @@ -132,6 +132,14 @@ export function throwIfErrorMatches(result: ChildProcessResult) { } } +export function getTerminalFromError(error: any): vscode.Terminal { + if (error instanceof ToolkitError) { + error.details?.['terminal'] as unknown as vscode.Terminal + } + + return vscode.window.activeTerminal as vscode.Terminal +} + export enum SamCliErrorTypes { DockerUnreachable = 'Docker is unreachable.', ResolveS3AndS3Set = 'Cannot use both --resolve-s3 and --s3-bucket parameters in non-guided deployments.', diff --git a/packages/core/src/shared/utilities/logAndShowUtils.ts b/packages/core/src/shared/utilities/logAndShowUtils.ts index f11ade2e686..35339dd843c 100644 --- a/packages/core/src/shared/utilities/logAndShowUtils.ts +++ b/packages/core/src/shared/utilities/logAndShowUtils.ts @@ -32,11 +32,18 @@ export async function logAndShowError( return } const logsItem = localize('AWS.generic.message.viewLogs', 'View Logs...') + const viewInTerminalItem = localize('AWS.generic.message.viewInTerminal', 'View Logs In Terminal') const logId = getLogger().error(`${topic}: %s`, error) const message = resolveErrorMessageToDisplay(error, defaultMessage) if (error instanceof ToolkitError && error.documentationUri) { await showMessageWithUrl(message, error.documentationUri, 'View Documentation', 'error') + } else if (error instanceof ToolkitError && (error.details?.['terminal'] as unknown as vscode.Terminal)) { + await vscode.window.showErrorMessage(message, viewInTerminalItem).then(async (resp) => { + if (resp === viewInTerminalItem) { + ;(error.details?.['terminal'] as unknown as vscode.Terminal).show() + } + }) } else { await vscode.window.showErrorMessage(message, logsItem).then(async (resp) => { if (resp === logsItem) { From 84c0e18b510625c5f1032d6d99bd01c41678b08a Mon Sep 17 00:00:00 2001 From: mbfreder Date: Mon, 25 Nov 2024 12:51:44 -0800 Subject: [PATCH 2/4] update test --- packages/core/src/test/shared/sam/build.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/core/src/test/shared/sam/build.test.ts b/packages/core/src/test/shared/sam/build.test.ts index 8698691be5b..a6371707256 100644 --- a/packages/core/src/test/shared/sam/build.test.ts +++ b/packages/core/src/test/shared/sam/build.test.ts @@ -515,7 +515,9 @@ describe('SAM runBuild', () => { } }) - it('should throw ToolkitError when sync command fail', async () => { + it('should throw ToolkitError when build command fail', async () => { + getTestWindow().onDidShowMessage((m) => m.items.find((i) => i.title === 'View Logs In Terminal')?.select()) + const prompterTester = PrompterTester.init() .handleQuickPick('Specify parameter source for build', async (quickPick) => { await quickPick.untilReady() @@ -544,6 +546,8 @@ describe('SAM runBuild', () => { } catch (error: any) { assert(error instanceof ToolkitError) assert.strictEqual(error.message, 'Failed to build SAM template') + assert(error.details?.['terminal'] as unknown as vscode.Terminal) + assert.strictEqual((error.details?.['terminal'] as unknown as vscode.Terminal).name, 'SAM build') } prompterTester.assertCallAll() }) From 53448de444db643e813b64a5001cbfc185ec067e Mon Sep 17 00:00:00 2001 From: mbfreder Date: Wed, 27 Nov 2024 01:12:09 -0800 Subject: [PATCH 3/4] fix merge errors --- packages/core/src/shared/sam/processTerminal.ts | 2 +- packages/core/src/shared/sam/utils.ts | 10 ++++------ packages/core/src/test/shared/sam/build.test.ts | 4 +--- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/core/src/shared/sam/processTerminal.ts b/packages/core/src/shared/sam/processTerminal.ts index da21b0a43a6..1482db35d81 100644 --- a/packages/core/src/shared/sam/processTerminal.ts +++ b/packages/core/src/shared/sam/processTerminal.ts @@ -18,7 +18,7 @@ let oldTerminal: ProcessTerminal | undefined export async function runInTerminal(proc: ChildProcess, cmd: string) { const handleResult = (result?: ChildProcessResult, terminal?: vscode.Terminal) => { if (result && result.exitCode !== 0) { - throwIfErrorMatches(result) + throwIfErrorMatches(result, terminal) // If no specific error matched, throw the default non-zero exit code error. const defaultMessage = `sam ${cmd} exited with a non-zero exit code: ${result.exitCode}` diff --git a/packages/core/src/shared/sam/utils.ts b/packages/core/src/shared/sam/utils.ts index 6fb62b6615c..b6da18e9055 100644 --- a/packages/core/src/shared/sam/utils.ts +++ b/packages/core/src/shared/sam/utils.ts @@ -121,23 +121,21 @@ export function getErrorCode(error: unknown): string | undefined { return error instanceof ToolkitError ? error.code : undefined } -export function throwIfErrorMatches(result: ChildProcessResult) { +export function throwIfErrorMatches(result: ChildProcessResult, terminal?: vscode.Terminal) { const errorMessage = getSamCliErrorMessage(result.stderr) for (const errorType in SamCliErrorTypes) { if (errorMessage.includes(SamCliErrorTypes[errorType as keyof typeof SamCliErrorTypes])) { throw ToolkitError.chain(result.error, errorMessage, { code: errorType, + details: { terminal: terminal }, }) } } } export function getTerminalFromError(error: any): vscode.Terminal { - if (error instanceof ToolkitError) { - error.details?.['terminal'] as unknown as vscode.Terminal - } - - return vscode.window.activeTerminal as vscode.Terminal + return error.details?.['terminal'] as unknown as vscode.Terminal + //return vscode.window.activeTerminal as vscode.Terminal } export enum SamCliErrorTypes { diff --git a/packages/core/src/test/shared/sam/build.test.ts b/packages/core/src/test/shared/sam/build.test.ts index a6371707256..4375f792987 100644 --- a/packages/core/src/test/shared/sam/build.test.ts +++ b/packages/core/src/test/shared/sam/build.test.ts @@ -516,8 +516,6 @@ describe('SAM runBuild', () => { }) it('should throw ToolkitError when build command fail', async () => { - getTestWindow().onDidShowMessage((m) => m.items.find((i) => i.title === 'View Logs In Terminal')?.select()) - const prompterTester = PrompterTester.init() .handleQuickPick('Specify parameter source for build', async (quickPick) => { await quickPick.untilReady() @@ -534,7 +532,7 @@ describe('SAM runBuild', () => { value: sandbox.stub().resolves({ exitCode: -1, stdout: 'Mock build command execution failure', - stderr: '', + stderr: 'Docker is unreachable.', }), }, }) From c1cc58c5141e21083f4b9eff99f53b9d51fc6736 Mon Sep 17 00:00:00 2001 From: mbfreder Date: Wed, 27 Nov 2024 01:20:23 -0800 Subject: [PATCH 4/4] add changelog --- .../Bug Fix-85d04649-0aaa-4e00-8b6f-1c6885012932.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 packages/toolkit/.changes/next-release/Bug Fix-85d04649-0aaa-4e00-8b6f-1c6885012932.json diff --git a/packages/toolkit/.changes/next-release/Bug Fix-85d04649-0aaa-4e00-8b6f-1c6885012932.json b/packages/toolkit/.changes/next-release/Bug Fix-85d04649-0aaa-4e00-8b6f-1c6885012932.json new file mode 100644 index 00000000000..b151fa47d73 --- /dev/null +++ b/packages/toolkit/.changes/next-release/Bug Fix-85d04649-0aaa-4e00-8b6f-1c6885012932.json @@ -0,0 +1,4 @@ +{ + "type": "Bug Fix", + "description": "'View Logs...' action redirects to output channel instead of Terminal" +}