Browse Source

Override the Clear-Host PowerShell function to support clearing the package management console on the command line.

pull/15/head
Matt Ward 15 years ago
parent
commit
034ced130a
  1. 1
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 22
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ClearPackageManagementConsoleHostCommand.cs
  3. 1
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs
  4. 4
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPowerShellHostFactory.cs
  5. 33
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs
  6. 1
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs
  7. 20
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHost.cs
  8. 6
      src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHostFactory.cs
  9. 1
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  10. 6
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs
  11. 10
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePowerShellHostFactory.cs
  12. 33
      src/AddIns/Misc/PackageManagement/Test/Src/Scripting/ClearPackageManagementConsoleHostCommandTests.cs
  13. 51
      src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs
  14. 9
      src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs

1
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -204,6 +204,7 @@ @@ -204,6 +204,7 @@
</Compile>
<Compile Include="Src\PackagesViewModel.cs" />
<Compile Include="Src\ProcessPackageAction.cs" />
<Compile Include="Src\Scripting\ClearPackageManagementConsoleHostCommand.cs" />
<Compile Include="Src\Scripting\IPackageScript.cs" />
<Compile Include="Src\Scripting\IPackageScriptFactory.cs" />
<Compile Include="Src\Scripting\IPackageScriptFileName.cs" />

22
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/ClearPackageManagementConsoleHostCommand.cs

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
// 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;
namespace ICSharpCode.PackageManagement.Scripting
{
public class ClearPackageManagementConsoleHostCommand
{
IPackageManagementConsoleHost consoleHost;
public ClearPackageManagementConsoleHostCommand(IPackageManagementConsoleHost consoleHost)
{
this.consoleHost = consoleHost;
}
public void ClearHost()
{
consoleHost.Clear();
}
}
}

1
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPackageManagementConsoleHost.cs

@ -18,6 +18,7 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -18,6 +18,7 @@ namespace ICSharpCode.PackageManagement.Scripting
IPackageManagementSolution Solution { get; }
void Clear();
void WritePrompt();
void Run();
IPackageManagementProject GetProject(string packageSource, string projectName);

4
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/IPowerShellHostFactory.cs

@ -8,6 +8,8 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -8,6 +8,8 @@ namespace ICSharpCode.PackageManagement.Scripting
{
public interface IPowerShellHostFactory
{
IPowerShellHost CreatePowerShellHost(IScriptingConsole scriptingConsole);
IPowerShellHost CreatePowerShellHost(
IPackageManagementConsoleHost consoleHost,
object privateData);
}
}

33
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleHost.cs

@ -70,7 +70,11 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -70,7 +70,11 @@ namespace ICSharpCode.PackageManagement.Scripting
public void Clear()
{
ScriptingConsole.Clear();
WritePrompt();
}
public void WritePrompt()
{
ScriptingConsole.Write(prompt, ScriptingStyle.Prompt);
}
public void Run()
@ -98,17 +102,13 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -98,17 +102,13 @@ namespace ICSharpCode.PackageManagement.Scripting
AddModulesToImport();
powerShellHost.SetRemoteSignedExecutionPolicy();
UpdateFormatting();
}
void UpdateFormatting()
{
IEnumerable<string> fileNames = addinPath.GetPowerShellFormattingFileNames();
powerShellHost.UpdateFormatting(fileNames);
RedefineClearHostFunction();
}
void CreatePowerShellHost()
{
powerShellHost = powerShellHostFactory.CreatePowerShellHost(ScriptingConsole);
var clearConsoleHostCommand = new ClearPackageManagementConsoleHostCommand(this);
powerShellHost = powerShellHostFactory.CreatePowerShellHost(this, clearConsoleHostCommand);
}
void AddModulesToImport()
@ -117,6 +117,18 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -117,6 +117,18 @@ namespace ICSharpCode.PackageManagement.Scripting
powerShellHost.ModulesToImport.Add(module);
}
void UpdateFormatting()
{
IEnumerable<string> fileNames = addinPath.GetPowerShellFormattingFileNames();
powerShellHost.UpdateFormatting(fileNames);
}
void RedefineClearHostFunction()
{
string command = "function Clear-Host { $host.PrivateData.ClearHost() }";
powerShellHost.ExecuteCommand(command);
}
void WriteInfoBeforeFirstPrompt()
{
WriteNuGetVersionInfo();
@ -151,11 +163,6 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -151,11 +163,6 @@ namespace ICSharpCode.PackageManagement.Scripting
return "Type 'get-help NuGet' for more information.";
}
void WritePrompt()
{
ScriptingConsole.Write(prompt, ScriptingStyle.Prompt);
}
void ProcessUserCommands()
{
while (true) {

1
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PackageManagementConsoleViewModel.cs

@ -76,6 +76,7 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -76,6 +76,7 @@ namespace ICSharpCode.PackageManagement.Scripting
public void ClearConsole()
{
consoleHost.Clear();
consoleHost.WritePrompt();
}
void UpdatePackageSourceViewModels()

20
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHost.cs

@ -17,18 +17,26 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -17,18 +17,26 @@ namespace ICSharpCode.PackageManagement.Scripting
{
public class PowerShellHost : PSHost, IPowerShellHost
{
IScriptingConsole scriptingConsole;
IPackageManagementConsoleHost consoleHost;
CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture;
CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
Guid instanceId = Guid.NewGuid();
Runspace runspace;
PowerShellHostUserInterface userInterface;
List<string> modulesToImport = new List<string>();
PSObject privateData;
public PowerShellHost(IScriptingConsole scriptingConsole)
public PowerShellHost(
IPackageManagementConsoleHost consoleHost,
object privateData)
{
this.scriptingConsole = scriptingConsole;
userInterface = new PowerShellHostUserInterface(scriptingConsole);
this.consoleHost = consoleHost;
this.privateData = new PSObject(privateData);
userInterface = new PowerShellHostUserInterface(consoleHost.ScriptingConsole);
}
public override PSObject PrivateData {
get { return privateData; }
}
public IList<string> ModulesToImport {
@ -57,7 +65,7 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -57,7 +65,7 @@ namespace ICSharpCode.PackageManagement.Scripting
pipeline.Invoke();
} catch (Exception ex) {
scriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error);
consoleHost.ScriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error);
}
}
@ -155,7 +163,7 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -155,7 +163,7 @@ namespace ICSharpCode.PackageManagement.Scripting
pipeline.Invoke(input);
} catch (Exception ex) {
scriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error);
consoleHost.ScriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error);
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/Scripting/PowerShellHostFactory.cs

