From 73148fb3281384190d1770355eaee11b7dba651b Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Wed, 10 Mar 2021 13:24:27 +0100 Subject: [PATCH] ATL-653: Added error handling for core/lib install Signed-off-by: Akos Kitta --- .../component-list/filterable-list-container.tsx | 14 ++++++++++++++ .../browser/widgets/component-list/list-widget.tsx | 12 +++++++++++- .../src/node/boards-service-impl.ts | 6 +++++- .../src/node/library-service-server-impl.ts | 6 +++++- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx index ac20dda8e..35b943096 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx @@ -1,6 +1,9 @@ import * as React from 'react'; import debounce = require('lodash.debounce'); import { Event } from '@theia/core/lib/common/event'; +import { CommandService } from '@theia/core/lib/common/command'; +import { MessageService } from '@theia/core/lib/common/message-service'; +import { OutputCommands } from '@theia/output/lib/browser/output-commands'; import { ConfirmDialog } from '@theia/core/lib/browser/dialogs'; import { Searchable } from '../../../common/protocol/searchable'; import { Installable } from '../../../common/protocol/installable'; @@ -85,9 +88,13 @@ export class FilterableListContainer extends React.C const dialog = new InstallationProgressDialog(itemLabel(item), version); try { dialog.open(); + await this.clearArduinoChannel(); await install({ item, version }); const items = await searchable.search({ query: this.state.filterText }); this.setState({ items: this.sort(items) }); + } catch (error) { + this.props.messageService.error(error instanceof Error ? error.message : String(error)); + throw error; } finally { dialog.close(); } @@ -106,6 +113,7 @@ export class FilterableListContainer extends React.C const { uninstall, searchable, itemLabel } = this.props; const dialog = new UninstallationProgressDialog(itemLabel(item)); try { + await this.clearArduinoChannel(); dialog.open(); await uninstall({ item }); const items = await searchable.search({ query: this.state.filterText }); @@ -115,6 +123,10 @@ export class FilterableListContainer extends React.C } } + private async clearArduinoChannel(): Promise { + return this.props.commandService.executeCommand(OutputCommands.CLEAR.id, { name: 'Arduino' }); + } + } export namespace FilterableListContainer { @@ -129,6 +141,8 @@ export namespace FilterableListContainer { readonly filterTextChangeEvent: Event; readonly install: ({ item, version }: { item: T, version: Installable.Version }) => Promise; readonly uninstall: ({ item }: { item: T }) => Promise; + readonly messageService: MessageService; + readonly commandService: CommandService; } export interface State { diff --git a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx index 4311f1d46..1c4baabe9 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx @@ -5,6 +5,8 @@ import { Deferred } from '@theia/core/lib/common/promise-util'; import { Emitter } from '@theia/core/lib/common/event'; import { MaybePromise } from '@theia/core/lib/common/types'; import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget'; +import { CommandService } from '@theia/core/lib/common/command'; +import { MessageService } from '@theia/core/lib/common/message-service'; import { Installable } from '../../../common/protocol/installable'; import { Searchable } from '../../../common/protocol/searchable'; import { ArduinoComponent } from '../../../common/protocol/arduino-component'; @@ -15,6 +17,12 @@ import { NotificationCenter } from '../../notification-center'; @injectable() export abstract class ListWidget extends ReactWidget { + @inject(MessageService) + protected readonly messageService: MessageService; + + @inject(CommandService) + protected readonly commandService: CommandService; + @inject(NotificationCenter) protected readonly notificationCenter: NotificationCenter; @@ -87,7 +95,9 @@ export abstract class ListWidget extends ReactWidget uninstall={this.uninstall.bind(this)} itemLabel={this.options.itemLabel} itemRenderer={this.options.itemRenderer} - filterTextChangeEvent={this.filterTextChangeEmitter.event} />; + filterTextChangeEvent={this.filterTextChangeEmitter.event} + messageService={this.messageService} + commandService={this.commandService} />; } /** diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index a354a4878..dddd76a48 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -254,7 +254,11 @@ export class BoardsServiceImpl extends CoreClientAware implements BoardsService }); await new Promise((resolve, reject) => { resp.on('end', resolve); - resp.on('error', reject); + resp.on('error', error => { + this.outputService.append({ chunk: `Failed to install platform: ${item.id}.\n` }); + this.outputService.append({ chunk: error.toString() }); + reject(error); + }); }); const items = await this.search({}); diff --git a/arduino-ide-extension/src/node/library-service-server-impl.ts b/arduino-ide-extension/src/node/library-service-server-impl.ts index da8a6f530..794d8dfaf 100644 --- a/arduino-ide-extension/src/node/library-service-server-impl.ts +++ b/arduino-ide-extension/src/node/library-service-server-impl.ts @@ -183,7 +183,11 @@ export class LibraryServiceImpl extends CoreClientAware implements LibraryServic }); await new Promise((resolve, reject) => { resp.on('end', resolve); - resp.on('error', reject); + resp.on('error', error => { + this.outputService.append({ chunk: `Failed to install library: ${item.name}${version ? `:${version}` : ''}.\n` }); + this.outputService.append({ chunk: error.toString() }); + reject(error); + }); }); const items = await this.search({});