Как получить в режиме реального времени журнал через Perforce API похож на P4V Lo g

Я столкнулся с проблемой с перформанс API (.net), так как я не могу получить журналы синхронизации в режиме реального времени.

- Что я пытаюсь сделать

Я пытаюсь получить журналы в реальном времени, так как синхронизация запускается с помощью
Perforce.P4.Client.SyncFiles() команда. Подобно журналам графического интерфейса P4V, которые обновляются, когда мы пытаемся синхронизировать любые файлы.

- Что происходит сейчас

  • Поскольку вывод генерируется только после того, как команда выполнена, ее выполнение не предназначено.

  • Также пытался заглянуть в Perforce.P4.P4Server.RunCommand() который предоставляет подробный отчет, но только после выполнения команды. Заглянул в это

Причина -

Я пытаюсь добавить обновление статуса в инструмент, над которым я работаю, который показывает, какой файл Perforce в данный момент синхронизируется.

Пожалуйста, порекомендуйте. Заранее спасибо.

-Bharath

1 ответ

Решение

В клиентском API C++ (на котором построен P4V) клиент получает OutputInfo обратный звонок (или OutputStat в tagрежим ged) для каждого файла при его синхронизации.

Просматривая документацию.NET, я думаю, что эквиваленты P4CallBacks.InfoResultsDelegate а также P4CallBacks.TaggedOutputDelegate которые обрабатывают такие события, как P4Server.InfoResultsReceived и т.п.

У меня возникла та же проблема, и я изо всех сил пытался заставить ее работать, поэтому я поделюсь решением, которое я нашел:

Во-первых, вы должны использовать класс P4Server вместо Perforce.P4.Connection. Это два класса, которые делают более или менее одно и то же, но когда я попытался использовать события P4.Connection.TaggedOutputReceived, я просто ничего не получил обратно. Вместо этого я попробовал использовать 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);
}

И метод обработки сообщений об ошибках или taggedOutput:

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.
}
Другие вопросы по тегам