読者です 読者をやめる 読者になる 読者になる

きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

C#のコードからTFSでチェックアウト中のファイルの一覧を取得する

そもそもの発端はMSBuildでのビルドプロセス中に、TFSのソース管理に対していくつか操作したいと思った事に始まります。
標準のタスクにはなさそうですし、カスタムタスク集の「MSBuild Community Tasks*1」にもいい感じのがありません。

最悪はTF.exeをExecタスクから呼ぶことも考えたのですが、今一つスマートさに欠ける気がするのでこれは最終手段ということで保留。


いろいろ調べていると、.NET Framework向けにMicrosoft.TeamFoundation名前空間で色々と機能が提供されていることを知りました。

Microsoft.TeamFoundation名前空間

これを使って.NETの言語からTFSの機能にアクセスできるのであれば、後はカスタムタスクの形に作ってしまえばいいので、MSBuildから呼び出すのも楽そうです。

ちょうどMSDNにサンプルがあったこともあり、実現したかったことの一つである『TFSでチェックアウト中(”保留中のチェックイン”)のファイルの一覧』の取得をやってみました。
ポイントを書いてみたいと思います。

ポイント1:参照設定の追加

プロジェクトの参照設定に以下の二つを加えます。

  • Microsoft.TeamFoundation.Client
  • Microsoft.TeamFoundation.VersionControl.Client

ポイント2:TFSへの接続

TFSへの接続は以下のコードで書けばよいようです。

var tfsCollectionAddress = @"<serveraddress:portnumber>/<TeamCollectionName>"; 
var tfs = new TfsTeamProjectCollection( new Uri (tfsCollectionAddress),
                                        new UICredentialsProvider ());
tfs.EnsureAuthenticated();

ポイント3:ソース管理サービスへの参照を取得

TfsTeamProjectCollectionクラスのGetServiceメソッドを使い、ソース管理サービスへの参照をVersionControlServerのインスタンスとして取得します。

var versionControl = (VersionControlServer )tfs.GetService( typeof( VersionControlServer ));

ポイント4:QueryPendingSetsメソッドを使って『保留中のチェックイン』を取得

QueryPendingSetsメソッドを使って、『保留中のチェックイン』の一覧を取得します。
このメソッドにはいくつかオーバーロードがあるようですが、今回はこちらの引数3つのオーバーロードを利用することにします。
引数は以下の模様

  • ItemSpec[] itemSpecs,
    • 対象のアイテム(フォルダ)を示す、ItemSpecの配列を設定します。
  • string queryWorkspaceName
  • string queryUserName
    • チェックアウトユーザ名で絞りたいとき、指定します。ユーザを対象とするのであればから文字列でよいようです。

特定のフォルダの配下で現在チェックアウト中のファイルを、ワークスペース/ユーザを問わずに取得する場合は以下のようになります。

var itemSpecs = new ItemSpec[1];
itemSpecs[0] = new ItemSpec ( @"$/TestProject1", RecursionType .Full);

var pendingSets = versionControl.QueryPendingSets(itemSpecs,"","");

戻り値はpendingSetの配列になります。例えば、こんな具合にすればファイルの一覧を列挙できます。

var sb = new StringBuilder();
foreach (var ps in pendingSets)
{
    foreach (var pc in ps.PendingChanges)
    {
        sb.AppendLine(pc.FileName);
    }
}

サンプルソース

上記を実装してみたサンプルソースをアップしておきます。
https://skydrive.live.com/redir?resid=BEAD9BC2511BDF7F!1928

*1:NuGetで取得可能。ソースは https://github.com/loresoft/msbuildtasks