Skip to content

Commit

Permalink
Add local dotnet tools management. Fixes #248
Browse files Browse the repository at this point in the history
  • Loading branch information
badsyntax committed Dec 19, 2022
1 parent 9fbf318 commit 3732cfe
Show file tree
Hide file tree
Showing 21 changed files with 342 additions and 19 deletions.
69 changes: 69 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -158,17 +158,34 @@
"category": "Solution Explorer",
"icon": "$(add)"
},
{
"command": "solutionExplorer.addLocalTool",
"title": "Add local tool",
"category": "Solution Explorer",
"icon": "$(add)"
},
{
"command": "solutionExplorer.removePackage",
"title": "Remove package",
"category": "Solution Explorer",
"icon": "$(trash)"
},
{
"command": "solutionExplorer.removeLocalTool",
"title": "Remove local tool",
"category": "Solution Explorer",
"icon": "$(trash)"
},
{
"command": "solutionExplorer.updatePackagesVersion",
"title": "Update packages version",
"category": "Solution Explorer"
},
{
"command": "solutionExplorer.updateLocalToolsVersion",
"title": "Update local tools version",
"category": "Solution Explorer"
},
{
"command": "solutionExplorer.addProjectReference",
"title": "Add reference",
Expand Down Expand Up @@ -491,6 +508,16 @@
"when": "view == slnexpl && viewItem == project-referenced-package-cps",
"group": "inline"
},
{
"command": "solutionExplorer.removeLocalTool",
"when": "view == slnexpl && viewItem == local-tool",
"group": "2_workspace"
},
{
"command": "solutionExplorer.removeLocalTool",
"when": "view == slnexpl && viewItem == local-tool",
"group": "inline"
},
{
"command": "solutionExplorer.updatePackagesVersion",
"when": "view == slnexpl && viewItem == project-cps",
Expand All @@ -501,6 +528,11 @@
"when": "view == slnexpl && viewItem == project-referenced-packages-cps",
"group": "2_workspace"
},
{
"command": "solutionExplorer.updateLocalToolsVersion",
"when": "view == slnexpl && viewItem == local-tools",
"group": "2_workspace"
},
{
"command": "solutionExplorer.addProjectReference",
"when": "view == slnexpl && viewItem == project-cps",
Expand Down Expand Up @@ -896,6 +928,16 @@
"when": "view == slnbrw && viewItem == project-referenced-packages-cps",
"group": "inline"
},
{
"command": "solutionExplorer.addLocalTool",
"when": "view == slnbrw && viewItem == local-tools",
"group": "2_workspace"
},
{
"command": "solutionExplorer.addLocalTool",
"when": "view == slnbrw && viewItem == local-tools",
"group": "inline"
},
{
"command": "solutionExplorer.removePackage",
"when": "view == slnbrw && viewItem == project-referenced-package-cps",
Expand All @@ -906,6 +948,16 @@
"when": "view == slnbrw && viewItem == project-referenced-package-cps",
"group": "inline"
},
{
"command": "solutionExplorer.removeLocalTool",
"when": "view == slnbrw && viewItem == local-tool",
"group": "2_workspace"
},
{
"command": "solutionExplorer.removeLocalTool",
"when": "view == slnbrw && viewItem == local-tool",
"group": "inline"
},
{
"command": "solutionExplorer.updatePackagesVersion",
"when": "view == slnbrw && viewItem == project-cps",
Expand All @@ -916,6 +968,11 @@
"when": "view == slnbrw && viewItem == project-referenced-packages-cps",
"group": "2_workspace"
},
{
"command": "solutionExplorer.updateLocalToolsVersion",
"when": "view == slnbrw && viewItem == local-tools",
"group": "2_workspace"
},
{
"command": "solutionExplorer.addProjectReference",
"when": "view == slnbrw && viewItem == project-cps",
Expand Down Expand Up @@ -1252,6 +1309,12 @@
"key": "delete",
"mac": "delete"
},
{
"command": "solutionExplorer.removeLocalTool",
"when": "view == slnexpl && viewItem == local-tool",
"key": "delete",
"mac": "delete"
},
{
"command": "solutionExplorer.removeProjectReference",
"when": "view == slnexpl && viewItem == project-referenced-project-cps",
Expand Down Expand Up @@ -1432,6 +1495,12 @@
"key": "delete",
"mac": "delete"
},
{
"command": "solutionExplorer.removeLocalTool",
"when": "view == slnbrw && viewItem == local-tool",
"key": "delete",
"mac": "delete"
},
{
"command": "solutionExplorer.removeProjectReference",
"when": "view == slnbrw && viewItem == project-referenced-project-cps",
Expand Down
3 changes: 3 additions & 0 deletions src/SolutionExplorerCommands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export class SolutionExplorerCommands {
this.commands['addExistingProject'] = new cmds.AddExistingProjectCommand(provider);
this.commands['addNewProject'] = new cmds.AddNewProjectCommand(provider);
this.commands['addPackage'] = new cmds.AddPackageCommand();
this.commands['addLocalTool'] = new cmds.AddLocalToolCommand();
this.commands['addProjectReference'] = new cmds.AddProjectReferenceCommand();
this.commands['addSolutionFile'] = new cmds.AddExistingFileToSolutionFolderCommand();
this.commands['build'] = new cmds.BuildCommand();
Expand All @@ -41,6 +42,7 @@ export class SolutionExplorerCommands {
this.commands['publish'] = new cmds.PublishCommand();
this.commands['refresh'] = new cmds.RefreshCommand(provider);
this.commands['removePackage'] = new cmds.RemovePackageCommand();
this.commands['removeLocalTool'] = new cmds.RemoveLocalToolCommand();
this.commands['removeProject'] = new cmds.RemoveProjectCommand();
this.commands['removeProjectReference'] = new cmds.RemoveProjectReferenceCommand();
this.commands['removeSolutionFolder'] = new cmds.RemoveSolutionFolderCommand();
Expand All @@ -53,6 +55,7 @@ export class SolutionExplorerCommands {
this.commands['showActiveFileInExplorer'] = new cmds.SelectActiveDocumentCommand(provider);
this.commands['test'] = new cmds.TestCommand();
this.commands['updatePackagesVersion'] = new cmds.UpdatePackagesVersionCommand();
this.commands['updateLocalToolsVersion'] = new cmds.UpdateLocalToolsVersionCommand();
this.commands['watchRun'] = new cmds.WatchRunCommand();
this.commands['openSolution'] = new cmds.OpenSolutionCommand(eventAggregator);
}
Expand Down
12 changes: 8 additions & 4 deletions src/SolutionTreeItemCollection.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { SolutionExplorerProvider } from "@SolutionExplorerProvider";
import { SolutionFile } from "@core/Solutions";
import { TreeItem, TreeItemFactory } from "@tree";

import { LocalTools } from "@core/Utilities/LocalTools";

export class SolutionTreeItemCollection {
private children: TreeItem[] | undefined = undefined;
Expand All @@ -28,13 +28,17 @@ export class SolutionTreeItemCollection {
}

public async addSolution(solutionPath: string, rootPath: string, solutionProvider: SolutionExplorerProvider): Promise<void> {
const solution = await SolutionFile.parse(solutionPath);
const item = await TreeItemFactory.createFromSolution(solutionProvider, solution, rootPath);
if (!this.children) {
this.children = [];
}
const solution = await SolutionFile.parse(solutionPath);

const localTools = LocalTools.getInstalledLocalTools(rootPath);
const localToolsItem = await TreeItemFactory.createFromLocalTools(solutionProvider, solution, rootPath, localTools);
this.children.push(localToolsItem);

this.children.push(item);
const solutionItem = await TreeItemFactory.createFromSolution(solutionProvider, solution, rootPath);
this.children.push(solutionItem);
}

public getLoadedChildTreeItemById(id: string): TreeItem | undefined {
Expand Down
24 changes: 24 additions & 0 deletions src/actions/AddLocalToolReference.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { TerminalCommand } from "@extensions/defaultTerminalCommands";
import { CustomTerminalAction } from "./base/CustomTerminalAction";

export class AddLocalToolReference extends CustomTerminalAction {
constructor(private readonly workspaceRoot: string, private readonly packageId: string, packageVersion?: string) {
super({
name: AddLocalToolReference.getTerminalCommand(workspaceRoot, packageId, packageVersion),
parameters: { packageId, packageVersion: packageVersion || "" },
workingFolder: workspaceRoot
});
}

public toString(): string {
return `Add local tool reference ${this.packageId} to workspace ${this.workspaceRoot}`;
}

private static getTerminalCommand(workspaceRoot: string, packageId: string, packageVersion: string | undefined): TerminalCommand {
if (packageVersion) {
return "addLocalToolReferenceWithVersion";
} else {
return "addLocalToolReference";
}
}
}
15 changes: 15 additions & 0 deletions src/actions/RemoveLocalToolReference.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { CustomTerminalAction } from "./base/CustomTerminalAction";

export class RemoveLocalToolReference extends CustomTerminalAction {
constructor(private readonly workspaceRoot: string, private readonly packageId: string) {
super({
name: "removeLocalToolReference",
parameters: { packageId },
workingFolder: workspaceRoot
});
}

public toString(): string {
return `Remove local tool reference ${this.packageId} from workspace ${this.workspaceRoot}`;
}
}
15 changes: 15 additions & 0 deletions src/actions/UpdateLocalToolReference.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { CustomTerminalAction } from "./base/CustomTerminalAction";

export class UpdateLocalToolReference extends CustomTerminalAction {
constructor(private readonly workspaceRoot: string, private readonly packageId: string) {
super({
name: 'updateLocalToolReference',
parameters: { packageId },
workingFolder: workspaceRoot
});
}

public toString(): string {
return `Update local tool reference ${this.packageId} in workspace ${this.workspaceRoot}`;
}
}
3 changes: 3 additions & 0 deletions src/actions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,6 @@ export * from "./Run";
export * from "./SelectActiveDocumentInTree";
export * from "./Test";
export * from "./Watch";
export * from './AddLocalToolReference'
export * from './RemoveLocalToolReference'
export * from './UpdateLocalToolReference'
30 changes: 30 additions & 0 deletions src/commands/AddLocalToolCommand.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import * as dialogs from '@extensions/dialogs';
import { TreeItem } from "@tree";
import { Action, AddLocalToolReference } from "@actions";
import { AddPackageCommand } from "@commands";

export class AddLocalToolCommand extends AddPackageCommand {
constructor() {
super('Add local tool');
}

public shouldRun(item: TreeItem): boolean {
return item && !!item.workspaceRoot;
}

public async getActions(item: TreeItem): Promise<Action[]> {
if (!item || !item.workspaceRoot) { return []; }

this.wizard = new dialogs.Wizard('Add local dotnet tool')
.selectOption('Select a feed', () => this.getNugetFeeds(item.workspaceRoot) )
.searchOption('Search a tool', search => this.searchAndMapNugetPackages(search, 'dotnettool'), '')
.selectOption('Select a tool', () => this.getCurrentPackageVersions(), () => this.getCurrentPackageDefaultVersion());

const parameters = await this.wizard.run();
if (!parameters) {
return [];
}

return [ new AddLocalToolReference(item.workspaceRoot, parameters[1], parameters[2]) ];
}
}
20 changes: 10 additions & 10 deletions src/commands/AddPackageCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import { Action, AddPackageReference } from "@actions";
import { ActionsCommand } from "@commands";

export class AddPackageCommand extends ActionsCommand {
private nugetFeeds: nuget.NugetFeed[] = [];
private lastNugetPackages: nuget.NugetPackage[] = [];
private wizard: dialogs.Wizard | undefined;
constructor() {
super('Add package');
protected nugetFeeds: nuget.NugetFeed[] = [];
protected lastNugetPackages: nuget.NugetPackage[] = [];
protected wizard: dialogs.Wizard | undefined;
constructor(title: string = 'Add package') {
super(title);
}

public shouldRun(item: TreeItem): boolean {
Expand All @@ -33,7 +33,7 @@ export class AddPackageCommand extends ActionsCommand {
return [ new AddPackageReference(item.project.fullPath, parameters[1], parameters[2]) ];
}

private async getNugetFeeds(projectFullPath: string): Promise<string[]> {
protected async getNugetFeeds(projectFullPath: string): Promise<string[]> {
this.nugetFeeds = await nuget.getNugetFeeds(projectFullPath);
if (this.nugetFeeds.length === 0) {
const defaultNugetFeed = await nuget.getDefaultNugetFeed();
Expand All @@ -43,7 +43,7 @@ export class AddPackageCommand extends ActionsCommand {
return this.nugetFeeds.map(f => f.name);
}

private async searchAndMapNugetPackages(packageName: string): Promise<string[]> {
protected async searchAndMapNugetPackages(packageName: string, packageType: string = ''): Promise<string[]> {
if (!this.wizard || !this.wizard.context || !this.wizard.context.results) {
return [];
}
Expand All @@ -52,11 +52,11 @@ export class AddPackageCommand extends ActionsCommand {
const feed = this.nugetFeeds.find(f => f.name === feedName);
if (!feed) { return []; }

this.lastNugetPackages = await nuget.searchNugetPackage(feed, packageName);
this.lastNugetPackages = await nuget.searchNugetPackage(feed, packageName, packageType);
return this.lastNugetPackages.map(p => p.id);
}

private getCurrentPackageVersions(): Promise<string[]> {
protected getCurrentPackageVersions(): Promise<string[]> {
if (!this.wizard || !this.wizard.context || !this.wizard.context.results) {
return Promise.resolve([]);
}
Expand All @@ -69,7 +69,7 @@ export class AddPackageCommand extends ActionsCommand {
return Promise.resolve(nugetPackage.versions.map(v => v.version).reverse());
}

private getCurrentPackageDefaultVersion(): Promise<string> {
protected getCurrentPackageDefaultVersion(): Promise<string> {
if (!this.wizard || !this.wizard.context || !this.wizard.context.results) { return Promise.resolve(""); }

const nugetPackage = this.lastNugetPackages.find(p => p.id === this.wizard?.context?.results[1]);
Expand Down
19 changes: 19 additions & 0 deletions src/commands/RemoveLocalToolCommand.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { TreeItem } from "@tree";
import { Action, RemoveLocalToolReference } from "@actions";
import { ActionsCommand } from "@commands";

export class RemoveLocalToolCommand extends ActionsCommand {
constructor() {
super('Remove local tool');
}

public shouldRun(item: TreeItem): boolean {
return !!item && !!item.workspaceRoot && !!item.path;
}

public async getActions(item: TreeItem): Promise<Action[]> {
if (!item || !item.workspaceRoot || !item.path) { return []; }

return [ new RemoveLocalToolReference(item.workspaceRoot, item.path) ];
}
}
20 changes: 20 additions & 0 deletions src/commands/UpdateLocalToolsVersionCommand.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Action, UpdateLocalToolReference } from "@actions";
import { ActionsCommand } from "@commands";
import { LocalToolsTreeItem } from "@tree/items/LocalToolsTreeItem";

export class UpdateLocalToolsVersionCommand extends ActionsCommand {
constructor() {
super('UpdateLocalToolsVersion');
}

public shouldRun(item: LocalToolsTreeItem): boolean {
return !!item && !!item.workspaceRoot;
}

public async getActions(item: LocalToolsTreeItem): Promise<Action[]> {
if (!item || !item.workspaceRoot) { return []; }

const references = item.getLocalTools();
return references.map(reference => new UpdateLocalToolReference(item.workspaceRoot, reference.name));
}
}
5 changes: 4 additions & 1 deletion src/commands/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,7 @@ export * from "./RunCommand";
export * from "./SelectActiveDocumentCommand";
export * from "./TestCommand";
export * from "./UpdatePackagesVersionCommand";
export * from "./WatchRunCommand";
export * from "./WatchRunCommand";
export * from "./AddLocalToolCommand";
export * from "./RemoveLocalToolCommand";
export * from "./UpdateLocalToolsVersionCommand";
Loading

0 comments on commit 3732cfe

Please sign in to comment.