2017-07-08 88 views
0

我正在嘗試的是在特定時間段內將所有.sql腳本推入到我的Test TFS團隊項目中,然後獲取鏈接以查看文件或下載複製到我的工作區的外部。所以我不需要想要得到最新的。這將使應用程序審查在特定時間段內執行的所有特定.sql更改,然後我將這些文件與分支環境進行比較,以確定哪些.sql複製並針對數據庫運行。使用Microsoft.TeamFoundation.VersionControl.Client從VersionSpec下載特定文件

我被困在獲取鏈接查看文件或下載文件。我預見到下載文件時遇到的問題是,我將下載數百個文件,並且最終會查看每個文件,以確定是否可以針對Test以外的其他環境重新運行.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」);? –