From 52097c9e0d320c10bb6157527ba0f5ad1f80ead0 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 28 May 2011 17:05:43 +0100 Subject: [PATCH] If PowerShell is not installed the Add Package Reference dialog will not install the package using the console. --- .../Project/Src/PackageActionRunner.cs | 39 ++++++++++++++++++- .../Project/Src/PackageManagementServices.cs | 2 +- .../Src/Scripting/PowerShellDetection.cs | 15 +++++-- .../Test/Src/PackageActionRunnerTests.cs | 38 +++++++++++++++++- 4 files changed, 87 insertions(+), 7 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs index 97e94a3fb6..5118f4c50f 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs @@ -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); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs index e9a228a74f..1ce19ede3a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs @@ -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 { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellDetection.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellDetection.cs index e39c34ecc8..3787a7cc1f 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellDetection.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellDetection.cs @@ -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() diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs index 5e08877fd5..74e29a7757 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs @@ -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 { CreateRunner(); CreateInstallActionWithOnePowerShellScript(); + powerShellDetection.IsPowerShell2InstalledReturnValue = true; Run(); ProcessPackageAction action = fakeConsoleActionRunner.ActionPassedToRun; @@ -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); + } } }