@ -8,9 +8,11 @@ namespace ICSharpCode.PackageManagement.Scripting @@ -8,9 +8,11 @@ namespace ICSharpCode.PackageManagement.Scripting
{
public class PowerShellHostFactory : IPowerShellHostFactory
{
public IPowerShellHost CreatePowerShellHost(IScriptingConsole scriptingConsole)
public IPowerShellHost CreatePowerShellHost(
IPackageManagementConsoleHost consoleHost,
object privateData)
{
return new PowerShellHost(scriptingConsole);
return new PowerShellHost(consoleHost, privateData);
}
}
}

1
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -175,6 +175,7 @@ @@ -175,6 +175,7 @@
<Compile Include="Src\PackageSourceViewModelTests.cs" />
<Compile Include="Src\PackagesViewModelTests.cs" />
<Compile Include="Src\ProcessPackageActionTests.cs" />
<Compile Include="Src\Scripting\ClearPackageManagementConsoleHostCommandTests.cs" />
<Compile Include="Src\Scripting\PackageInitializeScriptFileNameTests.cs" />
<Compile Include="Src\Scripting\PackageInitializeScriptTests.cs" />
<Compile Include="Src\Scripting\PackageInstallScriptFileNameTests.cs" />

6
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageManagementConsoleHost.cs

