ATL-653: Added error handling for core/lib install

Signed-off-by: Akos Kitta <kittaakos@typefox.io>
This commit is contained in:
Akos Kitta 2021-03-10 13:24:27 +01:00 committed by Akos Kitta
parent c64ac48fe3
commit eadc993854
4 changed files with 35 additions and 3 deletions

View File

@ -1,6 +1,9 @@
import * as React from 'react'; import * as React from 'react';
import debounce = require('lodash.debounce'); import debounce = require('lodash.debounce');
import { Event } from '@theia/core/lib/common/event'; 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 { ConfirmDialog } from '@theia/core/lib/browser/dialogs';
import { Searchable } from '../../../common/protocol/searchable'; import { Searchable } from '../../../common/protocol/searchable';
import { Installable } from '../../../common/protocol/installable'; import { Installable } from '../../../common/protocol/installable';
@ -85,9 +88,13 @@ export class FilterableListContainer<T extends ArduinoComponent> extends React.C
const dialog = new InstallationProgressDialog(itemLabel(item), version); const dialog = new InstallationProgressDialog(itemLabel(item), version);
try { try {
dialog.open(); dialog.open();
await this.clearArduinoChannel();
await install({ item, version }); await install({ item, version });
const items = await searchable.search({ query: this.state.filterText }); const items = await searchable.search({ query: this.state.filterText });
this.setState({ items: this.sort(items) }); this.setState({ items: this.sort(items) });
} catch (error) {
this.props.messageService.error(error instanceof Error ? error.message : String(error));
throw error;
} finally { } finally {
dialog.close(); dialog.close();
} }
@ -106,6 +113,7 @@ export class FilterableListContainer<T extends ArduinoComponent> extends React.C
const { uninstall, searchable, itemLabel } = this.props; const { uninstall, searchable, itemLabel } = this.props;
const dialog = new UninstallationProgressDialog(itemLabel(item)); const dialog = new UninstallationProgressDialog(itemLabel(item));
try { try {
await this.clearArduinoChannel();
dialog.open(); dialog.open();
await uninstall({ item }); await uninstall({ item });
const items = await searchable.search({ query: this.state.filterText }); const items = await searchable.search({ query: this.state.filterText });
@ -115,6 +123,10 @@ export class FilterableListContainer<T extends ArduinoComponent> extends React.C
} }
} }
private async clearArduinoChannel(): Promise<void> {
return this.props.commandService.executeCommand(OutputCommands.CLEAR.id, { name: 'Arduino' });
}
} }
export namespace FilterableListContainer { export namespace FilterableListContainer {
@ -129,6 +141,8 @@ export namespace FilterableListContainer {
readonly filterTextChangeEvent: Event<string | undefined>; readonly filterTextChangeEvent: Event<string | undefined>;
readonly install: ({ item, version }: { item: T, version: Installable.Version }) => Promise<void>; readonly install: ({ item, version }: { item: T, version: Installable.Version }) => Promise<void>;
readonly uninstall: ({ item }: { item: T }) => Promise<void>; readonly uninstall: ({ item }: { item: T }) => Promise<void>;
readonly messageService: MessageService;
readonly commandService: CommandService;
} }
export interface State<T> { export interface State<T> {

View File

@ -5,6 +5,8 @@ import { Deferred } from '@theia/core/lib/common/promise-util';
import { Emitter } from '@theia/core/lib/common/event'; import { Emitter } from '@theia/core/lib/common/event';
import { MaybePromise } from '@theia/core/lib/common/types'; import { MaybePromise } from '@theia/core/lib/common/types';
import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget'; 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 { Installable } from '../../../common/protocol/installable';
import { Searchable } from '../../../common/protocol/searchable'; import { Searchable } from '../../../common/protocol/searchable';
import { ArduinoComponent } from '../../../common/protocol/arduino-component'; import { ArduinoComponent } from '../../../common/protocol/arduino-component';
@ -15,6 +17,12 @@ import { NotificationCenter } from '../../notification-center';
@injectable() @injectable()
export abstract class ListWidget<T extends ArduinoComponent> extends ReactWidget { export abstract class ListWidget<T extends ArduinoComponent> extends ReactWidget {
@inject(MessageService)
protected readonly messageService: MessageService;
@inject(CommandService)
protected readonly commandService: CommandService;
@inject(NotificationCenter) @inject(NotificationCenter)
protected readonly notificationCenter: NotificationCenter; protected readonly notificationCenter: NotificationCenter;
@ -87,7 +95,9 @@ export abstract class ListWidget<T extends ArduinoComponent> extends ReactWidget
uninstall={this.uninstall.bind(this)} uninstall={this.uninstall.bind(this)}
itemLabel={this.options.itemLabel} itemLabel={this.options.itemLabel}
itemRenderer={this.options.itemRenderer} itemRenderer={this.options.itemRenderer}
filterTextChangeEvent={this.filterTextChangeEmitter.event} />; filterTextChangeEvent={this.filterTextChangeEmitter.event}
messageService={this.messageService}
commandService={this.commandService} />;
} }
/** /**

View File

@ -254,7 +254,11 @@ export class BoardsServiceImpl extends CoreClientAware implements BoardsService
}); });
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
resp.on('end', resolve); 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({}); const items = await this.search({});

View File

@ -183,7 +183,11 @@ export class LibraryServiceImpl extends CoreClientAware implements LibraryServic
}); });
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
resp.on('end', resolve); 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({}); const items = await this.search({});