Skip to content

Commit

Permalink
Add build use case (fix issue #14)
Browse files Browse the repository at this point in the history
  • Loading branch information
cedelavergne-ledger committed May 13, 2024
1 parent 5b0e39d commit 9704352
Show file tree
Hide file tree
Showing 7 changed files with 122 additions and 5 deletions.
12 changes: 12 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@
"when": "view == mainView && viewItem == functionalTests && ledgerDevTools.showSelectTestUseCase",
"group": "inline"
},
{
"command": "buildUseCase",
"when": "view == mainView && viewItem == buildUseCase",
"group": "inline"
},
{
"command": "rebuildTestUseCaseDeps",
"when": "view == mainView && viewItem == functionalTests && ledgerDevTools.showRebuildTestUseCaseDeps",
Expand Down Expand Up @@ -93,6 +98,13 @@
"category": "Ledger",
"tooltip": "Select the device you want to build your app for."
},
{
"command": "buildUseCase",
"title": "Select build use case",
"category": "Ledger",
"tooltip": "Select the use case you want to build with.",
"icon": "$(gear)"
},
{
"command": "toggleAllTargets",
"title": "Toggle selection of all targets",
Expand Down
26 changes: 26 additions & 0 deletions src/appSelector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,27 @@ let testUseCaseSelected: vscode.EventEmitter<void> = new vscode.EventEmitter<voi

export const onTestUseCaseSelected: vscode.Event<void> = testUseCaseSelected.event;

export function getSelectedBuidUseCase(): string {
if (selectedApp && selectedApp.selectedBuildUseCase) {
console.log("LEDGER: getSelectedBuidUseCase: " + selectedApp.selectedBuildUseCase.name);
return selectedApp.selectedBuildUseCase.name;
}
console.log("[DBG] LEDGER: appSelector/getSelectedBuidUseCase: default");
return "default";
}

export function setBuildUseCase(name: string) {

if (selectedApp && selectedApp?.buildUseCases) {
for (let useCase of selectedApp?.buildUseCases) {
if (useCase.name === name) {
selectedApp.selectedBuildUseCase = useCase;
}
}
}

}

function detectAppType(appFolder: vscode.Uri): [AppType?, string?] {
const searchPatterns = APP_DETECTION_FILES.map((file) => path.join(appFolder.fsPath, `**/${file}`).replace(/\\/g, "/"));
const makefileOrToml = fg.sync(searchPatterns, { onlyFiles: true, deep: 2 });
Expand Down Expand Up @@ -443,6 +464,11 @@ function parseBuildUseCasesFromManifest(tomlContent: any): BuildUseCase[] | unde
if (useCasesSection) {
console.log(`Found use_cases section in manifest`);
buildUseCases = [];
let buildUseCase: BuildUseCase = {
name: "default",
options: "",
};
buildUseCases.push(buildUseCase);
const useCases = Object.keys(useCasesSection);
for (let useCase of useCases) {
let buildUseCase: BuildUseCase = {
Expand Down
19 changes: 18 additions & 1 deletion src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
showTestUseCaseSelectorMenu,
onTestUseCaseSelected,
getAndBuildAppTestsDependencies,
getSelectedBuidUseCase,
} from "./appSelector";

let outputChannel: vscode.OutputChannel;
Expand All @@ -41,7 +42,7 @@ export function activate(context: vscode.ExtensionContext) {
let taskProvider = new TaskProvider(treeProvider, targetSelector);
context.subscriptions.push(vscode.tasks.registerTaskProvider(taskType, taskProvider));

let statusBarManager = new StatusBarManager(targetSelector.getSelectedTarget());
let statusBarManager = new StatusBarManager(targetSelector.getSelectedTarget(), getSelectedBuidUseCase());

let containerManager = new ContainerManager(taskProvider);

Expand All @@ -68,6 +69,16 @@ export function activate(context: vscode.ExtensionContext) {
})
);

// Event listener for useCase selection.
// This event is fired when the user selects a build useCase
context.subscriptions.push(
targetSelector.onUseCaseSelectedEvent((data) => {
taskProvider.generateTasks();
statusBarManager.updateBuildUseCaseItem(data);
treeProvider.updateDynamicLabels();
})
);

// Event listener for app selection.
// This event is fired when the user selects an app in the appSelector menu
context.subscriptions.push(
Expand All @@ -93,6 +104,12 @@ export function activate(context: vscode.ExtensionContext) {
})
);

context.subscriptions.push(
vscode.commands.registerCommand("buildUseCase", () => {
targetSelector.showBuildUseCase();
})
);

context.subscriptions.push(
vscode.commands.registerCommand("addTestsPrerequisites", () => {
setAppTestsPrerequisites(taskProvider);
Expand Down
14 changes: 13 additions & 1 deletion src/statusBar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,23 @@ import { ContainerManager, DevImageStatus } from "./containerManager";
const imageToolTip = "Click to update image and respawn container.";

export class StatusBarManager {
private buildUseCaseItem: vscode.StatusBarItem;
private targetItem: vscode.StatusBarItem;
private devImageItem: vscode.StatusBarItem;

constructor(target: string) {
constructor(target: string, useCase: string) {
this.targetItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
this.targetItem.tooltip = "Click to select another device.";
this.targetItem.command = "selectTarget";
this.targetItem.backgroundColor = new vscode.ThemeColor("statusBarItem.prominentBackground");
this.updateTargetItem(target);

this.buildUseCaseItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
this.buildUseCaseItem.tooltip = "Click to select another use case.";
this.buildUseCaseItem.command = "buildUseCase";
this.buildUseCaseItem.backgroundColor = new vscode.ThemeColor("statusBarItem.prominentBackground");
this.updateBuildUseCaseItem(useCase);

this.devImageItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
// Create a Command object with command and arguments
const runDevImageCommand: vscode.Command = {
Expand All @@ -35,6 +42,11 @@ export class StatusBarManager {
this.targetItem.show();
}

public updateBuildUseCaseItem(useCase: string) {
this.buildUseCaseItem.text = `$(gear) L : ${useCase}`;
this.buildUseCaseItem.show();
}

public updateDevImageItem(status: DevImageStatus): void {
const currentApp = getSelectedApp();
if (currentApp) {
Expand Down
25 changes: 24 additions & 1 deletion src/targetSelector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as vscode from "vscode";
import { StatusBarManager } from "./statusBar";
import { TaskProvider } from "./taskProvider";
import { TreeDataProvider } from "./treeView";
import { getSelectedApp } from "./appSelector";
import { getSelectedApp, setBuildUseCase } from "./appSelector";

// Define valid devices
const devices = ["Nano S", "Nano S Plus", "Nano X", "Stax", "Flex"] as const;
Expand Down Expand Up @@ -55,6 +55,7 @@ export class TargetSelector {
private targetsArray: (LedgerDevice | SpecialAllDevice)[] = [];
private sdkModelsArray: Record<string, string> = {};
private targetSelectedEmitter: vscode.EventEmitter<string> = new vscode.EventEmitter<string>();
private useCaseSelectedEmitter: vscode.EventEmitter<string> = new vscode.EventEmitter<string>();
private prevSelectedApp: string = "";

constructor() {
Expand Down Expand Up @@ -115,6 +116,7 @@ export class TargetSelector {
}

public readonly onTargetSelectedEvent: vscode.Event<string> = this.targetSelectedEmitter.event;
public readonly onUseCaseSelectedEvent: vscode.Event<string> = this.useCaseSelectedEmitter.event;

private triggerTargetSelectedEvent(data: string) {
this.targetSelectedEmitter.fire(data);
Expand All @@ -141,6 +143,27 @@ export class TargetSelector {
return result;
}

public async showBuildUseCase() {
const currentApp = getSelectedApp();
if (currentApp) {
if (currentApp.buildUseCases) {
const items: string[] = [];
for (let useCase of currentApp.buildUseCases) {
items.push(useCase.name);
}
const result = await vscode.window.showQuickPick(items, {
placeHolder: "Please select a use case",
onDidSelectItem: (item) => {
setBuildUseCase(item.toString());
this.useCaseSelectedEmitter.fire(item.toString());
},
});
return result;
}
return "";
}
}

public getSelectedTarget() {
return this.selectedTarget;
}
Expand Down
10 changes: 8 additions & 2 deletions src/taskProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -303,10 +303,16 @@ export class TaskProvider implements vscode.TaskProvider {
}

private cBuildExec(): string {

let buildOpt: string = "";
if (this.currentApp && this.currentApp.selectedBuildUseCase?.options) {
buildOpt = this.currentApp.selectedBuildUseCase?.options;
}

const exec = `docker exec -it ${
this.containerName
} bash -c 'export BOLOS_SDK=$(echo ${this.tgtSelector.getSelectedSDK()}) && make -C ${this.buildDir} -j'`;
// Builds the app in release mode using the make command, inside the docker container.
} bash -c 'export BOLOS_SDK=$(echo ${this.tgtSelector.getSelectedSDK()}) && make -C ${this.buildDir} -j ${buildOpt}'`;
// Builds the app using the make command, inside the docker container.
return exec;
}

Expand Down
21 changes: 21 additions & 0 deletions src/treeView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ export class TreeDataProvider implements vscode.TreeDataProvider<TreeItem> {
let selectTargetItem = this.data.find((item) => item.label && item.label.toString().startsWith("Select target"));
let selectAppItem = this.data.find((item) => item.label && item.label.toString().startsWith("Select app"));
let functionalTestsItem = this.data.find((item) => item.label && item.label.toString().startsWith("Functional"));
let buidUseCaseItem = this.data.find((item) => item.label && item.label.toString().startsWith("Build"));
if (selectAppItem) {
selectAppItem.label = `Select app [${currentApp.folderName}]`;
}
Expand All @@ -192,6 +193,11 @@ export class TreeDataProvider implements vscode.TreeDataProvider<TreeItem> {
} else if (functionalTestsItem) {
functionalTestsItem.label = `Functional Tests`;
}
if (buidUseCaseItem && currentApp.selectedBuildUseCase) {
buidUseCaseItem.label = `Build [${currentApp.selectedBuildUseCase.name}]`;
} else if (buidUseCaseItem) {
buidUseCaseItem.label = `Build`;
}
} else {
// Remove all tree items. The welcome view will be displayed instead.
this.data = [];
Expand All @@ -203,6 +209,7 @@ export class TreeDataProvider implements vscode.TreeDataProvider<TreeItem> {
// Check select app and select target items don't already exist
const selectAppItem = this.data.find((item) => item.label && item.label.toString().startsWith("Select app"));
const selectTargetItem = this.data.find((item) => item.label && item.label.toString().startsWith("Select target"));
const buidUseCaseItem = this.data.find((item) => item.label && item.label.toString().startsWith("Build"));

if (!selectAppItem) {
let selectApp = new TreeItem("Select app");
Expand Down Expand Up @@ -230,6 +237,20 @@ export class TreeDataProvider implements vscode.TreeDataProvider<TreeItem> {
console.log("Ledger: Adding selectTarget to tree");
this.data.push(selectTarget);
}

if (!buidUseCaseItem) {
let buildUseCase = new TreeItem("Select build use case");
buildUseCase.contextValue = "buildUseCase";
buildUseCase.setDefault();
buildUseCase.tooltip = "Select build use case";
buildUseCase.command = {
command: "buildUseCase",
title: "Build Use Case",
arguments: [],
};
console.log("Ledger: Adding buildUseCase to tree");
this.data.push(buildUseCase);
}
}
}

Expand Down

0 comments on commit 9704352

Please sign in to comment.