Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit cef1ccb

Browse files
author
Akos Kitta
committed
feat: cancelable verify+upload
Closes #1199 Signed-off-by: Akos Kitta <a.kitta@arduino.cc>
1 parent c18f23e commit cef1ccb

File tree

13 files changed

+307
-180
lines changed

13 files changed

+307
-180
lines changed

‎arduino-ide-extension/src/browser/contributions/burn-bootloader.ts‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,15 @@ export class BurnBootloader extends CoreServiceContribution {
3737
'arduino/bootloader/burningBootloader',
3838
'Burning bootloader...'
3939
),
40-
task: (progressId, coreService) =>
41-
coreService.burnBootloader({
42-
...options,
43-
progressId,
44-
}),
40+
task: (progressId, coreService, token) =>
41+
coreService.burnBootloader(
42+
{
43+
...options,
44+
progressId,
45+
},
46+
token
47+
),
48+
cancelable: true,
4549
});
4650
this.messageService.info(
4751
nls.localize(

‎arduino-ide-extension/src/browser/contributions/contribution.ts‎

Lines changed: 72 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,89 @@
1+
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
12
import {
2-
inject,
3-
injectable,
4-
interfaces,
5-
postConstruct,
6-
} from '@theia/core/shared/inversify';
7-
import URI from '@theia/core/lib/common/uri';
8-
import { ILogger } from '@theia/core/lib/common/logger';
9-
import {
10-
Disposable,
11-
DisposableCollection,
12-
} from '@theia/core/lib/common/disposable';
13-
import { Saveable } from '@theia/core/lib/browser/saveable';
14-
import { FileService } from '@theia/filesystem/lib/browser/file-service';
15-
import { MaybePromise } from '@theia/core/lib/common/types';
16-
import { LabelProvider } from '@theia/core/lib/browser/label-provider';
17-
import { EditorManager } from '@theia/editor/lib/browser/editor-manager';
18-
import { MessageService } from '@theia/core/lib/common/message-service';
19-
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
20-
import { open, OpenerService } from '@theia/core/lib/browser/opener-service';
21-
import {
22-
MenuModelRegistry,
23-
MenuContribution,
24-
} from '@theia/core/lib/common/menu';
3+
FrontendApplication,
4+
FrontendApplicationContribution,
5+
} from '@theia/core/lib/browser/frontend-application';
6+
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
257
import {
26-
KeybindingRegistry,
278
KeybindingContribution,
9+
KeybindingRegistry,
2810
} from '@theia/core/lib/browser/keybinding';
11+
import { LabelProvider } from '@theia/core/lib/browser/label-provider';
12+
import { OpenerService, open } from '@theia/core/lib/browser/opener-service';
13+
import { Saveable } from '@theia/core/lib/browser/saveable';
14+
import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell';
2915
import {
3016
TabBarToolbarContribution,
3117
TabBarToolbarRegistry,
3218
} from '@theia/core/lib/browser/shell/tab-bar-toolbar';
33-
import {
34-
FrontendApplicationContribution,
35-
FrontendApplication,
36-
} from '@theia/core/lib/browser/frontend-application';
19+
import { CancellationToken } from '@theia/core/lib/common/cancellation';
3720
import {
3821
Command,
39-
CommandRegistry,
4022
CommandContribution,
23+
CommandRegistry,
4124
CommandService,
4225
} from '@theia/core/lib/common/command';
43-
import { SettingsService } from '../dialogs/settings/settings';
4426
import {
45-
CurrentSketch,
46-
SketchesServiceClientImpl,
47-
} from '../sketches-service-client-impl';
27+
Disposable,
28+
DisposableCollection,
29+
} from '@theia/core/lib/common/disposable';
30+
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
31+
import { ILogger } from '@theia/core/lib/common/logger';
32+
import {
33+
MenuContribution,
34+
MenuModelRegistry,
35+
} from '@theia/core/lib/common/menu';
36+
import { MessageService } from '@theia/core/lib/common/message-service';
37+
import { MessageType } from '@theia/core/lib/common/message-service-protocol';
38+
import { nls } from '@theia/core/lib/common/nls';
39+
import { MaybePromise, isObject } from '@theia/core/lib/common/types';
40+
import URI from '@theia/core/lib/common/uri';
41+
import {
42+
inject,
43+
injectable,
44+
interfaces,
45+
postConstruct,
46+
} from '@theia/core/shared/inversify';
47+
import { EditorManager } from '@theia/editor/lib/browser/editor-manager';
48+
import { FileService } from '@theia/filesystem/lib/browser/file-service';
49+
import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager';
50+
import { OutputChannelSeverity } from '@theia/output/lib/browser/output-channel';
51+
import { MainMenuManager } from '../../common/main-menu-manager';
52+
import { userAbort } from '../../common/nls';
4853
import {
49-
SketchesService,
50-
FileSystemExt,
51-
Sketch,
52-
CoreService,
5354
CoreError,
55+
CoreService,
56+
FileSystemExt,
5457
ResponseServiceClient,
58+
Sketch,
59+
SketchesService,
5560
} from '../../common/protocol';
61+
import {
62+
ExecuteWithProgress,
63+
UserAbortApplicationError,
64+
} from '../../common/protocol/progressible';
5665
import { ArduinoPreferences } from '../arduino-preferences';
57-
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
58-
import { nls } from '@theia/core';
59-
import { OutputChannelManager } from '../theia/output/output-channel';
60-
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
61-
import { ExecuteWithProgress } from '../../common/protocol/progressible';
62-
import { BoardsServiceProvider } from '../boards/boards-service-provider';
6366
import { BoardsDataStore } from '../boards/boards-data-store';
64-
import { NotificationManager } from '@theia/messages/lib/browser/notifications-manager';
65-
import { MessageType } from '@theia/core/lib/common/message-service-protocol';
66-
import { WorkspaceService } from '../theia/workspace/workspace-service';
67-
import { MainMenuManager } from '../../common/main-menu-manager';
67+
import { BoardsServiceProvider } from '../boards/boards-service-provider';
6868
import { ConfigServiceClient } from '../config/config-service-client';
69-
import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell';
7069
import { DialogService } from '../dialog-service';
70+
import { SettingsService } from '../dialogs/settings/settings';
71+
import {
72+
CurrentSketch,
73+
SketchesServiceClientImpl,
74+
} from '../sketches-service-client-impl';
7175
import { ApplicationConnectionStatusContribution } from '../theia/core/connection-status-service';
76+
import { OutputChannelManager } from '../theia/output/output-channel';
77+
import { WorkspaceService } from '../theia/workspace/workspace-service';
7278

