2016-05-06 7 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>)、所有者ではなく、最後のチェンジセットとコードを1行に渡します。

また、Annotationクラスを持つMicrosoft.TeamFoundation.VersionControl.Server名前空間も見つかりました。そのDLLにアクセスするために私のマシンにTFSをインストールしましたが、この問題の助けにはならないようです。

TFSアノテーションにプログラムでアクセスして、ファイルのコード行の所有者を特定するにはどうすればよいですか?

+0

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

+0

@CodeCaster:ハ。コメントしたところで私の質問を更新しました。答えは実際には答えではありません... – im1dermike

+0

どのように役立たないか説明できますか?それが本当であれば、それを行うための組み込みの方法はなく、そのためのツールもありません(ツールを直接求めているのはトピック外です)。ただし、TFS APIを使用して、これを行う小さなプログラムを書くことができます。 – CodeCaster

答えて

1

アイテムの変更タイプが分岐の場合、ブランチをクエリする必要があります。 シンプルたとえば、$ /プロジェクト/開発/ A.TXTの歴史を照会するとき、あなたはまた、使用してA.TXT $ /プロジェクト/メイン/の歴史を得ることができ、シナリオ

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

があります次のコード

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

私を完全なプロジェクトにリンクしてくれてありがとう。それはかなり複雑で複雑ですが、私はそのレポのクラスのいくつかを使って、1行にファイルに注釈を付けることができました!私はあなたの答えを受け入れていますが、私はしばらくすると、私が必要とするすべてのコードを投稿します。再度、感謝します! – im1dermike

関連する問題