Estoy trabajando en una utilidad de procesamiento de archivos de estar bajo control de código fuente con TFS 2010.

Si un elemento aún no está desprotegido para editar, me estoy haciendo una excepción, lo que definitivamente es predecible porque el archivo está en modo de sólo lectura.

¿Qué formas existen para la salida a un archivo?

P. S. quiero algo para programática en lugar de Process.Start("tf.exe", "..."); si es aplicable.

InformationsquelleAutor abatishchev | 2011-02-23

6 Comentarios

  1. 37

    Algunos de los otros métodos que se mencionan aquí sólo funcionan para ciertas versiones de TFS o hacer uso de métodos obsoletos. Si usted está recibiendo un error 404, el enfoque que usted está utilizando probablemente no es compatible con la versión del servidor.

    Este enfoque funciona en 2005, 2008 y 2010. Yo no uso TFS más, así que yo no lo he probado 2013.

    var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(fileName);
    using (var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri))
    {
        var workspace = workspaceInfo.GetWorkspace(server);    
        workspace.PendEdit(fileName);
    }
    • He borrado mi respuesta, porque la suya es una versión simplificada que trabaja con VS 2010. Resulta que usted no tiene que ir a través de la TfsConfigurationServer para obtener los objetos que usted necesita. blogs.msdn.com/b/taylaf/archive/2010/02/23/…
    • TfsTeamProjectCollection es IDisposable, por lo que puede envolver en un bloque using
    • Estás en lo correcto. El código que he copiado esto de mantenerse la TfsTeamProjectCollection alrededor para usos múltiples. Pero esto mejora el ejemplo.
    • Quería añadir un comentario para futuros visitantes. Si usted está utilizando el más detallado PendEdit() función que toma en el silent parámetro, se desea establecer silent a false, esto hará que se quite el bloqueo.
  2. 6
    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);
    }

    Nota que Microsoft.TeamFoundation.Client.TeamFoundationServerFactory es obsoleto: El TeamFoundationServer clase es obsoleto. El uso de la TeamFoundationProjectCollection o TfsConfigurationServer clases para hablar de 2010 Team Foundation Server.
    Con el fin de hablar de 2005 o 2008 Team Foundation Server usar el TeamFoundationProjectCollection clase. La correspondiente clase de fábrica por que es el TfsTeamProjectCollectionFactory.

  3. 2

    Primer lugar, obtener el área de trabajo

    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 el espacio de trabajo que usted puede descargar el archivo

    workspace.PendEdit(fileName);
  4. 1
    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);
  5. 0

    Tengo dos enfoques de cómo hacerlo: simple y avanzada.

    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). Avanzado (con la recepción de estado):

        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));
    }
    • Puede que desee sufijo de la función interna interna y quitar ese sufijo del público.
    • También se ejecuta la función de sincronización en async manera no tiene mucho sentido para mí. De todos modos probablemente puede regresar tarea directamente en lugar de esperar que lo que se esperada llamada

Dejar respuesta

Please enter your comment!
Please enter your name here