2012-01-20 50 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); 
    // ... 
}