如何显示Perforce API执行的文件操作的输出?

时间:2015-02-11 10:45:25

标签: .net perforce p4api.net

我将通过perforce API同步perforce文件。 我希望每个文件操作的输出。类似于我们从p4 cmd看到的输出:

  • // depot / file.txt#1 - 正在更新 X:\ file.txt
  • // depot / file.txt#2 - 已删除 X:\ file.txt

以下是我的perforce api代码来同步文件:

var repository = new P4.Repository(new P4.Server(new P4.ServerAddress("server:111111")));
repository.Connection.UserName = "me";
repository.Connection.Connect(new P4.Options());
repository.Connection.Login("password");
repository.Connection.Client = repository.GetClient("client");
var syncFlags = new P4.Options(P4.SyncFilesCmdFlags.Force, 100);
var clientPath = new P4.ClientPath(@"X:\File.txt");

IList<P4.FileSpec> results = repository.Connection.Client.SyncFiles(syncFlags, new[] { new P4.FileSpec(clientPath, new P4.Revision(1)) });
P4.VersionSpec downloadedVersion = results.First().Version; // This is #1 as expected

results = repository.Connection.Client.SyncFiles(syncFlags, new[] { new P4.FileSpec(clientPath, new P4.Revision(2)) });
downloadedVersion = results.First().Version; // This is #2 as expected

results = repository.Connection.Client.SyncFiles(syncFlags, new[] { new P4.FileSpec(clientPath, new P4.Revision(0)) });
downloadedVersion = results.First().Version; // File is really deleted and I hoped for #0, but it's #2!

如何获取文件被删除的信息?我尝试使用SyncFiles输出,但信息对于已删除的文件不正确。还有其他办法吗?

2 个答案:

答案 0 :(得分:2)

以下是我找到的解决方案:

repository.Connection.TaggedOutputReceived += Connection_TaggedOutputReceived;


static void Connection_TaggedOutputReceived(uint cmdId, int ObjId, P4.TaggedObject t)
{
    string action, oldAction, haveRevStr, depotFile;

    t.TryGetValue("action", out action);
    t.TryGetValue("oldAction", out oldAction);
    t.TryGetValue("haveRev", out haveRevStr);
    t.TryGetValue("depotFile", out depotFile);

    if (haveRevStr == null || haveRevStr == "none")
        haveRevStr = string.Empty;
    else
        haveRevStr = "#" + haveRevStr;

    if (string.IsNullOrEmpty(oldAction))
        oldAction = string.Empty;
    else
        oldAction = oldAction + " ";

    if (depotFile != null && action != null)
        Console.Out.WriteLine("{0}{1} - {2}{3}", depotFile, haveRevStr, oldAction, action);
}

... repository.Connection还包含其他有趣的钩子委托:.CommandEcho,.Errorreceived,.InfoResultReceived,.TextResultsReceived

答案 1 :(得分:1)

Client.SyncFiles函数为您提供了一个整齐的列表,列出了哪些文件受影响,但不是sync命令的其余输出。如果您只是想弄清楚文件是否被删除,那么在本地计算机上定义clientFile应该可以解决问题。

如果您想要完整输出,使用P4Server接口是一个更好的选择:

http://www.perforce.com/perforce/doc.current/manuals/p4api.net/p4api.net_reference/html/AllMembers_T_Perforce_P4_P4Server.htm

如果在“tagged”设置为true的情况下调用RunCommand(),它应该为您提供从“p4 -Ztag(command)”获得的所有数据,并通过GetTaggedOutput()访问结果。在没有“标记”选项的情况下运行它将为您提供您作为最终用户看到的格式化消息,可通过GetInfoMessages()访问。