2012-01-20 1 views
4

Я пишу приложение, которое извлекает изменения из TFS и экспортирует файл csv, который описывает последние изменения для использования в скрипте, чтобы вносить эти изменения в ClearCase. Однако «последнее» не обязательно означает последнее. Если файл был добавлен, а затем отредактирован, мне нужно только знать, что файл был добавлен, и получить последнюю версию, чтобы мой скрипт знал, как правильно ее обрабатывать. Большая часть этого довольно прямолинейна. Я попадаю на файлы, которые были переименованы или перемещены, так как я не хочу показывать этот элемент как удаляемый, а другой элемент добавлен. Чтобы поддерживать целостность ClearCase, мне нужно, чтобы в файле CSV был перемещен или переименован элемент вместе со старым местоположением и новым местоположением.API TFS 2010: получить старое имя/местоположение переименованного/перемещенного элемента

Итак, проблема, с которой я столкнулась, заключается в отслеживании переименованного (или перемещенного) файла назад к предыдущему имени или местоположению, чтобы я мог сопоставить его с новым местоположением/именем. Где в API я могу получить эту информацию?

+0

Как вы запрашивая сервер для данных? Вы просто запрашиваете элементы в последней версии? Вы идете по истории? –

ответ

2

Вот ваш ответ: http://social.msdn.microsoft.com/Forums/en/tfsgeneral/thread/f9c7e7b4-b05f-4d3e-b8ea-cfbd316ef737 Использования QueryHistory вы можете узнать, что пункт был переименован, а затем с помощью своей предыдущей ревизии (предыдущей к тому, что говорит, что это было переименовано), вы можете найти его прежнее название.

1

Вам необходимо будет использовать VersionControlServer.QueryHistory способом, подобным следующему методу. Обратите особое внимание на SlotMode, который должен быть false для переименований.

private static void PrintNames(VersionControlServer vcs, Change change) 
{ 
    //The key here is to be sure Slot Mode is enabled. 
    IEnumerable<Changeset> queryHistory = 
     vcs.QueryHistory(
      new QueryHistoryParameters(change.Item.ServerItem, RecursionType.None) 
       { 
        IncludeChanges = true, 
        SlotMode = false, 
        VersionEnd = new ChangesetVersionSpec(change.Item.ChangesetId) 
       }); 

    string name = string.Empty; 

    var changes = queryHistory.SelectMany(changeset => changeset.Changes); 

    foreach (var chng in changes) 
    { 
     if (name != chng.Item.ServerItem) 
     { 
      name = chng.Item.ServerItem; 
      Console.WriteLine(name); 
     } 
    } 
} 

EDIT: Переехал другое решение вверх. Что следует за работой, когда я тестировал чистое изменение Rename, но сломался, когда устал от изменения Rename и Edit.

Это, вероятно, самый эффективный способ получить предыдущее имя. Хотя он работает (API TFS2013 против установки TFS2012), он выглядит как ошибка для меня.

private static string GetPreviousServerItem(VersionControlServer vcs, Item item) 
{ 
    Change[] changes = vcs.GetChangesForChangeset(
     item.ChangesetId, 
     includeDownloadInfo: false, 
     pageSize: int.MaxValue, 
     lastItem: new ItemSpec(item.ServerItem, RecursionType.None)); 

    string previousServerItem = changes.Single().Item.ServerItem; 

    //Yep, this passes 
    Trace.Assert(item.ServerItem != previousServerItem); 

    return previousServerItem; 
} 

он будет использоваться как:

if (change.ChangeType.HasFlag(ChangeType.Rename)) 
{ 
    string oldServerPath = GetPreviousServerItem(vcs, change.Item); 
    // ... 
}