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 @@
</Compile> </Compile>
<Compile Include="Src\PackagesViewModel.cs" /> <Compile Include="Src\PackagesViewModel.cs" />
<Compile Include="Src\ProcessPackageAction.cs" /> <Compile Include="Src\ProcessPackageAction.cs" />
<Compile Include="Src\Scripting\ClearPackageManagementConsoleHostCommand.cs" />
<Compile Include="Src\Scripting\IPackageScript.cs" /> <Compile Include="Src\Scripting\IPackageScript.cs" />
<Compile Include="Src\Scripting\IPackageScriptFactory.cs" /> <Compile Include="Src\Scripting\IPackageScriptFactory.cs" />
<Compile Include="Src\Scripting\IPackageScriptFileName.cs" /> <Compile Include="Src\Scripting\IPackageScriptFileName.cs" />

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

@ -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
IPackageManagementSolution Solution { get; } IPackageManagementSolution Solution { get; }
void Clear(); void Clear();
void WritePrompt();
void Run(); void Run();
IPackageManagementProject GetProject(string packageSource, string projectName); IPackageManagementProject GetProject(string packageSource, string projectName);

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

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

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

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

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

@ -17,18 +17,26 @@ namespace ICSharpCode.PackageManagement.Scripting
{ {
public class PowerShellHost : PSHost, IPowerShellHost public class PowerShellHost : PSHost, IPowerShellHost
{ {
IScriptingConsole scriptingConsole; IPackageManagementConsoleHost consoleHost;
CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture; CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture;
CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture; CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
Guid instanceId = Guid.NewGuid(); Guid instanceId = Guid.NewGuid();
Runspace runspace; Runspace runspace;
PowerShellHostUserInterface userInterface; PowerShellHostUserInterface userInterface;
List<string> modulesToImport = new List<string>(); List<string> modulesToImport = new List<string>();
PSObject privateData;
public PowerShellHost(IScriptingConsole scriptingConsole) public PowerShellHost(
IPackageManagementConsoleHost consoleHost,
object privateData)
{ {
this.scriptingConsole = scriptingConsole; this.consoleHost = consoleHost;
userInterface = new PowerShellHostUserInterface(scriptingConsole); this.privateData = new PSObject(privateData);
userInterface = new PowerShellHostUserInterface(consoleHost.ScriptingConsole);
}
public override PSObject PrivateData {
get { return privateData; }
} }
public IList<string> ModulesToImport { public IList<string> ModulesToImport {
@ -57,7 +65,7 @@ namespace ICSharpCode.PackageManagement.Scripting
pipeline.Invoke(); pipeline.Invoke();
} catch (Exception ex) { } catch (Exception ex) {
scriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error); consoleHost.ScriptingConsole.WriteLine(ex.Message, ScriptingStyle.Error);
} }
} }
@ -155,7 +163,7 @@ namespace ICSharpCode.PackageManagement.Scripting
pipeline.Invoke(input); pipeline.Invoke(input);
} catch (Exception ex) { } 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
{ {
public class PowerShellHostFactory : IPowerShellHostFactory 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 @@
<Compile Include="Src\PackageSourceViewModelTests.cs" /> <Compile Include="Src\PackageSourceViewModelTests.cs" />
<Compile Include="Src\PackagesViewModelTests.cs" /> <Compile Include="Src\PackagesViewModelTests.cs" />
<Compile Include="Src\ProcessPackageActionTests.cs" /> <Compile Include="Src\ProcessPackageActionTests.cs" />
<Compile Include="Src\Scripting\ClearPackageManagementConsoleHostCommandTests.cs" />
<Compile Include="Src\Scripting\PackageInitializeScriptFileNameTests.cs" /> <Compile Include="Src\Scripting\PackageInitializeScriptFileNameTests.cs" />
<Compile Include="Src\Scripting\PackageInitializeScriptTests.cs" /> <Compile Include="Src\Scripting\PackageInitializeScriptTests.cs" />
<Compile Include="Src\Scripting\PackageInstallScriptFileNameTests.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
public bool IsDisposeCalled; public bool IsDisposeCalled;
public bool IsClearCalled; public bool IsClearCalled;
public bool IsWritePromptCalled;
public bool IsRunCalled; public bool IsRunCalled;
public void Dispose() public void Dispose()
@ -39,6 +40,11 @@ namespace PackageManagement.Tests.Helpers
IsClearCalled = true; IsClearCalled = true;
} }
public void WritePrompt()
{
IsWritePromptCalled = true;
}
public void Run() public void Run()
{ {
IsRunCalled = true; IsRunCalled = true;

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

@ -9,12 +9,16 @@ namespace PackageManagement.Tests.Helpers
{ {
public class FakePowerShellHostFactory : IPowerShellHostFactory public class FakePowerShellHostFactory : IPowerShellHostFactory
{ {
public IScriptingConsole ScriptingConsolePassedToCreatePowerShellHost; public IPackageManagementConsoleHost ConsoleHostPassedToCreatePowerShellHost;
public object PrivateDataPassedToCreatePowerShellHost;
public FakePowerShellHost FakePowerShellHost = new FakePowerShellHost(); 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; return FakePowerShellHost;
} }
} }

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

@ -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
CreateHost(); CreateHost();
RunHost(); RunHost();
var actualConsole = host.FakePowerShellHostFactory.ScriptingConsolePassedToCreatePowerShellHost; var actualHost = host.FakePowerShellHostFactory.ConsoleHostPassedToCreatePowerShellHost;
var expectedConsole = scriptingConsole; 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] [Test]
@ -107,6 +118,20 @@ namespace PackageManagement.Tests.Scripting
Assert.IsTrue(powerShellHost.IsSetRemoteSignedExecutionPolicyCalled); 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] [Test]
public void Run_ConsoleExitsOnFirstRead_PromptTextWrittenToConsole() public void Run_ConsoleExitsOnFirstRead_PromptTextWrittenToConsole()
{ {
@ -151,17 +176,22 @@ namespace PackageManagement.Tests.Scripting
} }
[Test] [Test]
public void Run_ConsoleExitsOnFirstRead_NoCommandsPassedToPowerShellHost() public void Run_TwoCommandsEnteredByUser_FirstCommandExecuted()
{ {
CreateHost(); CreateHost();
powerShellHost.CommandPassedToExecuteCommand = "test"; var commands = new string[] { "one", "two" };
scriptingConsole.AllTextToReturnFromReadLine.AddRange(commands);
host.ScriptingConsole = scriptingConsole;
RunHost(); RunHost();
Assert.AreEqual("test", powerShellHost.CommandPassedToExecuteCommand); bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains("one");
Assert.IsTrue(executed);
} }
[Test] [Test]
public void Run_TwoCommandsEnteredByUser_BothCommandsExecuted() public void Run_TwoCommandsEnteredByUser_SecondCommandExecuted()
{ {
CreateHost(); CreateHost();
var commands = new string[] { "one", "two" }; var commands = new string[] { "one", "two" };
@ -170,7 +200,9 @@ namespace PackageManagement.Tests.Scripting
host.ScriptingConsole = scriptingConsole; host.ScriptingConsole = scriptingConsole;
RunHost(); RunHost();
Assert.AreEqual(commands, powerShellHost.AllCommandsPassedToExecuteCommand); bool executed = powerShellHost.AllCommandsPassedToExecuteCommand.Contains("two");
Assert.IsTrue(executed);
} }
[Test] [Test]
@ -407,10 +439,11 @@ namespace PackageManagement.Tests.Scripting
} }
[Test] [Test]
public void Clear_ConsoleWindowHasOutputText_PromptWritten() public void WritePrompt_ConsoleWindowHasOutputText_PromptWritten()
{ {
CreateHost(); CreateHost();
host.Clear(); host.Clear();
host.WritePrompt();
var expectedTextPassedToWrite = new String[] { "PM> "}; var expectedTextPassedToWrite = new String[] { "PM> "};
var actualTextPassedToWrite = scriptingConsole.AllTextPassedToWrite; var actualTextPassedToWrite = scriptingConsole.AllTextPassedToWrite;

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

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

Loading…
Cancel
Save