2012-06-11 39 views
2

我需要從TFS獲取修訂版本號,如果我從進程暫停的進程運行tf.exe。如果我從命令運行相同的命令promts它的作品?從C#暫停執行tf.exe(TFS)

int revision; 

var repo = "path to repo" 

var psi = new ProcessStartInfo("cmd", @"/c ""C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe"" properties $/MYProject -recursive /version:W") 
{ 
    UseShellExecute = false, 
    ErrorDialog = false, 
    CreateNoWindow = false, 
    WorkingDirectory = repo, 
    RedirectStandardOutput = true, 
    RedirectStandardError = true 
}; 

using (var p = Process.Start(psi)) 
{ 
    p.WaitForExit(); 
    if (p.ExitCode != 0) 
    { 
     using (var standardError = p.StandardError) 
     { 
      Console.WriteLine(standardError.ReadToEnd()); 
     } 
    } 
    else 
    { 
     using (var standardOutput = p.StandardOutput) 
     { 
      revision = int.Parse(standardOutput.ReadToEnd()); 
     } 
    } 
} 

編輯:

我這樣做,工作,我應該去用它?

public int GetLatestChangeSet(string url, string project) 
{ 
    var server = new TeamFoundationServer(new Uri(url)); 
    var version = server.GetService(typeof(VersionControlServer)) as VersionControlServer; 

    var items = version.GetItems(string.Format(@"$\{0}", project), RecursionType.Full); 
    return items.Items.Max(i => i.ChangesetId); 
} 
+0

你爲什麼不使用SDK? http://msdn.microsoft.com/en-us/library/bb130146(v=vs.100).aspx –

+0

同意@MikeMiller,如果你想在TF工具上使用Reflector,它在內部使用TFS SDK。 –

+0

在您的ProcessStartInfo中,您正在使用錯誤的語法來啓動.exe文件。 (通過「cmd」啓動一個.exe)這裏是[ProcessStartInfo]的正確語法(http://stackoverflow.com/questions/1538711/passing-paths-to-cmd-using-processstartinfo-not-working-as-意)。 –

回答

1

我結束了這個解決方案,它使用本地工作區修訂

public class ReadTfsRevisionTask : Task 
{ 
    public override bool Execute() 
    { 
     try 
     { 
      ChangesetId = GetLatestChangeSet(Server, Project); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 

    private int GetLatestChangeSet(string url, string project) 
    { 
     project = string.Format(@"$/{0}", project); 

     var server = new TeamFoundationServer(new Uri(url)); 
     var version = server.GetService<VersionControlServer>(); 

     var workspace = version.QueryWorkspaces(null, WindowsIdentity.GetCurrent().Name, System.Environment.MachineName).First(); 
     var folder = workspace.Folders.First(f => f.ServerItem == project); 

     return workspace.GetLocalVersions(new[] { new ItemSpec(folder.LocalItem, RecursionType.Full) }, false) 
      .SelectMany(lv => lv.Select(l => l.Version)).Max(); 
    } 

    [Required] 
    public string Server { get; set; } 

    [Required] 
    public string Project { get; set; } 

    [Output] 
    public int ChangesetId { get; set; } 

} 
1

您更好地使用下面的命名空間包含了所有你需要做到這一點

Microsoft.TeamFoundation.VersionControl.Client 

//this is just an example 

using Microsoft.TeamFoundation.Client; 
using Microsoft.TeamFoundation.VersionControl.Client; 

TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://myserver:8080/")); 
VersionControlServer sourceControl = tpc.GetService<VersionControlServer>(); 
return sourceControl.GetLatestChangesetId(); 

http://msdn.microsoft.com/en-us/library/ms228232(v=vs.80

+0

謝謝,你不知道如何選擇項目?上面的代碼返回整個服務器的最新變化 – Anders

+0

@Anders閱讀我上面的評論。 –

+0

http://stackoverflow.com/questions/8493762/tfs-2010-getting-list-of-changeset-ids –