Browse Source

If PowerShell is not installed the Add Package Reference dialog will not install the package using the console.

pull/15/head
Matt Ward 15 years ago
parent
commit
52097c9e0d
  1. 39
      src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs
  2. 2
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs
  3. 15
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellDetection.cs
  4. 38
      src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs

39
src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs

@ -2,25 +2,60 @@ @@ -2,25 +2,60 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.PackageManagement.Scripting;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public class PackageActionRunner : IPackageActionRunner
{
IPackageActionRunner consolePackageActionRunner;
IPackageManagementEvents packageManagementEvents;
IPowerShellDetection powerShellDetection;
public PackageActionRunner(IPackageActionRunner consolePackageActionRunner)
public PackageActionRunner(
IPackageActionRunner consolePackageActionRunner,
IPackageManagementEvents packageManagementEvents)
: this(consolePackageActionRunner, packageManagementEvents, new PowerShellDetection())
{
}
public PackageActionRunner(
IPackageActionRunner consolePackageActionRunner,
IPackageManagementEvents packageManagementEvents,
IPowerShellDetection powerShellDetection)
{
this.consolePackageActionRunner = consolePackageActionRunner;
this.packageManagementEvents = packageManagementEvents;
this.powerShellDetection = powerShellDetection;
}
public void Run(ProcessPackageAction action)
{
if (action.HasPackageScriptsToRun()) {
if (RunActionInConsole(action)) {
consolePackageActionRunner.Run(action);
} else {
action.Execute();
}
}
bool RunActionInConsole(ProcessPackageAction action)
{
if (action.HasPackageScriptsToRun()) {
if (powerShellDetection.IsPowerShell2Installed()) {
return true;
} else {
ReportPowerShellIsNotInstalled();
}
}
return false;
}
void ReportPowerShellIsNotInstalled()
{
string message =
"PowerShell is not installed. PowerShell scripts will not be run for the package.";
packageManagementEvents.OnPackageOperationMessageLogged(MessageLevel.Warning, message);
}
}
}

2
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs

@ -32,7 +32,7 @@ namespace ICSharpCode.PackageManagement @@ -32,7 +32,7 @@ namespace ICSharpCode.PackageManagement
runPackageInitializationScripts = new RunPackageInitializationScriptsOnSolutionOpen(projectService);
resetPowerShellWorkingDirectory = new ResetPowerShellWorkingDirectoryOnSolutionClosed(projectService, ConsoleHost);
var consolePackageActionRunner = new ConsolePackageActionRunner(ConsoleHost, packageActionsToRun);
packageActionRunner = new PackageActionRunner(consolePackageActionRunner);
packageActionRunner = new PackageActionRunner(consolePackageActionRunner, packageManagementEvents);
}
public static PackageManagementOptions Options {

15
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellDetection.cs

@ -12,17 +12,26 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -12,17 +12,26 @@ namespace ICSharpCode.PackageManagement.Scripting
@"SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine";
public static readonly string PowerShellVersionRegistryValueName =
"PowerShellVersion2";
"PowerShellVersion";
public bool? installed;
public bool IsPowerShell2Installed()
{
if (!installed.HasValue) {
CheckIfPowerShell2IsInstalled();
}
return installed.Value;
}
void CheckIfPowerShell2IsInstalled()
{
RegistryKey key = OpenPowerShellRegistryKey();
if (key != null) {
using (key) {
return IsPowerShell2Installed(key);
installed = IsPowerShell2Installed(key);
}
}
return false;
}
RegistryKey OpenPowerShellRegistryKey()

38
src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs

@ -17,11 +17,15 @@ namespace PackageManagement.Tests @@ -17,11 +17,15 @@ namespace PackageManagement.Tests
FakePackageActionRunner fakeConsoleActionRunner;
PackageActionRunner runner;
FakeInstallPackageAction fakeAction;
FakePowerShellDetection powerShellDetection;
FakePackageManagementEvents fakeEvents;
void CreateRunner()
{
fakeConsoleActionRunner = new FakePackageActionRunner();
runner = new PackageActionRunner(fakeConsoleActionRunner);
powerShellDetection = new FakePowerShellDetection();
fakeEvents = new FakePackageManagementEvents();
runner = new PackageActionRunner(fakeConsoleActionRunner, fakeEvents, powerShellDetection);
}
void CreateInstallActionWithNoPowerShellScripts()
@ -67,6 +71,7 @@ namespace PackageManagement.Tests @@ -67,6 +71,7 @@ namespace PackageManagement.Tests
{
CreateRunner();
CreateInstallActionWithOnePowerShellScript();
powerShellDetection.IsPowerShell2InstalledReturnValue = true;
Run();
ProcessPackageAction action = fakeConsoleActionRunner.ActionPassedToRun;
@ -79,11 +84,42 @@ namespace PackageManagement.Tests @@ -79,11 +84,42 @@ namespace PackageManagement.Tests
{
CreateRunner();
CreateInstallActionWithOnePowerShellScript();
powerShellDetection.IsPowerShell2InstalledReturnValue = true;
Run();
bool executed = fakeAction.IsExecuteCalled;
Assert.IsFalse(executed);
}
[Test]
public void Run_InstallActionHasOnePowerShellScriptAndPowerShellIsNotInstalled_ActionIsExecutedDirectly()
{
CreateRunner();
CreateInstallActionWithOnePowerShellScript();
powerShellDetection.IsPowerShell2InstalledReturnValue = false;
Run();
bool executed = fakeAction.IsExecuteCalled;
Assert.IsTrue(executed);
}
[Test]
public void Run_InstallActionHasOnePowerShellScriptAndPowerShellIsNotInstalled_MessageIsReportedThatPowerShellScriptsCannotBeRun()
{
CreateRunner();
CreateInstallActionWithOnePowerShellScript();
powerShellDetection.IsPowerShell2InstalledReturnValue = false;
Run();
string message = fakeEvents.FormattedStringPassedToOnPackageOperationMessageLogged;
string expectedMessage =
"PowerShell is not installed. PowerShell scripts will not be run for the package.";
Assert.AreEqual(expectedMessage, message);
}
}
}

Loading…
Cancel
Save