API TFS 2010: получить старое имя / местоположение переименованного / перемещенного элемента - PullRequest
4 голосов
/ 20 января 2012

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

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

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

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

1 голос
/ 12 мая 2014

Вам нужно будет использовать 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);
        }
    }
}

РЕДАКТИРОВАТЬ: Переместил другойрешение вверх.Дальнейшее сработало, когда я тестировал чистое изменение 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);
    // ...
}
...