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

【C#】Team Foundation Server SDKの覚書

ドキュメントを読んでもちんぷんかんぷんだったので試行錯誤したあれをメモしておきます。

TFSへの接続

var nc = new NetworkCredential(userName, password);
//ここのUriは"http://[TFSのサーバ名]:[ポート番号]/[ディレクトリ]"を指定する
var configurationServer = new TfsConfigurationServer(new Uri(uri), nc);
configurationServer.Authenticate();
if (configurationServer.HasAuthenticated)
{
    //以下、認証後の処理
}

バージョン管理サービスへの接続

var tpcService = configurationServer.GetService<ITeamProjectCollectionService>();
var configurationServerNode = configurationServer.CatalogNode;
var tpcNodes = configurationServerNode.QueryChildren(new Guid[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None);

//tpcNodesはTFSに登録されているチームプロジェクト
//何らかの分岐をさせたい場合はCatalogNode.Resource.DisplayNameにチームプロジェクト名があるので
//var tpcNode = tpcNodes.Where(x => x.Resource.DisplayName == projectName).First();
//のような形でやると楽
//バージョン管理サービスを取得するだけならSelectでやってしまってもいい
//ex) var vcs = tpcNodes.Select(x => configurationServer.GetTeamProjectCollection(new Guid(x.Resource.Properties["InstanceId"])).GetService<VersionControlServer>())
//                      .First();
foreach (var tpcNode in tpcNodes)
{
    var tpcId = new Guid(tpcNode.Resource.Properties["InstanceId"]);
    var tpc = configurationServer.GetTeamProjectCollection(tpcId);
    var vcs = tpc.GetService<VersionControlServer>();
}

バージョン管理サービスから色々な情報を取得

//GetItemsの引数であるpathは「マッピングに使用しているローカルフォルダ」であることに注意する
//VersionSpecはenumではなくclass。変更セット単位など色々出来るらしい。Latestは最新バージョン。
//RescursionTypeには[Full],[OneLevel],[None]があり、取得するフォルダ階層に関わってくる(らしい)
//とりあえずFullを指定しておけば配下のファイルはすべて取ってくる
foreach(var item in vcs.GetItems(workspace, VersionSpec.Latest, RescursionType.Full).Items)
{
    //Itemの持つプロパティはいろいろ
    //Item.ServerItem : TFS上のパス
    //Item.CheckinDate : チェックイン日付
}
see:Item クラス (Microsoft.TeamFoundation.VersionControl.Client) まぁ結局読んでも全然わからないので適当にConsole.WriteLineなりウォッチ式を書いた方が早い。