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)); }