From 4fa2024266206de45cfd7aa9cac6a7c584361e5a Mon Sep 17 00:00:00 2001 From: Francesco Stasi Date: Thu, 22 Apr 2021 22:09:18 +0200 Subject: [PATCH] [atl-1280] Board packages hints handle cornercase when 2 packages are associated to the same board updated cli version and grpc support deprecated cores in the boards manager bump cli version Bump ArduinoCLI version to latest release Add package version in notification --- arduino-ide-extension/package.json | 2 +- .../browser/boards/boards-auto-installer.ts | 20 +++++-- .../src/browser/boards/boards-list-widget.ts | 1 + .../browser/library/library-list-widget.ts | 1 + .../widgets/component-list/component-list.tsx | 1 + .../filterable-list-container.tsx | 17 ++++-- .../widgets/component-list/list-widget.tsx | 2 + .../src/common/protocol/arduino-component.ts | 1 + .../src/node/boards-service-impl.ts | 1 + .../cc/arduino/cli/commands/v1/common_pb.d.ts | 4 ++ .../cc/arduino/cli/commands/v1/common_pb.js | 32 ++++++++++- .../arduino/cli/commands/v1/compile_pb.d.ts | 6 +++ .../cc/arduino/cli/commands/v1/compile_pb.js | 53 ++++++++++++++++++- .../cc/arduino/cli/commands/v1/lib_pb.d.ts | 1 + .../cc/arduino/cli/commands/v1/lib_pb.js | 3 +- .../src/node/library-service-server-impl.ts | 1 + 16 files changed, 135 insertions(+), 11 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 59d89d56..5578f032 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -122,7 +122,7 @@ ], "arduino": { "cli": { - "version": "0.18.1" + "version": "0.18.2" } } } diff --git a/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts b/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts index ca277e17..e7293b17 100644 --- a/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts +++ b/arduino-ide-extension/src/browser/boards/boards-auto-installer.ts @@ -43,13 +43,27 @@ export class BoardsAutoInstaller implements FrontendApplicationContribution { if (selectedBoard && !this.notifications.find(board => Board.sameAs(board, selectedBoard))) { this.notifications.push(selectedBoard); this.boardsService.search({}).then(packages => { - const candidates = packages - .filter(pkg => BoardsPackage.contains(selectedBoard, pkg)) + + // filter packagesForBoard selecting matches from the cli (installed packages) + // and matches based on the board name + // NOTE: this ensures the Deprecated & new packages are all in the array + // so that we can check if any of the valid packages is already installed + const packagesForBoard = packages.filter(pkg => BoardsPackage.contains(selectedBoard, pkg) || pkg.boards.some(board => board.name === selectedBoard.name)); + + // check if one of the packages for the board is already installed. if so, no hint + if (packagesForBoard.some(({ installedVersion }) => !!installedVersion)) { return; } + + // filter the installable (not installed) packages, + // CLI returns the packages already sorted with the deprecated ones at the end of the list + // in order to ensure the new ones are preferred + const candidates = packagesForBoard .filter(({ installable, installedVersion }) => installable && !installedVersion); + const candidate = candidates[0]; if (candidate) { + const version = candidate.availableVersions[0] ? `[v ${candidate.availableVersions[0]}]` : ''; // tslint:disable-next-line:max-line-length - this.messageService.info(`The \`"${candidate.name}"\` core has to be installed for the currently selected \`"${selectedBoard.name}"\` board. Do you want to install it now?`, 'Install Manually', 'Yes').then(async answer => { + this.messageService.info(`The \`"${candidate.name} ${version}"\` core has to be installed for the currently selected \`"${selectedBoard.name}"\` board. Do you want to install it now?`, 'Install Manually', 'Yes').then(async answer => { const index = this.notifications.findIndex(board => Board.sameAs(board, selectedBoard)); if (index !== -1) { this.notifications.splice(index, 1); diff --git a/arduino-ide-extension/src/browser/boards/boards-list-widget.ts b/arduino-ide-extension/src/browser/boards/boards-list-widget.ts index 8df9f0ee..7ec54b29 100644 --- a/arduino-ide-extension/src/browser/boards/boards-list-widget.ts +++ b/arduino-ide-extension/src/browser/boards/boards-list-widget.ts @@ -20,6 +20,7 @@ export class BoardsListWidget extends ListWidget { searchable: service, installable: service, itemLabel: (item: BoardsPackage) => item.name, + itemDeprecated: (item: BoardsPackage) => item.deprecated, itemRenderer }); } diff --git a/arduino-ide-extension/src/browser/library/library-list-widget.ts b/arduino-ide-extension/src/browser/library/library-list-widget.ts index a0c70eb3..4d254e51 100644 --- a/arduino-ide-extension/src/browser/library/library-list-widget.ts +++ b/arduino-ide-extension/src/browser/library/library-list-widget.ts @@ -24,6 +24,7 @@ export class LibraryListWidget extends ListWidget { searchable: service, installable: service, itemLabel: (item: LibraryPackage) => item.name, + itemDeprecated: (item: LibraryPackage) => item.deprecated, itemRenderer }); } diff --git a/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx b/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx index 8c40e8d3..f459c726 100644 --- a/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx +++ b/arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx @@ -42,6 +42,7 @@ export namespace ComponentList { export interface Props { readonly items: T[]; readonly itemLabel: (item: T) => string; + readonly itemDeprecated: (item: T) => boolean; readonly itemRenderer: ListItemRenderer; readonly install: (item: T, version?: Installable.Version) => Promise; readonly uninstall: (item: T) => Promise; 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 66163a0a..af957f98 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 @@ -56,10 +56,11 @@ export class FilterableListContainer extends React.C } protected renderComponentList(): React.ReactNode { - const { itemLabel, resolveContainer, itemRenderer } = this.props; + const { itemLabel, itemDeprecated, resolveContainer, itemRenderer } = this.props; return items={this.state.items} itemLabel={itemLabel} + itemDeprecated={itemDeprecated} itemRenderer={itemRenderer} install={this.install.bind(this)} uninstall={this.uninstall.bind(this)} @@ -78,8 +79,17 @@ export class FilterableListContainer extends React.C } protected sort(items: T[]): T[] { - const { itemLabel } = this.props; - return items.sort((left, right) => itemLabel(left).localeCompare(itemLabel(right))); + // debugger; + const { itemLabel, itemDeprecated } = this.props; + return items.sort((left, right) => { + + // always put deprecated items at the bottom of the list + if (itemDeprecated(left)) { + return 1; + } + + return itemLabel(left).localeCompare(itemLabel(right)) + }); } protected async install(item: T, version: Installable.Version): Promise { @@ -121,6 +131,7 @@ export namespace FilterableListContainer { readonly container: ListWidget; readonly searchable: Searchable; readonly itemLabel: (item: T) => string; + readonly itemDeprecated: (item: T) => boolean; readonly itemRenderer: ListItemRenderer; readonly resolveContainer: (element: HTMLElement) => void; readonly resolveFocus: (element: HTMLElement | undefined) => void; 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 376f1208..3d7a64f0 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 @@ -102,6 +102,7 @@ export abstract class ListWidget extends ReactWidget install={this.install.bind(this)} uninstall={this.uninstall.bind(this)} itemLabel={this.options.itemLabel} + itemDeprecated={this.options.itemDeprecated} itemRenderer={this.options.itemRenderer} filterTextChangeEvent={this.filterTextChangeEmitter.event} messageService={this.messageService} @@ -133,6 +134,7 @@ export namespace ListWidget { readonly installable: Installable; readonly searchable: Searchable; readonly itemLabel: (item: T) => string; + readonly itemDeprecated: (item: T) => boolean; readonly itemRenderer: ListItemRenderer; } } diff --git a/arduino-ide-extension/src/common/protocol/arduino-component.ts b/arduino-ide-extension/src/common/protocol/arduino-component.ts index 583d061d..79b7f236 100644 --- a/arduino-ide-extension/src/common/protocol/arduino-component.ts +++ b/arduino-ide-extension/src/common/protocol/arduino-component.ts @@ -2,6 +2,7 @@ import { Installable } from './installable'; export interface ArduinoComponent { readonly name: string; + readonly deprecated: boolean; readonly author: string; readonly summary: string; readonly description: string; diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index ed5b7b5c..c41b7282 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -210,6 +210,7 @@ export class BoardsServiceImpl extends CoreClientAware implements BoardsService availableVersions: [platform.getLatest()], description: platform.getBoardsList().map(b => b.getName()).join(', '), installable: true, + deprecated: platform.getDeprecated(), summary: 'Boards included in this package:', installedVersion, boards: platform.getBoardsList().map(b => { name: b.getName(), fqbn: b.getFqbn() }), diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts index ec874476..b3d3f1e7 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.d.ts @@ -152,6 +152,9 @@ export class Platform extends jspb.Message { getManuallyInstalled(): boolean; setManuallyInstalled(value: boolean): Platform; + getDeprecated(): boolean; + setDeprecated(value: boolean): Platform; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Platform.AsObject; @@ -174,6 +177,7 @@ export namespace Platform { email: string, boardsList: Array, manuallyInstalled: boolean, + deprecated: boolean, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js index 8c783ab2..7cad6b29 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/common_pb.js @@ -955,7 +955,8 @@ proto.cc.arduino.cli.commands.v1.Platform.toObject = function(includeInstance, m email: jspb.Message.getFieldWithDefault(msg, 7, ""), boardsList: jspb.Message.toObjectList(msg.getBoardsList(), proto.cc.arduino.cli.commands.v1.Board.toObject, includeInstance), - manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 9, false) + manuallyInstalled: jspb.Message.getBooleanFieldWithDefault(msg, 9, false), + deprecated: jspb.Message.getBooleanFieldWithDefault(msg, 10, false) }; if (includeInstance) { @@ -1029,6 +1030,10 @@ proto.cc.arduino.cli.commands.v1.Platform.deserializeBinaryFromReader = function var value = /** @type {boolean} */ (reader.readBool()); msg.setManuallyInstalled(value); break; + case 10: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setDeprecated(value); + break; default: reader.skipField(); break; @@ -1122,6 +1127,13 @@ proto.cc.arduino.cli.commands.v1.Platform.serializeBinaryToWriter = function(mes f ); } + f = message.getDeprecated(); + if (f) { + writer.writeBool( + 10, + f + ); + } }; @@ -1307,6 +1319,24 @@ proto.cc.arduino.cli.commands.v1.Platform.prototype.setManuallyInstalled = funct }; +/** + * optional bool deprecated = 10; + * @return {boolean} + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.getDeprecated = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 10, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.cc.arduino.cli.commands.v1.Platform} returns this + */ +proto.cc.arduino.cli.commands.v1.Platform.prototype.setDeprecated = function(value) { + return jspb.Message.setProto3BooleanField(this, 10, value); +}; + + diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts index 38aa9cbb..4f9c74b2 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.d.ts @@ -81,6 +81,11 @@ export class CompileRequest extends jspb.Message { getExportBinaries(): google_protobuf_wrappers_pb.BoolValue | undefined; setExportBinaries(value?: google_protobuf_wrappers_pb.BoolValue): CompileRequest; + clearLibraryList(): void; + getLibraryList(): Array; + setLibraryList(value: Array): CompileRequest; + addLibrary(value: string, index?: number): string; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): CompileRequest.AsObject; @@ -115,6 +120,7 @@ export namespace CompileRequest { sourceOverrideMap: Array<[string, string]>, exportBinaries?: google_protobuf_wrappers_pb.BoolValue.AsObject, + libraryList: Array, } } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js index 61033798..1229aaf6 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/compile_pb.js @@ -93,7 +93,7 @@ if (goog.DEBUG && !COMPILED) { * @private {!Array} * @const */ -proto.cc.arduino.cli.commands.v1.CompileRequest.repeatedFields_ = [8,15]; +proto.cc.arduino.cli.commands.v1.CompileRequest.repeatedFields_ = [8,15,24]; @@ -145,7 +145,8 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.toObject = function(includeInsta clean: jspb.Message.getBooleanFieldWithDefault(msg, 19, false), createCompilationDatabaseOnly: jspb.Message.getBooleanFieldWithDefault(msg, 21, false), sourceOverrideMap: (f = msg.getSourceOverrideMap()) ? f.toObject(includeInstance, undefined) : [], - exportBinaries: (f = msg.getExportBinaries()) && google_protobuf_wrappers_pb.BoolValue.toObject(includeInstance, f) + exportBinaries: (f = msg.getExportBinaries()) && google_protobuf_wrappers_pb.BoolValue.toObject(includeInstance, f), + libraryList: (f = jspb.Message.getRepeatedField(msg, 24)) == null ? undefined : f }; if (includeInstance) { @@ -266,6 +267,10 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.deserializeBinaryFromReader = fu reader.readMessage(value,google_protobuf_wrappers_pb.BoolValue.deserializeBinaryFromReader); msg.setExportBinaries(value); break; + case 24: + var value = /** @type {string} */ (reader.readString()); + msg.addLibrary(value); + break; default: reader.skipField(); break; @@ -434,6 +439,13 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.serializeBinaryToWriter = functi google_protobuf_wrappers_pb.BoolValue.serializeBinaryToWriter ); } + f = message.getLibraryList(); + if (f.length > 0) { + writer.writeRepeatedString( + 24, + f + ); + } }; @@ -877,6 +889,43 @@ proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.hasExportBinaries = fu }; +/** + * repeated string library = 24; + * @return {!Array} + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.getLibraryList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 24)); +}; + + +/** + * @param {!Array} value + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.setLibraryList = function(value) { + return jspb.Message.setField(this, 24, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.addLibrary = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 24, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.cc.arduino.cli.commands.v1.CompileRequest} returns this + */ +proto.cc.arduino.cli.commands.v1.CompileRequest.prototype.clearLibraryList = function() { + return this.setLibraryList([]); +}; + + /** * List of repeated fields within this message type. diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts index 78149890..c3e5155f 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts @@ -910,4 +910,5 @@ export enum LibraryLocation { LIBRARY_LOCATION_USER = 1, LIBRARY_LOCATION_PLATFORM_BUILTIN = 2, LIBRARY_LOCATION_REFERENCED_PLATFORM_BUILTIN = 3, + LIBRARY_LOCATION_UNMANAGED = 4, } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js index 84f4564f..44f24309 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js @@ -6593,7 +6593,8 @@ proto.cc.arduino.cli.commands.v1.LibraryLocation = { LIBRARY_LOCATION_IDE_BUILTIN: 0, LIBRARY_LOCATION_USER: 1, LIBRARY_LOCATION_PLATFORM_BUILTIN: 2, - LIBRARY_LOCATION_REFERENCED_PLATFORM_BUILTIN: 3 + LIBRARY_LOCATION_REFERENCED_PLATFORM_BUILTIN: 3, + LIBRARY_LOCATION_UNMANAGED: 4 }; goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); 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 ac6fa277..e936a8f3 100644 --- a/arduino-ide-extension/src/node/library-service-server-impl.ts +++ b/arduino-ide-extension/src/node/library-service-server-impl.ts @@ -249,6 +249,7 @@ function toLibrary(pkg: Partial, lib: LibraryRelease | Library, label: '', exampleUris: [], installable: false, + deprecated: false, location: 0, ...pkg,