Skip to content

Fix plugin remove command for invalid plugins #1590

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 10, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions lib/commands/plugin/remove-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@

export class RemovePluginCommand implements ICommand {
constructor(private $pluginsService: IPluginsService,
private $errors: IErrors) { }
private $errors: IErrors,
private $logger: ILogger,
private $projectData: IProjectData) { }

execute(args: string[]): IFuture<void> {
return this.$pluginsService.remove(args[0]);
Expand All @@ -15,9 +17,18 @@ export class RemovePluginCommand implements ICommand {
this.$errors.fail("You must specify plugin name.");
}

let installedPlugins = this.$pluginsService.getAllInstalledPlugins().wait();
let pluginNames: string[] = [];
try {
// try installing the plugins, so we can get information from node_modules about their native code, libs, etc.
let installedPlugins = this.$pluginsService.getAllInstalledPlugins().wait();
pluginNames = installedPlugins.map(pl => pl.name);
} catch(err) {
this.$logger.trace("Error while installing plugins. Error is:", err);
pluginNames = _.keys(this.$projectData.dependencies);
}

let pluginName = args[0].toLowerCase();
if(!_.any(installedPlugins, (plugin: IPluginData) => plugin.name.toLowerCase() === pluginName)) {
if(!_.any(pluginNames, name => name.toLowerCase() === pluginName)) {
this.$errors.failWithoutHelp(`Plugin "${pluginName}" is not installed.`);
}

Expand Down
8 changes: 4 additions & 4 deletions lib/definitions/plugins.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ interface IPluginVariablesService {
savePluginVariablesInProjectFile(pluginData: IPluginData): IFuture<void>;
/**
* Removes plugin variables from project package.json file.
* @param {IPluginData} pluginData for the plugin.
* @param {string} pluginName Name of the plugin.
* @return {IFuture<void>}
*/
removePluginVariablesFromProjectFile(pluginData: IPluginData): IFuture<void>;
removePluginVariablesFromProjectFile(pluginName: string): IFuture<void>;
/**
* Replaces all plugin variables with their corresponding values.
* @param {IPluginData} pluginData for the plugin.
Expand All @@ -59,10 +59,10 @@ interface IPluginVariablesService {
interpolate(pluginData: IPluginData, pluginConfigurationFilePath: string): IFuture<void>;
/**
* Returns the
* @param {IPluginData} pluginData for the plugin.
* @param {string} pluginName for the plugin.
* @return {IFuture<string>} returns the changed plugin configuration file content.
*/
getPluginVariablePropertyName(pluginData: IPluginData): string;
getPluginVariablePropertyName(pluginName: string): string;

}

Expand Down
12 changes: 6 additions & 6 deletions lib/services/plugin-variables-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ export class PluginVariablesService implements IPluginVariablesService {
private $prompter: IPrompter,
private $fs: IFileSystem) { }

public getPluginVariablePropertyName(pluginData: IPluginData): string {
return `${pluginData.name}-${PluginVariablesService.PLUGIN_VARIABLES_KEY}`;
public getPluginVariablePropertyName(pluginName: string): string {
return `${pluginName}-${PluginVariablesService.PLUGIN_VARIABLES_KEY}`;
}

public savePluginVariablesInProjectFile(pluginData: IPluginData): IFuture<void> {
Expand All @@ -29,14 +29,14 @@ export class PluginVariablesService implements IPluginVariablesService {

if(!_.isEmpty(values)) {
this.$projectDataService.initialize(this.$projectData.projectDir);
this.$projectDataService.setValue(this.getPluginVariablePropertyName(pluginData), values).wait();
this.$projectDataService.setValue(this.getPluginVariablePropertyName(pluginData.name), values).wait();
}
}).future<void>()();
}

public removePluginVariablesFromProjectFile(pluginData: IPluginData): IFuture<void> {
public removePluginVariablesFromProjectFile(pluginName: string): IFuture<void> {
this.$projectDataService.initialize(this.$projectData.projectDir);
return this.$projectDataService.removeProperty(this.getPluginVariablePropertyName(pluginData));
return this.$projectDataService.removeProperty(this.getPluginVariablePropertyName(pluginName));
}

public interpolatePluginVariables(pluginData: IPluginData, pluginConfigurationFilePath: string): IFuture<void> {
Expand Down Expand Up @@ -115,7 +115,7 @@ export class PluginVariablesService implements IPluginVariablesService {
variableData.name = pluginVariableName;

this.$projectDataService.initialize(this.$projectData.projectDir);
let pluginVariableValues = this.$projectDataService.getValue(this.getPluginVariablePropertyName(pluginData)).wait();
let pluginVariableValues = this.$projectDataService.getValue(this.getPluginVariablePropertyName(pluginData.name)).wait();
variableData.value = pluginVariableValues ? pluginVariableValues[pluginVariableName] : undefined;

return variableData;
Expand Down
12 changes: 7 additions & 5 deletions lib/services/plugins-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export class PluginsService implements IPluginsService {
} catch(err) {
// Revert package.json
this.$projectDataService.initialize(this.$projectData.projectDir);
this.$projectDataService.removeProperty(this.$pluginVariablesService.getPluginVariablePropertyName(pluginData)).wait();
this.$projectDataService.removeProperty(this.$pluginVariablesService.getPluginVariablePropertyName(pluginData.name)).wait();
this.$projectDataService.removeDependency(pluginData.name).wait();

throw err;
Expand All @@ -68,12 +68,10 @@ export class PluginsService implements IPluginsService {
let pluginData = this.convertToPluginData(this.getNodeModuleData(pluginName).wait());

platformData.platformProjectService.removePluginNativeCode(pluginData).wait();

if(pluginData.pluginVariables) {
this.$pluginVariablesService.removePluginVariablesFromProjectFile(pluginData).wait();
}
}).future<void>()();
};

this.$pluginVariablesService.removePluginVariablesFromProjectFile(pluginName.toLowerCase()).wait();
this.executeForAllInstalledPlatforms(removePluginNativeCodeAction).wait();

this.executeNpmCommand(PluginsService.UNINSTALL_COMMAND_NAME, pluginName).wait();
Expand Down Expand Up @@ -224,6 +222,10 @@ export class PluginsService implements IPluginsService {
result = this.$npm.install(npmCommandArguments, this.$projectData.projectDir, PluginsService.NPM_CONFIG).wait();
} else if(npmCommandName === PluginsService.UNINSTALL_COMMAND_NAME) {
result = this.$npm.uninstall(npmCommandArguments, PluginsService.NPM_CONFIG, this.$projectData.projectDir).wait();
if(!result || !result.length) {
// indicates something's wrong with the data in package.json, for example version of the plugin that we are trying to remove is invalid.
return npmCommandArguments.toLowerCase();
}
}

return this.parseNpmCommandResult(result);
Expand Down