diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj
index 67a029a19d..d92c43fd4f 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/PackageManagement.Cmdlets.csproj
@@ -49,6 +49,7 @@
+
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeRunPackageScriptsCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeRunPackageScriptsCmdlet.cs
new file mode 100644
index 0000000000..7d91478ac4
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/InvokeRunPackageScriptsCmdlet.cs
@@ -0,0 +1,51 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using System.Management.Automation;
+using ICSharpCode.PackageManagement.Scripting;
+
+namespace ICSharpCode.PackageManagement.Cmdlets
+{
+ [Cmdlet(VerbsLifecycle.Invoke, "RunPackageScripts", DefaultParameterSetName = ParameterAttribute.AllParameterSets)]
+ public class InvokeRunPackageScriptsCmdlet : PackageManagementCmdlet
+ {
+ PackageScriptsToRun scriptsToBeRun;
+
+ public InvokeRunPackageScriptsCmdlet()
+ : this(
+ PackageManagementServices.PackageScriptsToRun,
+ PackageManagementServices.ConsoleHost,
+ null)
+ {
+ }
+
+ public InvokeRunPackageScriptsCmdlet(
+ PackageScriptsToRun scriptsToBeRun,
+ IPackageManagementConsoleHost consoleHost,
+ ICmdletTerminatingError terminatingError)
+ : base(consoleHost, terminatingError)
+ {
+ this.scriptsToBeRun = scriptsToBeRun;
+ }
+
+ protected override void ProcessRecord()
+ {
+ RunPackageScripts();
+ }
+
+ void RunPackageScripts()
+ {
+ IPackageScript script = null;
+ while (GetNextScript(out script)) {
+ Run(script);
+ }
+ }
+
+ bool GetNextScript(out IPackageScript script)
+ {
+ script = scriptsToBeRun.GetNextScript();
+ return script != null;
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs
index df1575589f..ba47bbff9f 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/PackageManagementCmdlet.cs
@@ -99,7 +99,9 @@ namespace ICSharpCode.PackageManagement.Cmdlets
public void Run(IPackageScript script)
{
- script.Execute(this);
+ if (script.Exists()) {
+ script.Execute(this);
+ }
}
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeRunPackageScriptsCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeRunPackageScriptsCmdlet.cs
new file mode 100644
index 0000000000..2bd382ed3e
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Helpers/TestableInvokeRunPackageScriptsCmdlet.cs
@@ -0,0 +1,41 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using ICSharpCode.PackageManagement.Cmdlets;
+using ICSharpCode.PackageManagement.Scripting;
+using PackageManagement.Tests.Helpers;
+
+namespace PackageManagement.Cmdlets.Tests.Helpers
+{
+ public class TestableInvokeRunPackageScriptsCmdlet : InvokeRunPackageScriptsCmdlet
+ {
+ public FakeCmdletTerminatingError FakeCmdletTerminatingError;
+ public FakePackageManagementConsoleHost FakePackageManagementConsoleHost;
+ public PackageScriptsToRun ScriptsToBeRun;
+
+ public TestableInvokeRunPackageScriptsCmdlet()
+ : this(
+ new PackageScriptsToRun(),
+ new FakePackageManagementConsoleHost(),
+ new FakeCmdletTerminatingError())
+ {
+ }
+
+ public TestableInvokeRunPackageScriptsCmdlet(
+ PackageScriptsToRun scriptsToBeRun,
+ FakePackageManagementConsoleHost consoleHost,
+ FakeCmdletTerminatingError cmdletTerminatingError)
+ : base(scriptsToBeRun, consoleHost, cmdletTerminatingError)
+ {
+ this.ScriptsToBeRun = scriptsToBeRun;
+ this.FakePackageManagementConsoleHost = consoleHost;
+ this.FakeCmdletTerminatingError = cmdletTerminatingError;
+ }
+
+ public void CallProcessRecord()
+ {
+ base.ProcessRecord();
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj
index caa4c79a62..516bdf1024 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/PackageManagement.Cmdlets.Tests.csproj
@@ -50,6 +50,7 @@
+
@@ -60,6 +61,7 @@
+
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeRunPackageScriptsCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeRunPackageScriptsCmdletTests.cs
new file mode 100644
index 0000000000..42fc4d8a32
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/InvokeRunPackageScriptsCmdletTests.cs
@@ -0,0 +1,95 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using ICSharpCode.PackageManagement.Scripting;
+using NUnit.Framework;
+using PackageManagement.Cmdlets.Tests.Helpers;
+using PackageManagement.Tests.Helpers;
+
+namespace PackageManagement.Cmdlets.Tests
+{
+ [TestFixture]
+ public class InvokeRunPackageScriptsCmdletTests
+ {
+ TestableInvokeRunPackageScriptsCmdlet cmdlet;
+ FakeCmdletTerminatingError fakeTerminatingError;
+ PackageScriptsToRun scriptsToRun;
+
+ void CreateCmdlet()
+ {
+ cmdlet = new TestableInvokeRunPackageScriptsCmdlet();
+ fakeTerminatingError = cmdlet.FakeCmdletTerminatingError;
+ scriptsToRun = cmdlet.ScriptsToBeRun;
+ }
+
+ void RunCmdlet()
+ {
+ cmdlet.CallProcessRecord();
+ }
+
+ FakePackageScript AddScript()
+ {
+ var script = new FakePackageScript();
+ scriptsToRun.AddScript(script);
+ return script;
+ }
+
+ [Test]
+ public void ProcessRecord_OnePackageScriptToRun_PackageScriptIsRun()
+ {
+ CreateCmdlet();
+ FakePackageScript script = AddScript();
+ RunCmdlet();
+
+ bool executed = script.IsExecuted;
+
+ Assert.IsTrue(executed);
+ }
+
+ [Test]
+ public void ProcessRecord_TwoPackageScriptsToRun_SecondPackageScriptIsRun()
+ {
+ CreateCmdlet();
+ AddScript();
+ FakePackageScript script = AddScript();
+ RunCmdlet();
+
+ bool executed = script.IsExecuted;
+
+ Assert.IsTrue(executed);
+ }
+
+ [Test]
+ public void ProcessRecord_OnePackageScriptToRun_PackageScriptSessionIsCmdlet()
+ {
+ CreateCmdlet();
+ FakePackageScript script = AddScript();
+ RunCmdlet();
+
+ IPackageScriptSession session = script.SessionPassedToExecute;
+
+ Assert.AreEqual(cmdlet, session);
+ }
+
+ [Test]
+ public void ProcessRecord_TwoPackageScriptsToRun_TwoPackageScriptSessionIsCmdlet()
+ {
+ CreateCmdlet();
+ AddScript();
+ FakePackageScript script = AddScript();
+ RunCmdlet();
+
+ IPackageScriptSession session = script.SessionPassedToExecute;
+
+ Assert.AreEqual(cmdlet, session);
+ }
+
+ [Test]
+ public void ProcessRecord_NoPackageScriptsToRun_NullReferenceExceptionIsNotThrown()
+ {
+ CreateCmdlet();
+ Assert.DoesNotThrow(() => RunCmdlet());
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs
index 98217db242..f12d98c180 100644
--- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/PackageManagementCmdletTests.cs
@@ -124,5 +124,19 @@ namespace PackageManagement.Cmdlets.Tests
Assert.AreEqual(cmdlet, session);
}
+
+ [Test]
+ public void Run_PackageScriptDoesNotExist_ScriptIsNotRun()
+ {
+ CreateCmdlet();
+
+ var script = new FakePackageScript();
+ script.ExistsReturnValue = false;
+ cmdlet.Run(script);
+
+ bool executed = script.IsExecuted;
+
+ Assert.IsFalse(executed);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
index cbd5a51198..b2116f11f2 100644
--- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
+++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
@@ -200,6 +200,7 @@
+
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs
index 1194dd03b7..684d8d43f0 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementServices.cs
@@ -18,6 +18,7 @@ namespace ICSharpCode.PackageManagement
static readonly PackageManagementOutputMessagesView outputMessagesView;
static readonly RunPackageInitializationScriptsOnSolutionOpen runPackageInitializationScripts;
static readonly ResetPowerShellWorkingDirectoryOnSolutionClosed resetPowerShellWorkingDirectory;
+ static readonly PackageScriptsToRun packageScriptsToRun = new PackageScriptsToRun();
static PackageManagementServices()
{
@@ -58,5 +59,9 @@ namespace ICSharpCode.PackageManagement
public static IPackageManagementProjectService ProjectService {
get { return projectService; }
}
+
+ public static PackageScriptsToRun PackageScriptsToRun {
+ get { return packageScriptsToRun; }
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptsToRun.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptsToRun.cs
new file mode 100644
index 0000000000..135f80c942
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageScriptsToRun.cs
@@ -0,0 +1,32 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using System.Collections.Concurrent;
+
+namespace ICSharpCode.PackageManagement.Scripting
+{
+ public class PackageScriptsToRun
+ {
+ ConcurrentQueue scripts = new ConcurrentQueue();
+
+ public IPackageScript GetNextScript()
+ {
+ IPackageScript script = null;
+ if (GetNextScript(out script)) {
+ return script;
+ }
+ return null;
+ }
+
+ public bool GetNextScript(out IPackageScript script)
+ {
+ return scripts.TryDequeue(out script);
+ }
+
+ public void AddScript(IPackageScript script)
+ {
+ scripts.Enqueue(script);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
index af6a2f8191..9c4d40a356 100644
--- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
+++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
@@ -178,6 +178,7 @@
+
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageScriptsToRunTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageScriptsToRunTests.cs
new file mode 100644
index 0000000000..7a96884fef
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageScriptsToRunTests.cs
@@ -0,0 +1,156 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using ICSharpCode.PackageManagement.Scripting;
+using NUnit.Framework;
+using PackageManagement.Tests.Helpers;
+
+namespace PackageManagement.Tests.Scripting
+{
+ [TestFixture]
+ public class PackageScriptsToRunTests
+ {
+ PackageScriptsToRun scriptsToRun;
+
+ void CreateScriptsToBeRun()
+ {
+ scriptsToRun = new PackageScriptsToRun();
+ }
+
+ FakePackageScript AddScript()
+ {
+ var script = new FakePackageScript();
+ scriptsToRun.AddScript(script);
+ return script;
+ }
+
+ [Test]
+ public void GetNextScript_NewInstance_ReturnsNull()
+ {
+ CreateScriptsToBeRun();
+ IPackageScript script = scriptsToRun.GetNextScript();
+
+ Assert.IsNull(script);
+ }
+
+ [Test]
+ public void GetNextScript_NewInstance_ReturnsFalse()
+ {
+ CreateScriptsToBeRun();
+ IPackageScript script = null;
+ bool result = scriptsToRun.GetNextScript(out script);
+
+ Assert.IsFalse(result);
+ }
+
+ [Test]
+ public void GetNextScript_OneScriptAdded_ReturnsScript()
+ {
+ CreateScriptsToBeRun();
+ FakePackageScript expectedScript = AddScript();
+
+ IPackageScript script = scriptsToRun.GetNextScript();
+
+ Assert.AreEqual(expectedScript, script);
+ }
+
+ [Test]
+ public void GetNextScript_OneScriptAdded_ReturnsScriptInOutParameter()
+ {
+ CreateScriptsToBeRun();
+ FakePackageScript expectedScript = AddScript();
+
+ IPackageScript script = null;
+ scriptsToRun.GetNextScript(out script);
+
+ Assert.AreEqual(expectedScript, script);
+ }
+
+ [Test]
+ public void GetNextScript_OneScriptAdded_ReturnsTrue()
+ {
+ CreateScriptsToBeRun();
+ FakePackageScript expectedScript = AddScript();
+
+ IPackageScript script = null;
+ bool result = scriptsToRun.GetNextScript(out script);
+
+ Assert.IsTrue(result);
+ }
+
+ [Test]
+ public void GetNextScript_CalledTwiceWithOneScriptAdded_ReturnsNullOnSecondCall()
+ {
+ CreateScriptsToBeRun();
+ FakePackageScript expectedScript = AddScript();
+ scriptsToRun.GetNextScript();
+ IPackageScript script = scriptsToRun.GetNextScript();
+
+ Assert.IsNull(script);
+ }
+
+ [Test]
+ public void GetNextScript_CalledTwiceWithOneScriptAdded_ReturnsNullScriptInOutParameterOnSecondCall()
+ {
+ CreateScriptsToBeRun();
+ FakePackageScript expectedScript = AddScript();
+ scriptsToRun.GetNextScript();
+ IPackageScript script = null;
+ scriptsToRun.GetNextScript(out script);
+
+ Assert.IsNull(script);
+ }
+
+ [Test]
+ public void GetNextScript_CalledTwiceWithOneScriptAdded_ReturnsFalseOnSecondCall()
+ {
+ CreateScriptsToBeRun();
+ FakePackageScript expectedScript = AddScript();
+ scriptsToRun.GetNextScript();
+
+ IPackageScript script = null;
+ bool result = scriptsToRun.GetNextScript(out script);
+
+ Assert.IsFalse(result);
+ }
+
+ [Test]
+ public void GetNextScript_CalledTwiceWithTwoScriptsAdded_ReturnsSecondScriptAdded()
+ {
+ CreateScriptsToBeRun();
+ AddScript();
+ FakePackageScript expectedScript = AddScript();
+ scriptsToRun.GetNextScript();
+ IPackageScript script = scriptsToRun.GetNextScript();
+
+ Assert.AreEqual(expectedScript, script);
+ }
+
+ [Test]
+ public void GetNextScript_CalledTwiceWithTwoScriptsAdded_ReturnsSecondScriptAddedInOutParameter()
+ {
+ CreateScriptsToBeRun();
+ AddScript();
+ FakePackageScript expectedScript = AddScript();
+ scriptsToRun.GetNextScript();
+ IPackageScript script = null;
+ scriptsToRun.GetNextScript(out script);
+
+ Assert.AreEqual(expectedScript, script);
+ }
+
+ [Test]
+ public void GetNextScript_CalledTwiceWithTwoScriptsAdded_ReturnsTrueOnSecondCall()
+ {
+ CreateScriptsToBeRun();
+ AddScript();
+ FakePackageScript expectedScript = AddScript();
+ scriptsToRun.GetNextScript();
+ IPackageScript script = null;
+ bool result = scriptsToRun.GetNextScript(out script);
+
+ Assert.IsTrue(result);
+ }
+ }
+}