Как показать вывод для файловых операций, выполняемых API Perforce?
Я собираюсь синхронизировать файлы Perforce через API Perforce. Я ожидаю вывода о каждой файловой операции. Что-то вроде того, что мы видим в результате вывода p4 cmd:
- //depot/file.txt#1 - обновление X:\file.txt
- //depot/file.txt#2 - удалено как X:\file.txt
Вот мой код API Perforce для синхронизации файлов:
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 ответа
Вот решение, которое я нашел:
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);
}
... хранилище. Соединение содержит также другие интересные делегаты для подключения: .CommandEcho, .Errorreceived, .InfoResultReceived, .TextResultsReceived.
Функция Client.SyncFiles предоставляет аккуратный список файлов, которые были затронуты, но не остальную часть вывода команды синхронизации. Если вы просто хотите выяснить, был ли файл удален или нет, нужно выполнить проверку clientFile на локальном компьютере.
Если вы хотите получить полный вывод, лучше использовать интерфейс P4Server:
Если вы вызываете RunCommand() с "tagged", установленным в true, он должен дать вам все данные, которые вы получите от "p4 -Ztag (command)", с результатами, доступными через GetTaggedOutput(). Запуск его без опции "tagged" даст вам отформатированное сообщение, которое вы увидите как конечный пользователь, доступное через GetInfoMessages().