TFS 2010 API:获取重命名/移动项目的旧名称/位置

时间:2012-01-20 19:02:24

标签: tfs tfs-sdk

我正在编写一个应用程序,它从TFS中提取变更集并导出一个csv文件,该文件描述了在脚本中使用的最新更改,以将这些更改推送到ClearCase。然而,“最新”并不一定意味着最新的。如果添加了一个文件然后进行了编辑,我只需要知道该文件已添加,并获取最新版本,以便我的脚本知道如何正确处理它。其中大部分都是相当直截了当的。我已经挂断了已重命名或移动的文件,因为我不想将该项目显示为已删除,并添加了另一项。为了维护ClearCase的完整性,我需要在CSV文件中移动或重命名该项目,以及旧位置和新位置。

因此,我遇到的问题是将重命名(或移动)的文件追溯到之前的名称或位置,以便我可以将其与新的位置/名称相关联。我可以在API中获取此信息吗?

2 个答案:

答案 0 :(得分:2)

这是你的答案: http://social.msdn.microsoft.com/Forums/en/tfsgeneral/thread/f9c7e7b4-b05f-4d3e-b8ea-cfbd316ef737 使用QueryHistory,您可以发现项目已重命名,然后使用其先前的变更集(在重命名的变更集之前),您可以找到其先前的名称。

答案 1 :(得分:1)

您需要以类似于以下方法的方式使用VersionControlServer.QueryHistory。请特别注意必须false的{​​{3}},以便重命名。

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更改时,后面的内容有效,但是当我厌倦了重命名和编辑更改时,它就崩溃了。

这可能是获取以前名称的最有效方式。虽然它有效(TFS2013 API反对作为TFS2012安装),但它看起来像是一个bug。

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);
    // ...
}