Browse Source

Install all NuGet packages in a project template using PowerShell console if any package contains a PowerShell script.

pull/16/merge
Matt Ward 14 years ago
parent
commit
7f7c7ca0bc
  1. 18
      src/AddIns/Misc/PackageManagement/Project/Src/ConsolePackageActionRunner.cs
  2. 2
      src/AddIns/Misc/PackageManagement/Project/Src/IPackageActionRunner.cs
  3. 26
      src/AddIns/Misc/PackageManagement/Project/Src/PackageActionRunner.cs
  4. 14
      src/AddIns/Misc/PackageManagement/Project/Src/PackageReferenceInstaller.cs
  5. 80
      src/AddIns/Misc/PackageManagement/Test/Src/ConsolePackageActionRunnerTests.cs
  6. 7
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageActionRunner.cs
  7. 55
      src/AddIns/Misc/PackageManagement/Test/Src/PackageActionRunnerTests.cs
  8. 5
      src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs

18
src/AddIns/Misc/PackageManagement/Project/Src/ConsolePackageActionRunner.cs

@ -2,6 +2,7 @@ @@ -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 @@ -30,9 +31,17 @@ namespace ICSharpCode.PackageManagement
}
public void Run(ProcessPackageAction action)
{
var actions = new List<ProcessPackageAction>();
actions.Add(action);
Run(actions);
}
public void Run(IEnumerable<ProcessPackageAction> actions)
{
CreateConsolePadIfConsoleHostIsNotRunning();
RunAction(action);
AddNewActionsToRun(actions);
InvokeProcessPackageActionsCmdlet();
}
void CreateConsolePadIfConsoleHostIsNotRunning()
@ -42,10 +51,11 @@ namespace ICSharpCode.PackageManagement @@ -42,10 +51,11 @@ namespace ICSharpCode.PackageManagement
}
}
void RunAction(ProcessPackageAction action)
void AddNewActionsToRun(IEnumerable<ProcessPackageAction> actions)
{
AddNewActionToRun(action);
InvokeProcessPackageActionsCmdlet();
foreach (ProcessPackageAction action in actions) {
AddNewActionToRun(action);
}
}
void AddNewActionToRun(ProcessPackageAction action)

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

@ -2,11 +2,13 @@ @@ -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<ProcessPackageAction> actions);
}
}

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

@ -2,6 +2,7 @@ @@ -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 @@ -30,16 +31,37 @@ namespace ICSharpCode.PackageManagement
this.powerShellDetection = powerShellDetection;
}
public void Run(IEnumerable<ProcessPackageAction> actions)
{
if (ShouldRunActionsInConsole(actions)) {
consolePackageActionRunner.Run(actions);
} else {
foreach (ProcessPackageAction action in actions) {
action.Execute();
}
}
}
bool ShouldRunActionsInConsole(IEnumerable<ProcessPackageAction> 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()) {

14
src/AddIns/Misc/PackageManagement/Project/Src/PackageReferenceInstaller.cs

@ -36,11 +36,23 @@ namespace ICSharpCode.PackageManagement @@ -36,11 +36,23 @@ namespace ICSharpCode.PackageManagement
IEnumerable<PackageReference> packageReferences,
MSBuildBasedProject project)
{
List<InstallPackageAction> actions = GetInstallPackageActions(packageReferences, project);
packageActionRunner.Run(actions);
}
List<InstallPackageAction> GetInstallPackageActions(
IEnumerable<PackageReference> packageReferences,
MSBuildBasedProject project)
{
var actions = new List<InstallPackageAction>();
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)

80
src/AddIns/Misc/PackageManagement/Test/Src/ConsolePackageActionRunnerTests.cs

@ -2,6 +2,7 @@ @@ -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 @@ -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<FakeInstallPackageAction> RunTwoInstallActionsWithOneOperation()
{
var actions = new List<FakeInstallPackageAction>();
actions.Add(CreateInstallActionWithOneOperation());
actions.Add(CreateInstallActionWithOneOperation());
runner.Run(actions);
return actions;
}
void ConsoleHostIsRunning()
{
fakeConsoleHost.IsRunning = true;
@ -74,6 +85,16 @@ namespace PackageManagement.Tests @@ -74,6 +85,16 @@ namespace PackageManagement.Tests
return action;
}
List<ProcessPackageAction> GetNextActionsToRun()
{
var actions = new List<ProcessPackageAction>();
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 @@ -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<FakeInstallPackageAction> expectedActions = RunTwoInstallActionsWithOneOperation();
List<ProcessPackageAction> actionsAdded = GetNextActionsToRun();
CollectionAssert.AreEqual(expectedActions, actionsAdded);
}
}
}

7
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageActionRunner.cs

@ -19,5 +19,12 @@ namespace PackageManagement.Tests.Helpers @@ -19,5 +19,12 @@ namespace PackageManagement.Tests.Helpers
public List<ProcessPackageAction> ActionsPassedToRun =
new List<ProcessPackageAction>();
public void Run(IEnumerable<ProcessPackageAction> actions)
{
ActionsRunInOneCall = actions;
}
public IEnumerable<ProcessPackageAction> ActionsRunInOneCall;
}
}

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

@ -19,12 +19,14 @@ namespace PackageManagement.Tests @@ -19,12 +19,14 @@ namespace PackageManagement.Tests
FakeInstallPackageAction fakeAction;
FakePowerShellDetection powerShellDetection;
FakePackageManagementEvents fakeEvents;
List<FakeInstallPackageAction> fakeActions;
void CreateRunner()
{
fakeConsoleActionRunner = new FakePackageActionRunner();
powerShellDetection = new FakePowerShellDetection();
fakeEvents = new FakePackageManagementEvents();
fakeActions = new List<FakeInstallPackageAction>();
runner = new PackageActionRunner(fakeConsoleActionRunner, fakeEvents, powerShellDetection);
}
@ -33,6 +35,7 @@ namespace PackageManagement.Tests @@ -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 @@ -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 @@ -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 @@ -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<ProcessPackageAction> 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);
}
}
}

5
src/AddIns/Misc/PackageManagement/Test/Src/PackageReferenceInstallerTests.cs

@ -49,7 +49,8 @@ namespace PackageManagement.Tests @@ -49,7 +49,8 @@ namespace PackageManagement.Tests
AddPackageReference("PackageId", "1.3.4.5");
InstallPackages();
var action = fakeActionRunner.ActionPassedToRun as InstallPackageAction;
var actions = new List<ProcessPackageAction>(fakeActionRunner.ActionsRunInOneCall);
var action = actions[0] as InstallPackageAction;
var expectedVersion = new Version("1.3.4.5");
@ -80,7 +81,7 @@ namespace PackageManagement.Tests @@ -80,7 +81,7 @@ namespace PackageManagement.Tests
IPackageRepository repository = fakeProjectFactory.RepositoryPassedToCreateProject;
IPackageRepository expectedRepository = fakeRepositoryCache.FakeAggregateRepository;
Assert.AreEqual(expectedRepository, repository);
Assert.AreEqual(expectedRepository, repository);
}
}
}

Loading…
Cancel
Save