2012-01-20 23 views
4

我正在编写一个应用程序,它从TFS中提取变更集并导出一个csv文件,该文件描述用于脚本的最新更改以将这些更改推送到ClearCase中。然而,“最新”并不一定意味着最新的。如果添加了一个文件然后进行编辑,我只需要知道该文件已添加,并获取最新版本,以便我的脚本知道如何正确处理它。这其中大部分非常简单。我越来越挂在已重命名或移动的文件上,因为我不想将该项目显示为被删除,并添加了其他项目。为了保持ClearCase的完整性,我需要在CSV文件中将项目移动或重命名,以及旧位置和新位置。TFS 2010 API:获取重命名/移动项目的旧名称/位置

所以,我遇到的问题是将重命名(或移动)的文件追溯到以前的名称或位置,以便我可以将它关联到新的位置/名称。我可以在哪里获得这些信息?

+0

你是如何查询数据的服务器?你只是在最新版本查询项目?你正在走历史吗? –

回答

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

编辑:移动的其他溶液起来。当我对纯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); 
    // ... 
}