代码之家  ›  专栏  ›  技术社区  ›  Bharath Metpally

如何通过类似于p4v日志的perforce api获取实时日志

  •  1
  • Bharath Metpally  · 技术社区  · 6 年前

    我面临着perforce api(.net)的问题,因为我无法实时提取同步日志。

    -我想做什么

    我正在尝试使用
    Perforce.P4.Client.SyncFiles() 命令与P4V GUI日志类似,当我们尝试同步任何文件时,这些日志会更新。

    -现在发生了什么

    • 由于输出仅在命令执行完成后生成,因此它不是预期的。

    • 还试图调查 Perforce.P4.P4Server.RunCommand() 它确实提供了详细的报告,但仅在执行命令后提供。 调查 this

    原因是 -

    我正在尝试向我正在使用的工具添加状态更新,该工具显示当前正在同步的Perforce文件。

    请告知。提前谢谢。

    -巴拉斯

    2 回复  |  直到 6 年前
        1
  •  2
  •   Samwise    6 年前

    在C++客户机API(P4V构建于此)中,客户机接收 OutputInfo 回调(或 OutputStat 在里面 tag ged模式)开始同步时。

    查看 .NET documentation 我认为等价物是 P4CallBacks.InfoResultsDelegate P4CallBacks.TaggedOutputDelegate 处理以下事件 P4Server.InfoResultsReceived

        2
  •  1
  •   JulienH    4 年前

    我最终也遇到了同样的问题,为了让它发挥作用,我付出了很大的努力,因此我将分享我找到的解决方案:

    首先,您应该使用P4Server类而不是performe。P4.连接。这两个类做着或多或少相同的事情,但当我尝试使用P4时。联系TaggedOutputReceived events,我什么也没得到。因此,我尝试使用P4Server。TaggedOutputReceived,终于,我得到了我想要的TaggedOutput。

    下面是一个小例子:

    P4Server p4Server = new P4Server(cwdPath); //In my case I use P4Config, so no need to set user or to login, but you can do all that with the p4Server here.
    p4Server.TaggedOutputReceived += P4ServerTaggedOutputEvent;
    p4Server.ErrorReceived += P4ServerErrorReceived;
    bool syncSuccess=false;
    try
    {
        P4Command syncCommand = new P4Command(p4Server, "sync", true, syncPath + "\\...");
        P4CommandResult rslt = syncCommand.Run();
        syncSuccess=true;
        //Here you can read the content of the P4CommandResult
        //But it will only be accessible when the command is finished.
    }
    catch (P4Exception ex) //Will be caught only when the command has failed
    {
        Console.WriteLine("P4Command failed: " + ex.Message);
    }
    

    以及处理错误消息或标记输出的方法:

    private void P4ServerErrorReceived(uint cmdId, int severity, int errorNumber, string data)
    {
        Console.WriteLine("P4ServerErrorReceived:" + data);
    }
    
    private void P4ServerTaggedOutputEvent(uint cmdId, int ObjId, TaggedObject Obj)
    {
        Console.WriteLine("P4ServerTaggedOutputEvent:" + Obj["clientFile"]); //Write the synced file name.
        //Note that I used this only for a 'Sync' command, for other commands, I guess there might not be any Obj["clientFile"], so you should check for that.
    }