From 7f7c7ca0bcbc59a050f7b497a600cd2de0918b63 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sat, 18 Jun 2011 18:33:17 +0100 Subject: [PATCH] Install all NuGet packages in a project template using PowerShell console if any package contains a PowerShell script. --- .../Project/Src/ConsolePackageActionRunner.cs | 18 ++++- .../Project/Src/IPackageActionRunner.cs | 2 + .../Project/Src/PackageActionRunner.cs | 26 +++++- .../Project/Src/PackageReferenceInstaller.cs | 14 +++- .../Src/ConsolePackageActionRunnerTests.cs | 80 +++++++++++++++++-- .../Src/Helpers/FakePackageActionRunner.cs | 7 ++ .../Test/Src/PackageActionRunnerTests.cs | 55 +++++++++++++ .../Src/PackageReferenceInstallerTests.cs | 5 +- 8 files changed, 193 insertions(+), 14 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ConsolePackageActionRunner.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ConsolePackageActionRunner.cs index f5521b59f6..a06a01908f 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/ConsolePackageActionRunner.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ConsolePackageActionRunner.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using ICSharpCode.PackageManagement.Scripting; namespace ICSharpCode.PackageManagement @@ -30,9 +31,17 @@ namespace ICSharpCode.PackageManagement } public void Run(ProcessPackageAction action) + { + var actions = new List(); + actions.Add(action); + Run(actions); + } + + public void Run(IEnumerable actions) { CreateConsolePadIfConsoleHostIsNotRunning(); - RunAction(action); + AddNewActionsToRun(actions); + InvokeProcessPackageActionsCmdlet(); } void CreateConsolePadIfConsoleHostIsNotRunning() @@ -42,10 +51,11 @@ namespace ICSharpCode.PackageManagement } } - void RunAction(ProcessPackageAction action) + void AddNewActionsToRun(IEnumerable actions) { - AddNewActionToRun(action); - InvokeProcessPackageActionsCmdlet(); + foreach (ProcessPackageAction action in actions) { + AddNewActionToRun(action); + } } void AddNewActionToRun(ProcessPackageAction action) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageActionRunner.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageActionRunner.cs index d590c3da4a..27d2ee38c8 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageActionRunner.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageActionRunner.cs @@ -2,11 +2,13 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; namespace ICSharpCode.PackageManagement { public interface IPackageActionRunner { void Run(ProcessPackageAction action); + void Run(IEnumerable actions); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs index 5118f4c50f..5dd06bf996 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using ICSharpCode.PackageManagement.Scripting; using NuGet; @@ -30,16 +31,37 @@ namespace ICSharpCode.PackageManagement this.powerShellDetection = powerShellDetection; } + public void Run(IEnumerable actions) + { + if (ShouldRunActionsInConsole(actions)) { + consolePackageActionRunner.Run(actions); + } else { + foreach (ProcessPackageAction action in actions) { + action.Execute(); + } + } + } + + bool ShouldRunActionsInConsole(IEnumerable actions) + { + foreach (ProcessPackageAction action in actions) { + if (ShouldRunActionInConsole(action)) { + return true; + } + } + return false; + } + public void Run(ProcessPackageAction action) { - if (RunActionInConsole(action)) { + if (ShouldRunActionInConsole(action)) { consolePackageActionRunner.Run(action); } else { action.Execute(); } } - bool RunActionInConsole(ProcessPackageAction action) + bool ShouldRunActionInConsole(ProcessPackageAction action) { if (action.HasPackageScriptsToRun()) { if (powerShellDetection.IsPowerShell2Installed()) { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageReferenceInstaller.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageReferenceInstaller.cs index 61a1ed9eca..34e325e2f8 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageReferenceInstaller.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageReferenceInstaller.cs @@ -36,11 +36,23 @@ namespace ICSharpCode.PackageManagement IEnumerable packageReferences, MSBuildBasedProject project) { + List actions = GetInstallPackageActions(packageReferences, project); + packageActionRunner.Run(actions); + } + + List GetInstallPackageActions( + IEnumerable packageReferences, + MSBuildBasedProject project) + { + var actions = new List(); + IPackageManagementProject packageManagementProject = CreatePackageManagementProject(project); foreach (PackageReference packageReference in packageReferences) { InstallPackageAction action = CreateInstallPackageAction(packageManagementProject, packageReference); - packageActionRunner.Run(action); + actions.Add(action); } + + return actions; } IPackageManagementProject CreatePackageManagementProject(MSBuildBasedProject project) diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/ConsolePackageActionRunnerTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/ConsolePackageActionRunnerTests.cs index c4a27ca969..162adb429c 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/ConsolePackageActionRunnerTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/ConsolePackageActionRunnerTests.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement.Design; using ICSharpCode.PackageManagement.Scripting; @@ -39,24 +40,34 @@ namespace PackageManagement.Tests return action; } - FakeInstallPackageAction RunInstallActionWithNoOperations() + FakeInstallPackageAction RunInstallActionWithOneOperation() { - FakeInstallPackageAction action = CreateInstallAction(); + FakeInstallPackageAction action = CreateInstallActionWithOneOperation(); runner.Run(action); return action; } - FakeInstallPackageAction RunInstallActionWithOneOperation() + FakeInstallPackageAction CreateInstallActionWithOneOperation() { var operations = new PackageOperation[] { new PackageOperation(new FakePackage(), PackageAction.Install) }; - FakeInstallPackageAction action = CreateInstallAction(); + FakeInstallPackageAction action = CreateInstallAction(); action.Operations = operations; - runner.Run(action); return action; } + List RunTwoInstallActionsWithOneOperation() + { + var actions = new List(); + actions.Add(CreateInstallActionWithOneOperation()); + actions.Add(CreateInstallActionWithOneOperation()); + + runner.Run(actions); + + return actions; + } + void ConsoleHostIsRunning() { fakeConsoleHost.IsRunning = true; @@ -74,6 +85,16 @@ namespace PackageManagement.Tests return action; } + List GetNextActionsToRun() + { + var actions = new List(); + ProcessPackageAction action = null; + while (actionsToRun.GetNextAction(out action)) { + actions.Add(action); + } + return actions; + } + [Test] public void Run_ConsoleHostIsRunning_ActionAddedToPackageActionsToBeRun() { @@ -122,5 +143,54 @@ namespace PackageManagement.Tests Assert.IsFalse(created); } + + [Test] + public void Run_TwoActionsToRunAndConsoleHostIsNotRunning_ConsolePadIsCreated() + { + CreateRunner(); + ConsoleHostIsNotRunning(); + RunTwoInstallActionsWithOneOperation(); + + bool created = fakeWorkbench.IsCreateConsolePadCalled; + + Assert.IsTrue(created); + } + + [Test] + public void Run_TwoActionsToRunAndConsoleHostIsRunning_ConsolePadIsNotCreated() + { + CreateRunner(); + ConsoleHostIsRunning(); + RunTwoInstallActionsWithOneOperation(); + + bool created = fakeWorkbench.IsCreateConsolePadCalled; + + Assert.IsFalse(created); + } + + [Test] + public void Run_TwoActionsToRunAndConsoleHostIsRunning_CommandPassedToConsoleHostToProcessPackageActions() + { + CreateRunner(); + ConsoleHostIsRunning(); + RunTwoInstallActionsWithOneOperation(); + + string command = fakeConsoleHost.FirstCommandExecuted; + string expectedCommand = "Invoke-ProcessPackageActions"; + + Assert.AreEqual(expectedCommand, command); + } + + [Test] + public void Run_TwoActionsToRunAndConsoleHostIsRunning_ActionsAddedToPackageActionsToBeRun() + { + CreateRunner(); + ConsoleHostIsRunning(); + List expectedActions = RunTwoInstallActionsWithOneOperation(); + + List actionsAdded = GetNextActionsToRun(); + + CollectionAssert.AreEqual(expectedActions, actionsAdded); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageActionRunner.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageActionRunner.cs index 2ae7ec4799..6e83c6949a 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageActionRunner.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageActionRunner.cs @@ -19,5 +19,12 @@ namespace PackageManagement.Tests.Helpers public List ActionsPassedToRun = new List(); + + public void Run(IEnumerable actions) + { + ActionsRunInOneCall = actions; + } + + public IEnumerable ActionsRunInOneCall; } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs index 74e29a7757..693dfda59e 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs @@ -19,12 +19,14 @@ namespace PackageManagement.Tests FakeInstallPackageAction fakeAction; FakePowerShellDetection powerShellDetection; FakePackageManagementEvents fakeEvents; + List fakeActions; void CreateRunner() { fakeConsoleActionRunner = new FakePackageActionRunner(); powerShellDetection = new FakePowerShellDetection(); fakeEvents = new FakePackageManagementEvents(); + fakeActions = new List(); runner = new PackageActionRunner(fakeConsoleActionRunner, fakeEvents, powerShellDetection); } @@ -33,6 +35,7 @@ namespace PackageManagement.Tests var fakeProject = new FakePackageManagementProject(); fakeAction = new FakeInstallPackageAction(fakeProject); fakeAction.Operations = new PackageOperation[0]; + fakeActions.Add(fakeAction); } void CreateInstallActionWithOnePowerShellScript() @@ -47,6 +50,7 @@ namespace PackageManagement.Tests operations.Add(operation); fakeAction.Operations = operations; + fakeActions.Add(fakeAction); } void Run() @@ -54,6 +58,11 @@ namespace PackageManagement.Tests runner.Run(fakeAction); } + void RunMultipleActions() + { + runner.Run(fakeActions); + } + [Test] public void Run_InstallActionHasNoPowerShellScripts_ActionIsExecutedDirectly() { @@ -121,5 +130,51 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedMessage, message); } + + [Test] + public void Run_TwoInstallActionsWithoutPowerShellScripts_ActionsAreExecutedDirectly() + { + CreateRunner(); + CreateInstallActionWithNoPowerShellScripts(); + CreateInstallActionWithNoPowerShellScripts(); + RunMultipleActions(); + + bool firstActionIsExecuted = fakeActions[0].IsExecuteCalled; + bool secondActionIsExecuted = fakeActions[1].IsExecuteCalled; + + Assert.IsTrue(firstActionIsExecuted); + Assert.IsTrue(secondActionIsExecuted); + } + + [Test] + public void Run_TwoInstallActionsAndSecondHasOnePowerShellScript_AllActionsPassedToConsoleToRun() + { + CreateRunner(); + CreateInstallActionWithNoPowerShellScripts(); + CreateInstallActionWithOnePowerShellScript(); + powerShellDetection.IsPowerShell2InstalledReturnValue = true; + RunMultipleActions(); + + IEnumerable actions = fakeConsoleActionRunner.ActionsRunInOneCall; + + CollectionAssert.AreEqual(fakeActions, actions); + } + + [Test] + public void Run_TwoInstallActionsBothWithOnePowerShellScriptsAndPowerShellIsNotInstalled_ActionsAreExecutedDirectly() + { + CreateRunner(); + CreateInstallActionWithOnePowerShellScript(); + CreateInstallActionWithOnePowerShellScript(); + powerShellDetection.IsPowerShell2InstalledReturnValue = false; + + RunMultipleActions(); + + bool firstActionIsExecuted = fakeActions[0].IsExecuteCalled; + bool secondActionIsExecuted = fakeActions[1].IsExecuteCalled; + + Assert.IsTrue(firstActionIsExecuted); + Assert.IsTrue(secondActionIsExecuted); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs index 924b8573ca..382126c806 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs @@ -49,7 +49,8 @@ namespace PackageManagement.Tests AddPackageReference("PackageId", "1.3.4.5"); InstallPackages(); - var action = fakeActionRunner.ActionPassedToRun as InstallPackageAction; + var actions = new List(fakeActionRunner.ActionsRunInOneCall); + var action = actions[0] as InstallPackageAction; var expectedVersion = new Version("1.3.4.5"); @@ -80,7 +81,7 @@ namespace PackageManagement.Tests IPackageRepository repository = fakeProjectFactory.RepositoryPassedToCreateProject; IPackageRepository expectedRepository = fakeRepositoryCache.FakeAggregateRepository; - Assert.AreEqual(expectedRepository, repository); + Assert.AreEqual(expectedRepository, repository); } } }