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 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
using ICSharpCode.PackageManagement.Scripting; using ICSharpCode.PackageManagement.Scripting;
namespace ICSharpCode.PackageManagement namespace ICSharpCode.PackageManagement
@ -30,9 +31,17 @@ namespace ICSharpCode.PackageManagement
} }
public void Run(ProcessPackageAction action) public void Run(ProcessPackageAction action)
{
var actions = new List<ProcessPackageAction>();
actions.Add(action);
Run(actions);
}
public void Run(IEnumerable<ProcessPackageAction> actions)
{ {
CreateConsolePadIfConsoleHostIsNotRunning(); CreateConsolePadIfConsoleHostIsNotRunning();
RunAction(action); AddNewActionsToRun(actions);
InvokeProcessPackageActionsCmdlet();
} }
void CreateConsolePadIfConsoleHostIsNotRunning() void CreateConsolePadIfConsoleHostIsNotRunning()
@ -42,10 +51,11 @@ namespace ICSharpCode.PackageManagement
} }
} }
void RunAction(ProcessPackageAction action) void AddNewActionsToRun(IEnumerable<ProcessPackageAction> actions)
{ {
AddNewActionToRun(action); foreach (ProcessPackageAction action in actions) {
InvokeProcessPackageActionsCmdlet(); AddNewActionToRun(action);
}
} }
void AddNewActionToRun(ProcessPackageAction action) void AddNewActionToRun(ProcessPackageAction action)

2
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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
namespace ICSharpCode.PackageManagement namespace ICSharpCode.PackageManagement
{ {
public interface IPackageActionRunner public interface IPackageActionRunner
{ {
void Run(ProcessPackageAction action); void Run(ProcessPackageAction action);
void Run(IEnumerable<ProcessPackageAction> actions);
} }
} }