@ -27,6 +27,7 @@ namespace PackageManagement.Tests.Helpers @@ -27,6 +27,7 @@ namespace PackageManagement.Tests.Helpers
public bool IsDisposeCalled;
public bool IsClearCalled;
public bool IsWritePromptCalled;
public bool IsRunCalled;
public void Dispose()
@ -39,6 +40,11 @@ namespace PackageManagement.Tests.Helpers @@ -39,6 +40,11 @@ namespace PackageManagement.Tests.Helpers
IsClearCalled = true;
}
public void WritePrompt()
{
IsWritePromptCalled = true;
}
public void Run()
{
IsRunCalled = true;

10
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePowerShellHostFactory.cs

@ -9,12 +9,16 @@ namespace PackageManagement.Tests.Helpers @@ -9,12 +9,16 @@ namespace PackageManagement.Tests.Helpers
{
public class FakePowerShellHostFactory : IPowerShellHostFactory
{
public IScriptingConsole ScriptingConsolePassedToCreatePowerShellHost;
public IPackageManagementConsoleHost ConsoleHostPassedToCreatePowerShellHost;
public object PrivateDataPassedToCreatePowerShellHost;
public FakePowerShellHost FakePowerShellHost = new FakePowerShellHost();
public IPowerShellHost CreatePowerShellHost(IScriptingConsole scriptingConsole)
public IPowerShellHost CreatePowerShellHost(
IPackageManagementConsoleHost consoleHost,
object privateData)
{
ScriptingConsolePassedToCreatePowerShellHost = scriptingConsole;
ConsoleHostPassedToCreatePowerShellHost = consoleHost;
PrivateDataPassedToCreatePowerShellHost = privateData;
return FakePowerShellHost;
}
}

33
src/AddIns/Misc/PackageManagement/Test/Src/Scripting/ClearPackageManagementConsoleHostCommandTests.cs

@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
// 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 ClearPackageManagementConsoleHostCommandTests
{
ClearPackageManagementConsoleHostCommand command;
FakePackageManagementConsoleHost fakeConsoleHost;
void CreateCommand()
{
fakeConsoleHost = new FakePackageManagementConsoleHost();
command = new ClearPackageManagementConsoleHostCommand(fakeConsoleHost);
}
[Test]
public void ClearHost_MethodCalled_ClearsConsoleHost()
{
CreateCommand();
command.ClearHost();
bool called = fakeConsoleHost.IsClearCalled;
Assert.IsTrue(called);
}
}
}

51
src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleHostTests.cs

@ -92,10 +92,21 @@ namespace PackageManagement.Tests.Scripting @@ -92,10 +92,21 @@ namespace PackageManagement.Tests.Scripting
CreateHost();
RunHost();
var actualConsole = host.FakePowerShellHostFactory.ScriptingConsolePassedToCreatePowerShellHost;
var expectedConsole = scriptingConsole;
var actualHost = host.FakePowerShellHostFactory.ConsoleHostPassedToCreatePowerShellHost;
var expectedHost = host;
Assert.AreSame(expectedConsole, actualConsole);
Assert.AreSame(expectedHost, actualHost);
}
[Test]
public void Run_ConsoleExitsOnFirstRead_PrivateDataIsSetToClearConsoleHostCommandObject()
{
CreateHost();
RunHost();
var privateDataObject = host.FakePowerShellHostFactory.PrivateDataPassedToCreatePowerShellHost;
Assert.IsInstanceOf(typeof(ClearPackageManagementConsoleHostCommand), privateDataObject);
}
[Test]
@ -107,6 +118,20 @@ namespace PackageManagement.Tests.Scripting @@ -107,6 +118,20 @@ namespace PackageManagement.Tests.Scripting
Assert.IsTrue(powerShellHost.IsSetRemoteSignedExecutionPolicyCalled);
}
[Test]
public void Run_ConsoleExitsOnFirstRead_ClearHostFunctionIsRedefined()
{
CreateHost();
RunHost();
string expectedExecutedScript =
"function Clear-Host { $host.PrivateData.ClearHost() }";
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains(expectedExecutedScript);
Assert.IsTrue(executed);
}
[Test]
public void Run_ConsoleExitsOnFirstRead_PromptTextWrittenToConsole()
{
@ -151,17 +176,22 @@ namespace PackageManagement.Tests.Scripting @@ -151,17 +176,22 @@ namespace PackageManagement.Tests.Scripting
}
[Test]
public void Run_ConsoleExitsOnFirstRead_NoCommandsPassedToPowerShellHost()
public void Run_TwoCommandsEnteredByUser_FirstCommandExecuted()
{
CreateHost();
powerShellHost.CommandPassedToExecuteCommand = "test";
var commands = new string[] { "one", "two" };
scriptingConsole.AllTextToReturnFromReadLine.AddRange(commands);
host.ScriptingConsole = scriptingConsole;
RunHost();
Assert.AreEqual("test", powerShellHost.CommandPassedToExecuteCommand);
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains("one");
Assert.IsTrue(executed);
}
[Test]
public void Run_TwoCommandsEnteredByUser_BothCommandsExecuted()
public void Run_TwoCommandsEnteredByUser_SecondCommandExecuted()
{
CreateHost();
var commands = new string[] { "one", "two" };
@ -170,7 +200,9 @@ namespace PackageManagement.Tests.Scripting @@ -170,7 +200,9 @@ namespace PackageManagement.Tests.Scripting
host.ScriptingConsole = scriptingConsole;
RunHost();
Assert.AreEqual(commands, powerShellHost.AllCommandsPassedToExecuteCommand);
bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains("two");
Assert.IsTrue(executed);
}
[Test]
@ -407,10 +439,11 @@ namespace PackageManagement.Tests.Scripting @@ -407,10 +439,11 @@ namespace PackageManagement.Tests.Scripting
}
[Test]
public void Clear_ConsoleWindowHasOutputText_PromptWritten()
public void WritePrompt_ConsoleWindowHasOutputText_PromptWritten()
{
CreateHost();
host.Clear();
host.WritePrompt();
var expectedTextPassedToWrite = new String[] { "PM> "};
var actualTextPassedToWrite = scriptingConsole.AllTextPassedToWrite;

9
src/AddIns/Misc/PackageManagement/Test/Src/Scripting/PackageManagementConsoleViewModelTests.cs

@ -476,6 +476,15 @@ namespace PackageManagement.Tests.Scripting @@ -476,6 +476,15 @@ namespace PackageManagement.Tests.Scripting
Assert.IsTrue(consoleHost.IsClearCalled);
}
[Test]
public void ClearConsole_CommandExecuted_WritesPrompt()
{
CreateViewModel();
viewModel.ClearConsole();
Assert.IsTrue(consoleHost.IsWritePromptCalled);
}
[Test]
public void Constructor_NewViewModelCreated_ConsoleSetOnConsoleHost()
{

Loading…
Cancel
Save