我已经为一个特定的存储库创建了一个工具/插件,可以在TortoiseHgGUI中启动
这个工具在.NET控制台应用程序(在bg中运行)中运行一些耗时的任务(3-4分钟),我想知道是否可以以及如何将一些数据写入到Ortoisehg的控制台。只是为了通知用户
我发现了一个有趣的Mercurial.Net库:https://archive.codeplex.com/?p=mercurialnet,在讨论选项卡的网站上,有人问了同样的问题:
Great library! How would one display messages to TortoiseHg? Either as a a message box or in the output log.
有人回答:
It should be enough to just print them to the console, ie. either:
Console.Out.WriteLine("information");
但对我来说,它不起作用
以下是我迄今为止尝试的(简单)代码:
Mercurial.Client.SetClientPath(@"C:\Program Files\TortoiseHg");
Mercurial.Repository repo = new Repository(_documentDirectory);
Console.Out.WriteLine("information");
我错过什么了吗
编辑
我为TortoiseHG创建了一个自定义Python扩展,我将其保存在以下文件夹中:C:\Program Files\TortoiseHG\hText,并在mercurial.ini文件中添加了以下内容:
[extensions]
logger = C:/Program Files/TortoiseHg/hgext/console-logger.py
from mercurial import registrar
from mercurial.i18n import _
cmdtable = {}
command = registrar.command(cmdtable)
@command('WriteToTortoise', [], norepo=True)
def WriteToTortoise(ui, value):
ui.warn('INFO: ' + value + '\n\n')
它也可以在cmd中使用,只是在乌龟身上看不到喷射
至少我在C#(初始工具在其中运行)中制作了一个测试控制台应用程序,并拥有此代码
class Program
{
static void Main(string[] args)
{
Mercurial.Repository repo = new Repository(@"C:\Users\Rymo\source\repos\Test");
Mercurial.Gui.GuiClient.ClientType = GuiClientType.PyQT;
var cmd = new WriteGuiConsole();
Mercurial.Gui.GuiClient.Execute(repo, cmd);
//Mercurial.Gui.GuiClient.InitGui(repo);
Console.ReadLine();
}
}
我的命令(请参阅cmd变量):
class WriteGuiConsole : IGuiCommand
{
public string Command => "WriteToTortoise";
public IEnumerable<string> Arguments => new string[] { "This message should be visible in Tortoise.." };
public Collection<string> AdditionalArguments => new Collection<string>();
public IMercurialCommandObserver Observer => new DebugObserver();
public int Timeout => 3000;
public void After(int exitCode, string standardOutput, string standardErrorOutput)
{
Console.WriteLine($"exitCode: {exitCode}");
Console.WriteLine($"standardOutput: {standardOutput}");
Console.WriteLine($"standardErrorOutput: {standardErrorOutput}");
}
public void Before()
{
}
public void Validate()
{
}
}
public class CustomDebugObserver : IMercurialCommandObserver
{
public void ErrorOutput(string line)
{
Console.WriteLine($"ErrorOutput: {line}");
}
public void Executed(string command, string arguments, int exitCode, string output, string errorOutput)
{
Console.WriteLine($"command: {command}");
Console.WriteLine($"arguments: {arguments}");
Console.WriteLine($"exitCode: {exitCode}");
Console.WriteLine($"output: {output}");
Console.WriteLine($"errorOutput: {errorOutput}");
}
public void Executing(string command, string arguments)
{
Console.WriteLine($"command: {command}");
Console.WriteLine($"arguments: {arguments}");
}
public void Output(string line)
{
Console.WriteLine($"line: {line}");
}
}
我可以从C#代码(推/拉/还原等)访问所有的乌龟功能,但是一个简单的控制台输出目前似乎是一座过桥
编辑 又是一个没有成功的早晨。。同情将工具的控制台输出重定向到Windows窗体应用程序以通知用户可能会更快
但是一定有人能把我推向正确的方向,或者告诉我我在浪费时间
编辑 这个话题也被发布在龟甲开发者论坛(谷歌集团)上,当我得到答案时,我也会在这里更新它
编辑 我越来越近了。。我对Python扩展进行了如下修改:
from mercurial import registrar
from mercurial.i18n import _
from subprocess import Popen, PIPE, STDOUT
def uisetup(ui):
p = Popen('ConsoleToTortoiseTest.exe', stdout = PIPE, stderr = STDOUT, shell = True)
WriteToTortoise(ui, p.stdout.readline())
cmdtable = {}
command = registrar.command(cmdtable)
@command('WriteToTortoise', [], norepo=True)
def WriteToTortoise(ui, value):
ui.warn('INFO: ' + value.replace('+', ' ') + '\n\n')
现在的问题是,它不是实时写入控制台,而是在我调用fe时写入。“hg help”命令,我想这是因为hg命令启动扩展,然后扩展正在执行.NET应用程序的子例程。现在不是解决方案
如有任何建议,将不胜感激
目前没有回答
相关问题 更多 >
编程相关推荐