7379
export {
7480
Command,
7581
CommandRegistry,
76-
MenuModelRegistry,
7782
KeybindingRegistry,
83+
MenuModelRegistry,
84+
Sketch,
7885
TabBarToolbarRegistry,
7986
URI,
80-
Sketch,
8187
open,
8288
};
8389

@@ -247,6 +253,12 @@ export abstract class CoreServiceContribution extends SketchContribution {
247253
}
248254

249255
protected handleError(error: unknown): void {
256+
if (isObject(error) && UserAbortApplicationError.is(error)) {
257+
this.outputChannelManager
258+
.getChannel('Arduino')
259+
.appendLine(userAbort, OutputChannelSeverity.Warning);
260+
return;
261+
}
250262
this.tryToastErrorMessage(error);
251263
}
252264

@@ -293,7 +305,13 @@ export abstract class CoreServiceContribution extends SketchContribution {
293305
protected async doWithProgress<T>(options: {
294306
progressText: string;
295307
keepOutput?: boolean;
296-
task: (progressId: string, coreService: CoreService) => Promise<T>;
308+
task: (
309+
progressId: string,
310+
coreService: CoreService,
311+
cancellationToken?: CancellationToken
312+
) => Promise<T>;
313+
// false by default
314+
cancelable?: boolean;
297315
}): Promise<T> {
298316
const toDisposeOnComplete = new DisposableCollection(
299317
this.maybeActivateMonitorWidget()
@@ -306,8 +324,10 @@ export abstract class CoreServiceContribution extends SketchContribution {
306324
messageService: this.messageService,
307325
responseService: this.responseService,
308326
progressText,
309-
run: ({ progressId }) => task(progressId, this.coreService),
327+
run: ({ progressId, cancellationToken }) =>
328+
task(progressId, this.coreService, cancellationToken),
310329
keepOutput,
330+
cancelable: options.cancelable,
311331
});
312332
toDisposeOnComplete.dispose();
313333
return result;

‎arduino-ide-extension/src/browser/contributions/upload-sketch.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,10 @@ export class UploadSketch extends CoreServiceContribution {
136136

137137
const uploadResponse = await this.doWithProgress({
138138
progressText: nls.localize('arduino/sketch/uploading', 'Uploading...'),
139-
task: (progressId, coreService) =>
140-
coreService.upload({ ...uploadOptions, progressId }),
139+
task: (progressId, coreService,token) =>
140+
coreService.upload({ ...uploadOptions, progressId },token),
141141
keepOutput: true,
142+
cancelable: true,
142143
});
143144
// the port update is NOOP if nothing has changed
144145
this.boardsServiceProvider.updateConfig(uploadResponse.portAfterUpload);

‎arduino-ide-extension/src/browser/contributions/verify-sketch.ts‎

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
import { inject, injectable } from '@theia/core/shared/inversify';
21
import { Emitter } from '@theia/core/lib/common/event';
2+
import { nls } from '@theia/core/lib/common/nls';
3+
import { inject, injectable } from '@theia/core/shared/inversify';
4+
import type { CoreService } from '../../common/protocol';
35
import { ArduinoMenus } from '../menu/arduino-menus';
6+
import { CurrentSketch } from '../sketches-service-client-impl';
47
import { ArduinoToolbar } from '../toolbar/arduino-toolbar';
58
import {
6-
CoreServiceContribution,
79
Command,
810
CommandRegistry,
9-
MenuModelRegistry,
11+
CoreServiceContribution,
1012
KeybindingRegistry,
13+
MenuModelRegistry,
1114
TabBarToolbarRegistry,
1215
} from './contribution';
13-
import { nls } from '@theia/core/lib/common';
14-
import { CurrentSketch } from '../sketches-service-client-impl';
15-
import { CoreService } from '../../common/protocol';
1616
import { CoreErrorHandler } from './core-error-handler';
1717

1818
export interface VerifySketchParams {
@@ -131,11 +131,15 @@ export class VerifySketch extends CoreServiceContribution {
131131
'arduino/sketch/compile',
132132
'Compiling sketch...'
133133
),
134-
task: (progressId, coreService) =>
135-
coreService.compile({
136-
...options,
137-
progressId,
138-
}),
134+
task: (progressId, coreService, token) =>
135+
coreService.compile(
136+
{
137+
...options,
138+
progressId,
139+
},
140+
token
141+
),
142+
cancelable: true,
139143
});
140144
this.messageService.info(
141145
nls.localize('arduino/sketch/doneCompiling', 'Done compiling.'),

‎arduino-ide-extension/src/browser/library/library-list-widget.ts‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,13 @@ import {
1212
LibrarySearch,
1313
LibraryService,
1414
} from '../../common/protocol/library-service';
15-
import {
16-
ListWidget,
17-
UserAbortError,
18-
} from '../widgets/component-list/list-widget';
15+
import { ListWidget } from '../widgets/component-list/list-widget';
1916
import { Installable } from '../../common/protocol';
2017
import { ListItemRenderer } from '../widgets/component-list/list-item-renderer';
2118
import { nls } from '@theia/core/lib/common';
2219
import { LibraryFilterRenderer } from '../widgets/component-list/filter-renderer';
2320
import { findChildTheiaButton, splitByBoldTag } from '../utils/dom';
21+
import { UserAbortError } from '../../common/protocol/progressible';
2422

2523
@injectable()
2624
export class LibraryListWidget extends ListWidget<

‎arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from '@theia/core/shared/react';
22
import type { ArduinoComponent } from '../../../common/protocol/arduino-component';
33
import { Installable } from '../../../common/protocol/installable';
44
import type { ListItemRenderer } from './list-item-renderer';
5-
import { UserAbortError } from './list-widget';
5+
import { UserAbortError } from '../../../common/protocol/progressible';
66

77
export class ComponentListItem<
88
T extends ArduinoComponent

‎arduino-ide-extension/src/browser/widgets/component-list/filterable-list-container.tsx‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,18 @@ import { CommandService } from '@theia/core/lib/common/command';
55
import { MessageService } from '@theia/core/lib/common/message-service';
66
import { ConfirmDialog } from '@theia/core/lib/browser/dialogs';
77
import { Searchable } from '../../../common/protocol/searchable';
8-
import { ExecuteWithProgress } from '../../../common/protocol/progressible';
8+
import {
9+
ExecuteWithProgress,
10+
UserAbortError,
11+
} from '../../../common/protocol/progressible';
912
import {
1013
Installable,
1114
libraryInstallFailed,
1215
platformInstallFailed,
1316
} from '../../../common/protocol/installable';
1417
import { ArduinoComponent } from '../../../common/protocol/arduino-component';
1518
import { SearchBar } from './search-bar';
16-
import { ListWidget,UserAbortError } from './list-widget';
19+
import { ListWidget } from './list-widget';
1720
import { ComponentList } from './component-list';
1821
import { ListItemRenderer } from './list-item-renderer';
1922
import {

‎arduino-ide-extension/src/browser/widgets/component-list/list-widget.tsx‎

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,3 @@ export namespace ListWidget {
192192
readonly defaultSearchOptions: S;
193193
}
194194
}
195-
196-
export class UserAbortError extends Error {
197-
constructor(message = 'User abort') {
198-
super(message);
199-
Object.setPrototypeOf(this, UserAbortError.prototype);
200-
}
201-
}

‎arduino-ide-extension/src/common/nls.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,5 @@ export const noSketchOpened = nls.localize(
3939
'arduino/common/noSketchOpened',
4040
'No sketch opened'
4141
);
42+
43+
export const userAbort = nls.localize('arduino/common/userAbort', 'User abort');

‎arduino-ide-extension/src/common/protocol/core-service.ts‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ApplicationError } from '@theia/core/lib/common/application-error';
2+
import type { CancellationToken } from '@theia/core/lib/common/cancellation';
23
import { nls } from '@theia/core/lib/common/nls';
34
import type {
45
Location,
@@ -7,7 +8,7 @@ import type {
78
} from '@theia/core/shared/vscode-languageserver-protocol';
89
import type { CompileSummary as ApiCompileSummary } from 'vscode-arduino-api';
910
import type { BoardUserField, Installable } from '../../common/protocol/';
10-
import { isPortIdentifier,PortIdentifier, Programmer } from './boards-service';
11+
import { PortIdentifier, Programmer,isPortIdentifier } from './boards-service';
1112
import type { IndexUpdateSummary } from './notification-service';
1213
import type { Sketch } from './sketches-service';
1314

@@ -162,9 +163,18 @@ export function isUploadResponse(arg: unknown): arg is UploadResponse {
162163
export const CoreServicePath = '/services/core-service';
163164
export const CoreService = Symbol('CoreService');
164165
export interface CoreService {
165-
compile(options: CoreService.Options.Compile): Promise<void>;
166-
upload(options: CoreService.Options.Upload): Promise<UploadResponse>;
167-
burnBootloader(options: CoreService.Options.Bootloader): Promise<void>;
166+
compile(
167+
options: CoreService.Options.Compile,
168+
cancellationToken?: CancellationToken
169+
): Promise<void>;
170+
upload(
171+
options: CoreService.Options.Upload,
172+
cancellationToken?: CancellationToken
173+
): Promise<UploadResponse>;
174+
burnBootloader(
175+
options: CoreService.Options.Bootloader,
176+
cancellationToken?: CancellationToken
177+
): Promise<void>;
168178
/**
169179
* Refreshes the underling core gRPC client for the Arduino CLI.
170180
*/

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /