2017-07-08 23 views
0

私がしようとしているのは、特定の期間にTest TFS Team Projectにプッシュされたすべての.sqlスクリプトを見つけて、ファイルをダウンロードするか、自分のワークスペースのコピーをOUTSIDEの外側にダウンロードしてください。だから私は最新のものを取りたいと思う必要はありません。これは、アプリケーションが特定の期間に実行された特に.sqlの変更をすべて確認し、それらのファイルを分岐環境と比較して、データベースに対してコピーして実行した.sqlを特定するものです。Microsoft.TeamFoundation.VersionControl.Clientを使用してVersionSpecから特定のファイルをダウンロードする

ファイルを表示するか、ファイルをダウンロードするためのリンクが表示されません。私がファイルをダウンロードする際に問題となるのは、何百ものファイルをダウンロードすることです。テストの外にある別の環境に対して.sqlスクリプトを再実行できるかどうかを判断するために各ファイルを表示することになります。

public void GetChangesets(DataTable files, 
          bool excludeManualDatabaseFiles, 
          bool containsExcludedDerictoriesAndFiles) 
    { 
     // this gets collection-lvl services, in contrast to TfsConfigurationServer (server-lvl) 
     Uri serverUri = new Uri("<insert serverUri>"); 
     var tpc = new TfsTeamProjectCollection(serverUri); 
     var vcs = tpc.GetService<VersionControlServer>(); 

     DateTime testDate; 
     DateTime.TryParse("2017-07-01", out testDate); 

     VersionSpec fromDateVersion = new DateVersionSpec(testDate); 
     VersionSpec toDateVersion = new DateVersionSpec(DateTime.Now); 

     vcs.QueryRootBranchObjects(RecursionType.Full); 

     string teamProjectName = "<insert team project name>"; 
     TeamProject[] tps = new TeamProject[] 
     { 
      vcs.GetTeamProject(teamProjectName) 
     }; 

     DataTable returnedChangesetDetail = new DataTable(); 
     // Step 1: THIS WORKS 
     returnedChangesetDetail.Columns.Add("FileName"); 
     // Step 2: THIS DOES NOT WORK, this is currently empty !!!!!! 
     returnedChangesetDetail.Columns.Add("Uri"); 


     foreach(TeamProject tp in tps) 
     { 
      IEnumerable changesets = vcs.QueryHistory(string.Concat("$/", tp.Name, "/Test/SQL"), 
       VersionSpec.Latest, 
       deletionId: 0, 
       recursion: RecursionType.Full, 
       user: null, 
       versionFrom: fromDateVersion, 
       versionTo: toDateVersion, 
       maxCount: int.MaxValue, 
       includeChanges: true, 
       slotMode: true); 



      foreach(Changeset changeset in changesets) 
      { 

       foreach(Change change in changeset.Changes) 
       { 
        string fileName = change.Item.ServerItem; 
        // I think this would be it but its not an accessible link, do I add/remove 
        // something to make this a Uri? 
        //var artifactUrui = change.Item.ArtifactUri; 

        // Step 1: WORKING 
        lstbxFileNames.Items.Add(fileName); 

       } 
      } 

     } 

    } 

私が探しているものを説明することを願っています。これは、開発者ではない技術者が自分の環境に必要な変更をレビューできるようにするためのアプリです。彼らは約100件のファイルを見直す必要があります。私は、Uriが変更を見て、その後、ステップ1で見つかった変更を無視して必要なファイルを選択しないようにする簡単な方法だと考えていました。

答えて

0

ファイルのダウンロードURLはありません。

あなたのTFSのバージョンがTFS 2015以上であれば、あなたはversion control Items REST APIリンクを使用することができますが(現在のユーザーがターゲットファイルにアクセスする権限を持っていることを確認してください)

そうしないと、パスとバージョンでボタン/ハイパーリンクを提供することができますDownloadFileメソッドを使用してファイル(一時ファイル)をダウンロードし、コンテンツストリーム(ストリームごとにコンテンツを読み込む)をクライアントに送信して、ローカルマシンにボタン/ハイパーリンククリックイベントでローカルマシンに保存させる。

+0

この方法でサーバーパスとは何ですか?私はそれがItem.ServerItemだと思っていただろうが、それは単に無効なファイル名の例外をスローするようだ。 – vfrank66

+0

@ vfrank66これはServerItemで、うまく動作します。このファイルは削除されていますか?次のようなコードがあります:DownloadFile(changeset.Item.ServerPath、changeset.Item.DeletionId、new DateVersionSpec(changeset.Item.CheckinDate)、 "D:\\ d \\ test.cs"); –

関連する問題