2011-02-10 10 views
5

Por lo tanto, estoy intentando recuperar los archivos de un espacio de trabajo en TFS. Desafortunadamente, cada intento que he hecho para hacer esto da como resultado una aplicación estancada. A partir de ahora, este es el código:Intentar recuperar archivos de la aplicación de espacios de trabajo de TFS

public void GetWorkspaceFiles(string workspaceName) 
    { 
     VersionControlServer sourceControl = (VersionControlServer)TfsServer.GetService(typeof(VersionControlServer)); 

     var items = sourceControl.GetItems(workspaceName, VersionSpec.Latest, RecursionType.Full) 
           .Items 
           .Where(x => x.ItemType == ItemType.File) 
           .ToList(); 

     for (int x = 0; x < items.Count; x++) 
      items[x].DownloadFile(); 

Lo que pasa es que cada vez que ejecute esta aplicación (en varias máquinas) que se ahogue en items[x].DownloadFile(). Todos los archivos en TFS no están bloqueados, todo está bien. Intentar utilizar el método Workspace.Get() da como resultado lo mismo.

Si presiono pausa, x será un valor específico, pero no puedo acceder a la colección de elementos, ya que cuando aparece "No puedo evaluar la expresión porque el hilo actual está en suspensión, espere o se une" . Cuando evalúo la pila de llamadas obtengo:

[In a sleep, wait, or join] 
[External Code] 
GetWorkspaceFiles(string workspaceName) Line 55 

No sé qué hacer más. Cada vez que pause la aplicación, x siempre tiene el mismo valor (sin embargo, el valor que se detiene es diferente para cada aplicación).

¿Alguien tiene alguna idea?


Editar: Después de añadir lógica de diagnóstico (basado en el enlace en la respuesta de subvención) estoy aún más confundido que nunca.

El espacio de trabajo que paso a este método es $/QA/Automated Test Scripts/Regression or System Test Scripts/RDE or Condo (verificado a través del depurador).

Sin embargo, cuando miro a los registros de TFS, que parece ser la descarga del archivo de código que estoy corriendo, ya que dice:

02/10/2011 12:26:58 (pid 5808, tid 5968, 42180 ms) Recording OperationStatus.Getting for $/QA/Automated Test Scripts/QA Tools/Test Manager/Test Polling Server/fmMain.cs 

Justo después de que la entrada es:

02/10/2011 12:26:58 (pid 5808, tid 5968, 42180 ms) DownloadFiles: 18 ms 
02/10/2011 12:26:58 (pid 5808, tid 5968, 42181 ms) Acknowledgements: 0 ms 

Después de eso, no hay más actualizaciones en el archivo de registro y mi aplicación está detenida. De lo que estoy confundido acerca es

1) ¿Por qué esta tratando de sacar el código de aplicación de TFS cuando yo estoy especificando un espacio de trabajo completamente diferente TFS

2) ¿Por qué es este estancamiento después de intentar recuperar el archivo? Es posible que sea porque fmMain.cs está abierto en Visual Studio, pero aún así debería sobresalir y no colgarse. Puedo obtener lo último mientras el archivo está abierto a través de Visual Studio normalmente.



Edit2:

Ok, así que estaba leyendo a través de MSDN y me di cuenta de que el nombre del espacio de trabajo puede ser la ruta de acceso local a los archivos. Así que modifiqué lo que pasé como el parámetro workspaceName al directorio local de los archivos. Todavía tengo puestos, pero el archivo de registro es mucho menos claro sobre por qué. He cargado el archivo tf.log here (evidentemente, he cambiado la información de propiedad, como nombres de servidores y proyectos, pero todo lo demás está intacto). Después de esa última entrada de registro, no se escriben más datos en el registro.

+0

¿Ha utilizado wireshark para ver los datos yendo y viniendo? Creo que es principalmente legible por humanos. –

+0

Nunca escuché hablar de eso antes. Lo comprobaré. – KallDrexx

Respuesta

7

GetItems no toma un nombre de espacio de trabajo, se necesita una ruta del servidor para obtener una lista de archivos. Si usted está tratando de obtener una copia de los archivos de un área específica, lo que quiere hacer es:

var items = sourceControl.GetItems("$/Project/Path/subpath"/et cetera", VersionSpec.Latest, RecursionType.Full) 
           .Items 
           .Where(x => x.ItemType == ItemType.File) 
           .ToList(); 

Cuando se llama a

items[x].DownloadFile(); 

que se está volviendo una corriente, en realidad no descargar el archivo en el disco Si desea escribir el archivo en el disco en ese punto, necesitará hacer un manejo normal del flujo para escribirlo.

Si realmente está tratando de obtener archivos de TFS en un área de trabajo, es un poco diferente.

 VersionControlServer sourceControl = coll.GetService<VersionControlServer>(); 

     var ws = sourceControl.QueryWorkspaces(workspaceName, null, null); 

     var status = ws[0].Get(); 

(necesidades de error de manipulación añadido a este)

Esto actualizará su espacio de trabajo con los archivos del servidor. Funcionará igual que la UI de Visual Studio, ya que comparará lo que está actualmente en el disco con lo que está en el repositorio, y actualizará la versión local si existe una versión más nueva.

Hay una cantidad de sobrecargas en el método Get() que puede usar para especificar el comportamiento exacto que está buscando.

--Edit--

Cuando se llama a Workspace.Get(), lo primero que hace es ir a TFS (mediante una llamada de servicio web) y obtiene una lista de archivos. Luego, recorre esos archivos, comparando lo que ya ha "obtenido" en ese espacio de trabajo, con lo que está en la revisión que solicitó (o VersionSpec.Latest si no especificó ninguna otra revisión).

Este proceso puede tardar un tiempo. Es como hacer clic derecho y obtener lo último en cada directorio asignado en su área de trabajo.

Si su área de trabajo está asignada al $/, va a recorrer todos los archivos en TFS. Si tiene múltiples asignaciones de rutas a rutas locales, revisará cada una, y recuperará y guardará localmente cualquier archivo que no haya obtenido.

Actualizar un espacio de trabajo completo puede llevar un tiempo muy largo a menos que tenga cuidado con lo que ha mapeado.

- EDIT 2 -

Si usted está mirando para limitar lo que está recibiendo, usted tiene un par de opciones. La primera opción es limitar la asignación dentro del espacio de trabajo al que está accediendo. Por ejemplo, si su espacio de trabajo tiene una sola asignación a $/Project/Branch/Source/Utilities/MyUtility, solo se obtendrán los archivos de esa asignación.

En un par de nuestras utilidades de la casa, nos incluso ir tan lejos como para:

  • dinámicamente crear un espacio de trabajo
  • Mapa rutas de acceso a directorios sólo para aquellos caminos que tenemos que conseguir
  • hacer un
  • obtener
  • editar ciertos archivos (usando el método PendEdit())
  • Comprobar en los archivos modificados
  • Y, por último, retire el espacio de trabajo

Se trata de una gran cantidad de trabajo si usted está tratando de automatizar la actualización de un conjunto de archivos, así que lo que puede hacer es pasar de una ruta de acceso al Get() método:

var status = ws[0].Get(new GetRequest("$/path/to/subfolder", RecursionType.Full, VersionSpec.Latest), 
        GetOptions.Overwrite); 
+0

El uso de su segundo ejemplo (con el espacio de trabajo correcto) todavía parece causar una pérdida total de la aplicación en 'workspace [0] .Get();' – KallDrexx

+0

Consulte mi edición para obtener más información. – Robaticus

+0

¿Hay alguna manera específica de actualizar carpetas específicas (recursivamente)? En Visual Studio puedo hacer clic derecho y hacer "Obtener lo último", y termina momentos después. Quiero poder hacer esto automáticamente Gracias por ayudar btw! – KallDrexx

2

¿Funcionan los mismos comandos/parámetros cuando se utilizan las herramientas de línea de comandos TFS? p.ej. TF.exe get?

¿Tiene algún software antivirus instalado? ¿Es posible que se interponga en el camino? Intenta deshabilitarlo temporalmente.

También puede activar TFS del lado del cliente en su trazado app.config para ver lo que está pasando a través del cable: http://blogs.msdn.com/b/edhintz/archive/2007/03/30/tfs-client-tracing.aspx

+0

Gran enlace. Edité mi publicación con lo que encontré en los archivos de registro, ya que ahora estoy aún más confundido por lo que está sucediendo que antes. – KallDrexx

+1

En realidad, se está colgando en el lector de flujo. Realmente nunca regresa del DownloadFile. – Robaticus

0

Siguiendo es el ejemplo de trabajo con el que puede obtener la última versión del código de la ruta del servidor

var status = workspace.Get(new GetRequest("$/XXXX/Development/Subfolder/", 
      RecursionType.Full, VersionSpec.Latest), 
      GetOptions.GetAll| GetOptions.Overwrite); 
Cuestiones relacionadas