2011-02-10 7 views
5

Quindi sto tentando di recuperare i file da un'area di lavoro in TFS. Sfortunatamente, ogni tentativo che ho fatto di fare questo si traduce in un'applicazione bloccata. A partire da ora, questo è il codice:Tentativo di recuperare i file dall'applicazione TPS dell'area di lavoro 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(); 

Quello che succede è che ogni volta che faccio funzionare questa applicazione (su più macchine) si bancarelle su items[x].DownloadFile(). Tutti i file in TFS non sono bloccati, tutto va bene. Il tentativo di utilizzare il metodo Workspace.Get() ha come risultato la stessa cosa.

Se si preme pausa, x sarà un valore specifico, ma non riesco ad accedere alla raccolta di elementi, come quando si ottiene "Impossibile valutare l'espressione perché il thread corrente è in sospeso, in attesa o in join" . Quando valuto lo stack di chiamate ottengo:

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

Sono in perdita su cosa fare oltre. Ogni volta che sospendo l'applicazione, x ha sempre lo stesso valore (il valore su cui si blocca è diverso per ogni esecuzione di un'applicazione).

Qualcuno ha qualche idea?


Edit: Dopo aver aggiunto la logica diagnostica (sulla base del link nella risposta di Grant) sono ancora più confuso che mai.

Lo spazio di lavoro che sto passando a questo metodo è $/QA/Automated Test Scripts/Regression or System Test Scripts/RDE or Condo (verificato tramite il debugger).

Tuttavia, quando guardo i log TFS, sembra essere il download di codice che io sono in esecuzione, come si 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 

Subito dopo intervento è:

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 

Dopodiché non ci sono ulteriori aggiornamenti al file di log e la mia applicazione è in stallo. Quello che mi sono confuso circa è

1) Perché questa cercando di tirare il codice dell'applicazione da TFS quando sto specificando una completamente diversa TFS lavoro

2) Perché è questo stallo dopo aver tentato di recuperare il file? È possibile che sia perché fmMain.cs è aperto in Visual Studio, ma dovrebbe comunque escludere e non rimanere bloccato. Sono in grado di ottenere le ultime notizie mentre il file è aperto normalmente tramite Visual Studio.



Edit2:

Ok, quindi stavo leggendo attraverso MSDN e ho notato che il nome dell'area di lavoro può essere il percorso locale per i file. Così ho modificato quello che ho passato come parametro workspaceName nella directory locale dei file. Ricevo ancora bancarelle, ma il file di registro è molto meno chiaro sul perché. Ho caricato il file tf.log here (ovviamente ho cambiato le informazioni proprietarie, come i nomi dei server e dei progetti, ma tutto il resto non è stato modificato). Dopo l'ultima voce del registro, non vengono scritti ulteriori dati nel registro.

+0

Hai usato wireshark per esaminare i dati che vanno avanti e indietro? Penso che sia per lo più leggibile. –

+0

Mai sentito prima. Lo guarderò. – KallDrexx

risposta

7

GetItems non ci vuole un nome spazio di lavoro, ci vuole un percorso del server per ottenere una lista di file. se si sta cercando di ottenere una copia dei file da una zona specifica, ciò che si vuole fare è:

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

Quando si chiama

items[x].DownloadFile(); 

che si sta tornando un flusso, in realtà non il download il file sul disco. Se si desidera scrivere il file su disco in quel punto, è necessario eseguire normali operazioni di gestione dei flussi per scriverlo.

Se si sta effettivamente cercando di ottenere file da TFS in un'area di lavoro, è un po 'diverso.

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

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

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

(esigenze di gestione degli errori aggiunti a questo)

Questo si aggiorna il tuo spazio di lavoro con i file dal server. Funzionerà proprio come l'interfaccia utente di Visual Studio, in quanto confronterà ciò che è attualmente su disco con ciò che è nel repository e aggiornerà la versione locale se esiste una versione più recente.

Esistono numerosi overload per il metodo Get() che è possibile utilizzare per specificare il comportamento esatto che si sta cercando.

--Edit--

Quando si chiama Workspace.Get(), la prima cosa che fa è andare a TFS (utilizzando una chiamata di servizio Web) e ottiene un elenco di file. Quindi, itera su quei file, confrontando ciò che hai già "ottenuto" in quell'area di lavoro, a cosa è alla revisione che hai richiesto (o VersionSpec.Latest se non hai specificato alcuna altra revisione).

Questa operazione può richiedere del tempo. È come fare clic con il tasto destro e ottenere le ultime informazioni su ogni directory mappata nell'area di lavoro.

Se lo spazio di lavoro è mappato su $/, itererà attraverso tutti i file in TFS. Se si dispone di più mapping di percorsi a percorsi locali, passerà attraverso ciascuno di essi e recupererà e salverà localmente tutti i file che non si sono ancora ottenuti.

L'aggiornamento di un'intera area di lavoro può richiedere molto tempo se non si presta attenzione a ciò che è stato mappato.

- EDIT 2 -

Se stai cercando di limitare quello che stai ricevendo, avete un paio di opzioni. La prima opzione è limitare il mapping all'interno dell'area di lavoro a cui si sta accedendo. Ad esempio, se lo spazio di lavoro ha una sola mappatura su $/Project/Branch/Source/Utilities/MyUtility, verranno acquisiti solo i file in quella mappatura.

In un paio dei nostri programmi di utilità in-house, abbiamo anche andare al punto di:

  • dinamicamente creare uno spazio di lavoro
  • Mappa percorsi a directory solo per quei sentieri che abbiamo bisogno di ottenere
  • fare un ottenere
  • Modifica alcuni file (utilizzando il metodo PendEdit())
  • Arrivo i file modificati
  • E, infine, rimuovere il spazio di lavoro

Questo è un sacco di lavoro, se si sta solo cercando di automatizzare l'aggiornamento di una serie di file, così che cosa si può fare è passare in un percorso al metodo Get():

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

L'utilizzo del secondo esempio (con l'area di lavoro corretta) sembra ancora causare uno stallo dell'applicazione totale su 'workspace [0] .Get();' – KallDrexx

+0

Vedere la mia modifica per ulteriori spiegazioni. – Robaticus

+0

Esiste un modo specifico per aggiornare cartelle specifiche (in modo ricorsivo)? In Visual Studio posso semplicemente fare clic con il pulsante destro del mouse e fare "Get Latest", e termina momenti dopo. Voglio essere in grado di farlo automaticamente. Grazie per l'aiuto btw! – KallDrexx

2

Gli stessi comandi/parametri funzionano quando si utilizzano gli strumenti da riga di comando TFS? per esempio. TF.exe get?

Avete installato un software antivirus? È possibile che si stia intromettendo? Prova a disattivarlo temporaneamente.

È anche possibile attivare TFS lato client tracing nel vostro app.config per vedere cosa sta succedendo sul filo: http://blogs.msdn.com/b/edhintz/archive/2007/03/30/tfs-client-tracing.aspx

+0

Ottimo collegamento. Ho modificato il mio post con quello che ho trovato dai file di registro, dato che ora sono ancora più confuso a quello che sta succedendo. – KallDrexx

+1

In realtà viene bloccato nel lettore di stream. Non è mai veramente tornato da DownloadFile. – Robaticus

0

seguito è l'esempio funzionante con il quale è possibile ottenere l'ultima versione del codice dal percorso del server

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