26
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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
using ICSharpCode.PackageManagement.Scripting; using ICSharpCode.PackageManagement.Scripting;
using NuGet; using NuGet;
@ -30,16 +31,37 @@ namespace ICSharpCode.PackageManagement
this.powerShellDetection = powerShellDetection; 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) public void Run(ProcessPackageAction action)
{ {
if (RunActionInConsole(action)) { if (ShouldRunActionInConsole(action)) {
consolePackageActionRunner.Run(action); consolePackageActionRunner.Run(action);
} else { } else {
action.Execute(); action.Execute();
} }
} }
bool RunActionInConsole(ProcessPackageAction action) bool ShouldRunActionInConsole(ProcessPackageAction action)
{ {
if (action.HasPackageScriptsToRun()) { if (action.HasPackageScriptsToRun()) {
if (powerShellDetection.IsPowerShell2Installed()) { if (powerShellDetection.IsPowerShell2Installed()) {

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

@ -36,11 +36,23 @@ namespace ICSharpCode.PackageManagement
IEnumerable<PackageReference> packageReferences, IEnumerable<PackageReference> packageReferences,
MSBuildBasedProject project) 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); IPackageManagementProject packageManagementProject = CreatePackageManagementProject(project);
foreach (PackageReference packageReference in packageReferences) { foreach (PackageReference packageReference in packageReferences) {
InstallPackageAction action = CreateInstallPackageAction(packageManagementProject, packageReference); InstallPackageAction action = CreateInstallPackageAction(packageManagementProject, packageReference);
packageActionRunner.Run(action); actions.Add(action);
} }
return actions;
} }
IPackageManagementProject CreatePackageManagementProject(MSBuildBasedProject project) IPackageManagementProject CreatePackageManagementProject(MSBuildBasedProject project)

80
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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections.Generic;
using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design; using ICSharpCode.PackageManagement.Design;
using ICSharpCode.PackageManagement.Scripting; using ICSharpCode.PackageManagement.Scripting;
@ -39,24 +40,34 @@ namespace PackageManagement.Tests
return action; return action;
} }
FakeInstallPackageAction RunInstallActionWithNoOperations() FakeInstallPackageAction RunInstallActionWithOneOperation()
{ {
FakeInstallPackageAction action = CreateInstallAction(); FakeInstallPackageAction action = CreateInstallActionWithOneOperation();
runner.Run(action); runner.Run(action);
return action; return action;
} }
FakeInstallPackageAction RunInstallActionWithOneOperation() FakeInstallPackageAction CreateInstallActionWithOneOperation()
{ {
var operations = new PackageOperation[] { var operations = new PackageOperation[] {
new PackageOperation(new FakePackage(), PackageAction.Install) new PackageOperation(new FakePackage(), PackageAction.Install)
}; };
FakeInstallPackageAction action = CreateInstallAction(); FakeInstallPackageAction action = CreateInstallAction();
action.Operations = operations; action.Operations = operations;
runner.Run(action);
return action; return action;
} }
List<FakeInstallPackageAction> RunTwoInstallActionsWithOneOperation()
{
var actions = new List<FakeInstallPackageAction>();
actions.Add(CreateInstallActionWithOneOperation());
actions.Add(CreateInstallActionWithOneOperation());
runner.Run(actions);
return actions;
}
void ConsoleHostIsRunning() void ConsoleHostIsRunning()
{ {
fakeConsoleHost.IsRunning = true; fakeConsoleHost.IsRunning = true;
@ -74,6 +85,16 @@ namespace PackageManagement.Tests
return action; return action;
} }
List<ProcessPackageAction> GetNextActionsToRun()
{
var actions = new List<ProcessPackageAction>();
ProcessPackageAction action = null;
while (actionsToRun.GetNextAction(out action)) {
actions.Add(action);
}
return actions;
}
[Test] [Test]
public void Run_ConsoleHostIsRunning_ActionAddedToPackageActionsToBeRun() public void Run_ConsoleHostIsRunning_ActionAddedToPackageActionsToBeRun()
{ {
@ -122,5 +143,54 @@ namespace PackageManagement.Tests
Assert.IsFalse(created); 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
public List<ProcessPackageAction> ActionsPassedToRun = public List<ProcessPackageAction> ActionsPassedToRun =
new List<ProcessPackageAction>(); 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
FakeInstallPackageAction fakeAction; FakeInstallPackageAction fakeAction;
FakePowerShellDetection powerShellDetection; FakePowerShellDetection powerShellDetection;
FakePackageManagementEvents fakeEvents; FakePackageManagementEvents fakeEvents;
List<FakeInstallPackageAction> fakeActions;
void CreateRunner() void CreateRunner()
{ {
fakeConsoleActionRunner = new FakePackageActionRunner(); fakeConsoleActionRunner = new FakePackageActionRunner();
powerShellDetection = new FakePowerShellDetection(); powerShellDetection = new FakePowerShellDetection();
fakeEvents = new FakePackageManagementEvents(); fakeEvents = new FakePackageManagementEvents();
fakeActions = new List<FakeInstallPackageAction>();
runner = new PackageActionRunner(fakeConsoleActionRunner, fakeEvents, powerShellDetection); runner = new PackageActionRunner(fakeConsoleActionRunner, fakeEvents, powerShellDetection);
} }
@ -33,6 +35,7 @@ namespace PackageManagement.Tests
var fakeProject = new FakePackageManagementProject(); var fakeProject = new FakePackageManagementProject();
fakeAction = new FakeInstallPackageAction(fakeProject); fakeAction = new FakeInstallPackageAction(fakeProject);
fakeAction.Operations = new PackageOperation[0]; fakeAction.Operations = new PackageOperation[0];
fakeActions.Add(fakeAction);
} }
void CreateInstallActionWithOnePowerShellScript() void CreateInstallActionWithOnePowerShellScript()
@ -47,6 +50,7 @@ namespace PackageManagement.Tests
operations.Add(operation); operations.Add(operation);
fakeAction.Operations = operations; fakeAction.Operations = operations;
fakeActions.Add(fakeAction);
} }
void Run() void Run()
@ -54,6 +58,11 @@ namespace PackageManagement.Tests
runner.Run(fakeAction); runner.Run(fakeAction);
} }
void RunMultipleActions()
{
runner.Run(fakeActions);
}
[Test] [Test]
public void Run_InstallActionHasNoPowerShellScripts_ActionIsExecutedDirectly() public void Run_InstallActionHasNoPowerShellScripts_ActionIsExecutedDirectly()
{ {
@ -121,5 +130,51 @@ namespace PackageManagement.Tests
Assert.AreEqual(expectedMessage, message); 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
AddPackageReference("PackageId", "1.3.4.5"); AddPackageReference("PackageId", "1.3.4.5");
InstallPackages(); 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"); var expectedVersion = new Version("1.3.4.5");
@ -80,7 +81,7 @@ namespace PackageManagement.Tests
IPackageRepository repository = fakeProjectFactory.RepositoryPassedToCreateProject; IPackageRepository repository = fakeProjectFactory.RepositoryPassedToCreateProject;
IPackageRepository expectedRepository = fakeRepositoryCache.FakeAggregateRepository; IPackageRepository expectedRepository = fakeRepositoryCache.FakeAggregateRepository;
Assert.AreEqual(expectedRepository, repository); Assert.AreEqual(expectedRepository, repository);
} }
} }
} }

Loading…
Cancel
Save