web-dev-qa-db-fra.com

Comment puis-je extraire par programme un élément à éditer dans TFS?

Je travaille sur un utilitaire traitant des fichiers sous contrôle de source à l'aide de TFS 2010.

Si un élément n'est pas encore extrait pour édition, je reçois une exception, ce qui est définitivement prévisible, car le fichier est en lecture seule.

Comment existe-t-il pour extraire un fichier?

P.S. Je veux quelque chose pour le programmatique plutôt que Process.Start("tf.exe", "..."); si c'est applicable.

39
abatishchev

Certaines des autres approches mentionnées ici ne fonctionnent que pour certaines versions de TFS ou utilisent des méthodes obsolètes. Si vous recevez un 404, l'approche que vous utilisez n'est probablement pas compatible avec la version de votre serveur.

Cette approche fonctionne pour 2005, 2008 et 2010. Je n'utilise plus TFS, je n'ai donc pas testé 2013.

var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(fileName);
using (var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri))
{
    var workspace = workspaceInfo.GetWorkspace(server);    
    workspace.PendEdit(fileName);
}
37
Ben
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);
}

Notez que Microsoft.TeamFoundation.Client.TeamFoundationServerFactory est obsolète: la classe TeamFoundationServer est obsolète. Utilisez les classes TeamFoundationProjectCollection ou TfsConfigurationServer pour parler à un serveur Team Foundation Server 2010 . Pour parler à un serveur Team Foundation 2005 ou 2008, utilisez la classe TeamFoundationProjectCollection. La classe d'usine correspondante pour cela est la TfsTeamProjectCollectionFactory.

5
wp9omp

Vous pouvez utiliser l'API client de Team Foundation Version Control . La méthode est PendEdit ().

workspace.PendEdit(fileName);

Commander un exemple détaillé sur MSDN http://blogs.msdn.com/b/buckh/archive/2006/03/15/552288.aspx

4
ukhardy

D'abord obtenir l'espace de travail

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

Avec l'espace de travail, vous pouvez extraire le fichier

workspace.PendEdit(fileName);
2
BrunoLM
var registerdCollection = RegisteredTfsConnections.GetProjectCollections().First();
var projectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(registerdCollection);
var versionControl = projectCollection.GetService<VersionControlServer>();

var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(_fileName);
var server = new TeamFoundationServer(workspaceInfo.ServerUri.ToString());
var workspace = workspaceInfo.GetWorkspace(server);

workspace.PendEdit(fileName);
1
abatishchev

J'ai deux approches pour faire cela: simple et avancée.

1). Simple:

  #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<bool> CheckoutAsync(string path)
    {
        return await Task.Run(() => CheckOut(path));
    }
    #endregion

2) Avancé (avec statut de réception):

    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<VersionControlServer>().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<string> CheckoutFileInternalAsync(string[] wsFiles, string folder)
    {
        return await Task.Run(() => CheckoutFileInternal(wsFiles, folder));
    }
0
Mr.B