Come posso controllare a livello di codice un elemento per la modifica in TFS?

Sto lavorando su un file di elaborazione di utilità sotto il controllo del codice sorgente utilizzando TFS 2010.

Se un articolo non è ancora stato ritirato per la modifica, ricevo un’eccezione, ciò che è sicuramente prevedibile perché il file è in modalità di sola lettura.

Quali sono i modi per estrarre un file?

PS Voglio qualcosa per programmatic piuttosto che Process.Start("tf.exe", "..."); se questo è applicabile.

Alcuni degli altri approcci menzionati qui funzionano solo per determinate versioni di TFS o fanno uso di metodi obsoleti. Se stai ricevendo un 404, l’approccio che stai utilizzando probabilmente non è compatibile con la versione del tuo server.

Questo approccio funziona nel 2005, 2008 e 2010. Non uso più TFS, quindi non ho testato il 2013.

 var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(fileName); using (var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri)) { var workspace = workspaceInfo.GetWorkspace(server); workspace.PendEdit(fileName); } 
 private const string tfsServer = @"http://tfsserver.org:8080/tfs"; public void CheckOutFromTFS(string fileName) { using (TfsTeamProjectCollection pc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(tfsServer))) { if (pc != null) { WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(fileName); if (null != workspaceInfo) { Workspace workspace = workspaceInfo.GetWorkspace(pc); workspace.PendEdit(fileName); } } } FileInfo fi = new FileInfo(fileName); } 

Si noti che Microsoft.TeamFoundation.Client.TeamFoundationServerFactory è obsoleto: la class TeamFoundationServer è obsoleta. Utilizzare le classi TeamFoundationProjectCollection o TfsConfigurationServer per parlare con un Team Foundation Server 2010. Per parlare con un Server Foundation Server 2005 o 2008, utilizzare la class TeamFoundationProjectCollection . La class factory corrispondente per questo è TfsTeamProjectCollectionFactory .

È ansible utilizzare l’API client di controllo versione di Team Foundation. Il metodo è PendEdit ()

 workspace.PendEdit(fileName); 

Scopri l’esempio dettagliato su MSDN http://blogs.msdn.com/b/buckh/archive/2006/03/15/552288.aspx

Per prima cosa prendi l’area di lavoro

 var tfs = new TeamFoundationServer("http://server:8080/tfs/collection"); var version = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); var workspace = version.GetWorkspace("WORKSPACE-NAME", version.AuthorizedUser); 

Con lo spazio di lavoro è ansible eseguire il checkout del file

 workspace.PendEdit(fileName); 
 var registerdCollection = RegisteredTfsConnections.GetProjectCollections().First(); var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(registerdCollection); var versionControl = projectCollection.GetService(); var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(_fileName); var server = new TeamFoundationServer(workspaceInfo.ServerUri.ToString()); var workspace = workspaceInfo.GetWorkspace(server); workspace.PendEdit(fileName); 

Ho due approcci su come farlo: semplice e avanzato.

1). Semplice:

  #region Check Out public bool CheckOut(string path) { using (TfsTeamProjectCollection pc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(ConstTfsServerUri))) { if (pc == null) return false; WorkspaceInfo workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(path); Workspace workspace = workspaceInfo?.GetWorkspace(pc); return workspace?.PendEdit(path, RecursionType.Full) == 1; } } public async Task CheckoutAsync(string path) { return await Task.Run(() => CheckOut(path)); } #endregion 

2). Avanzato (con stato di ricezione):

  private static string GetOwnerDisplayName(PendingSet[] pending) { var result = pending.FirstOrDefault(pendingSet => pendingSet.Computer != Environment.MachineName) ?? pending[0]; return result.OwnerDisplayName; } private string CheckoutFileInternal(string[] wsFiles, string folder = null) { try { var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(folder); var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri); var workspace = workspaceInfo.GetWorkspace(server); var request = new GetRequest(folder, RecursionType.Full, VersionSpec.Latest); GetStatus status = workspace.Get(request, GetOptions.None); int result = workspace.PendEdit(wsFiles, RecursionType.Full, null, LockLevel.None); if (result == wsFiles.Length) { //TODO: write info (succeed) to log here - messageText return null; } var pending = server.GetService().QueryPendingSets(wsFiles, RecursionType.None, null, null); var messageText = "Failed to checkout !."; if (pending.Any()) { messageText = string.Format("{0}\nFile is locked by {1}", messageText, GetOwnerDisplayName(pending)); } //TODO: write error to log here - messageText return messageText; } catch (Exception ex) { UIHelper.Instance.RunOnUiThread(() => { MessageBox.Show(Application.Current.MainWindow, string.Format("Failed checking out TFS files : {0}", ex.Message), "Check-out from TFS", MessageBoxButton.OK, MessageBoxImage.Error); }); return null; } } public async Task CheckoutFileInternalAsync(string[] wsFiles, string folder) { return await Task.Run(() => CheckoutFileInternal(wsFiles, folder)); }