2016-05-06 37 views
2

我工作的一個項目團隊和我們的應用是在TFS。我試圖確定每個團隊成員負責的代碼行數。在TFS中,我知道Visual Studio界面中的Annotate功能,它允許您查看最後一次修改每行代碼的人,因此我知道TFS具有此信息。編程訪問TFS註解來確定所有者

我寫它訪問我的TFS項目及其所有文件小控制檯應用程序,但我現在需要以編程方式訪問註解,所以我可以看到誰的每一行的所有者。這裏是我現有的代碼:

using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.VersionControl.Client; 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var credentials = new NetworkCredential(username, password, domain); 
     var server = new TfsTeamProjectCollection(new Uri(serverUrl), credentials); 
     var version = server.GetService(typeof(VersionControlServer)) as VersionControlServer; 
     var items = version.GetItems(projectPath, RecursionType.Full); 
     var fileItems = items.Items.Where(x => x.ItemType == ItemType.File);    
     foreach (var fileItem in fileItems) 
     { 
      var serverItem = fileItem.ServerItem; 
      //TODO: retrieve and parse annotations 
     } 
    } 
} 

我似乎無法弄清楚如何檢索註釋一旦我有TFS項目。 This鏈接介紹瞭如何通過調用TFPT做,但是做起來(tfpt annotate /noprompt <filename>)之後,你只給最後的變更和代碼每行,而不是主人。

我還發現了一個Microsoft.TeamFoundation.VersionControl.Server命名空間中有一個Annotation類。我在我的機器上安裝了TFS以訪問該DLL,但似乎對此問題沒有任何幫助。

你怎麼能編程方式訪問TFS的註釋,以確定文件的代碼行的老闆?

+0

http://stackoverflow.com/questions/74526/tfs-annotate-blame-summary-report-for-a-project – CodeCaster

+0

@CodeCaster:哈。我剛剛更新了你的評論。答案不是真的答案... – im1dermike

+0

你能解釋它是如何沒有幫助嗎?如果這是真的,那麼沒有內置的方法來做到這一點,也沒有任何工具(注意直接要求工具是脫離主題)。然而,你可以使用TFS API並編寫一個這樣的小程序。 – CodeCaster

回答

1

您可能需要查詢分支時,項目的改變類型爲分行。 舉個簡單的例子,有一個場景

$/Project 
    /Main` 
    /a.txt 
    /Develop 
    /a.txt (branched from main) 

當您查詢的$歷史/項目/開發/ a.txt中,你還可以得到$歷史/項目/主/ a.txt中使用下面的代碼

void GetAllHistory(string serverItem) 
    {      
     var changesets=vcs.QueryHistory(serverItem, 
      Microsoft.TeamFoundation.VersionControl.Client.VersionSpec.Latest, 
      0, 
      Microsoft.TeamFoundation.VersionControl.Client.RecursionType.None, 
      null, 
      new Microsoft.TeamFoundation.VersionControl.Client.ChangesetVersionSpec(1), 
       Microsoft.TeamFoundation.VersionControl.Client.VersionSpec.Latest, 
       int.MaxValue, 
       true, 
       false); 

     foreach (var obj in changesets) 
     { 
      Microsoft.TeamFoundation.VersionControl.Client.Changeset cs = obj as Microsoft.TeamFoundation.VersionControl.Client.Changeset; 
      if (cs == null) 
      { 
       return; 
      } 
      foreach (var change in cs.Changes) 
      { 
       if (change.Item.ServerItem != serverItem) 
       { 
        return; 
       } 

       Console.WriteLine(string.Format("ChangeSetID:{0}\tFile:{1}\tChangeType:{2}", cs.ChangesetId,change.Item.ServerItem, change.ChangeType)); 
       if ((change.ChangeType & Microsoft.TeamFoundation.VersionControl.Client.ChangeType.Branch) == Microsoft.TeamFoundation.VersionControl.Client.ChangeType.Branch) 
       { 
        var items=vcs.GetBranchHistory(new Microsoft.TeamFoundation.VersionControl.Client.ItemSpec[]{new Microsoft.TeamFoundation.VersionControl.Client.ItemSpec(serverItem, Microsoft.TeamFoundation.VersionControl.Client.RecursionType.None)}, 
         Microsoft.TeamFoundation.VersionControl.Client.VersionSpec.Latest); 

        GetAllHistory(items[0][0].Relative.BranchToItem.ServerItem); 
       } 
      } 

     } 
    } 
+0

沒有在這個代碼中的哪裏可以看到我可以在哪裏獲得每行代碼的所有者。我實現了它,並且我可以看到的唯一所有者是變更集('obj.Owner')的所有者。 – im1dermike

+1

我找到了一個適用於您的在線項目,它解釋瞭如何通過TFS API獲取註釋。實際上它使用上面提到的相同的東西 - 從GetBranchHistory()結果獲取Item [0] [0]的遞歸數據。但是實現更復雜。如果許可證沒有問題,您可能希望將該GitHub模塊包含到您的項目中。 https://github.com/SonarQubeCommunity/sonar-scm-tfvc –

+0

感謝您將我鏈接到完整的項目。這是相當複雜/複雜的,但我可以使用該回購中的一些類爲每行註釋文件!我接受你的答案,但是當我有一些時間時,我會用我所需要的完整的代碼發佈。再次感謝! – im1dermike

相關問題