TFS2010 Object Model – Gestione del versioning

Scritto da  Massimo Bonanni il mercoledì 16 marzo 2011
Linguaggio: VB   •  Framework: 4.0   •  Livello: 200

Download pdf


Dopo aver esaminato la gestione dell'item tracking nei precedenti articoli, in questa puntata della seria vediamo come interagire con i servizi di version control messi a disposizione dall'infrastruttura di Team Foundation server.

La classe VersionControlServer
Il primo passo per poter utilizzare le funzionalità di vesrion control messe a disposizione dall'object model di TFS è quello di recuperare l'istanza della classe VersionControlServer a partire da una team project collection.

Questa classe mette a disposizione alcuni metodi per l'accesso al repository del controllo del codice sorgente.

Per recuperare l'istanza del repository possiamo utilizzare il metodo GetService della classe TFSTeamProjectCollection:

Dim tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection("http://MioServer:8080/tfs/MiaCollezione")
Dim versionControlServer = CType(tpc.GetService(Of VersionControlServer)(), VersionControlServer)

 

La classe VersionControlServer mette a disposizione una serie di funzionalità particolarmente interessanti tra le quali la gestione delle labels, dei workspaces, delle branche e degli item presenti nel controllo del codice sorgente.

In questo articolo analizzeremo alcune delle funzionalità più interessanti rimandando, per le altre, alla documentazione fornita da MSDN.

Il primo metodo che analizziamo è il GetItems (fornito in ben 13 overload) che ci permette di recuperare un'insieme di item dal controllo del codice sorgente.

Il metodo permette di recuperare gli item in base al nome (eventualmente anche composto da caratteri jolly), all'id, alla versione, al tipo (file, folder, etc., etc.).

In particolare nell'esempio che segue andiamo a recuperare tutti gli items di un progetto in una collection in base ad un filtro:

Public Function GetVersionedItems(ByVal collectionUrl As String,
                                  ByVal projectName As String,
                                  ByVal filter As String) As IEnumerable(Of Item)
    Dim retList As IEnumerable(Of Item) = Nothing
    If Not String.IsNullOrWhiteSpace(collectionUrl) Then
        Try
            Dim tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(New Uri(collectionUrl),
                                                                               New UICredentialsProvider())
            Dim versionControlServer = CType(tpc.GetService(Of VersionControlServer)(), VersionControlServer)
            Dim pathStr = String.Format("$/{0}/{1}", projectName, filter)
            retList = versionControlServer.GetItems(pathStr, RecursionType.Full).Items
        Catch ex As Exception
            Throw
        End Try
    Else
        Throw New ArgumentNullException("collectionUrl must be not null")
    End If
    Return retList
End Function

 

Osserviamo che, nel nostro caso, abbiamo utilizzato RecursionType.Full che consente di iterare la ricerca alle sottocartelle.
Altri valori di RecursionType sono None e OneLevel che permettono, rispettivamente, di non attivare la ricorsività o limitare la ricerca al solo primo livello di cartelle.

Un esempio di utilizzo della precedente funzione è il seguente:

Dim items = GetVersionedItems("http://MyServer:8080/tfs/MyCollection", "MyProject", "*.vb")

 

In questo caso recuperiamo tutti gli items con estensione .vb dal repository del codice sorgente del progetto MyProject della collezione MyCollection presente nel server MyServer.

La classe Item contiene tutte le proprietà relative all'item memorizzato nel server del controllo del codice sorgente:

Figura1

Da notare il metodo DownloadFile che ci permette di salvare il file all'interno del nostro disco:

Public Sub SaveAllFileItems(items As IEnumerable(Of Item),
                        destinationPath As String)
    For Each Item In items
        If Item.ItemType = ItemType.File Then
            ' recupero il nome del file completo del nome di progetto
            'e delle cartelle in cui è contenuto
            Dim origFileName = Item.ServerItem.Replace("$/", "")
            origFileName = origFileName.Replace("/", "\")
            ' creo il nome del file con cui salvare l'item
            Dim fileName = IO.Path.Combine(destinationPath, origFileName)
            Try
                Item.DownloadFile(fileName)
            Catch ex As Exception
                Throw
            End Try
        End If
    Next
End Sub

 

Il metodo precedente consente di salvare gli item contenuti nell'argomento items in una cartella su disco.
Ad esempio, per avere la copia dell'ultima versione dei file vb contenuti nel progetto MyProject della collezione MyCollection,  potremo scrivere:

Dim items = GetVersionedItems("http://myserver:8080/tfs/myCollection", "MyProject", "*.vb")
SaveAllFileItems(items, "c:\appoggio")

 

Il metodo GetItems della classe VersionControlServer permette di recuperare anche i file di una determinata versione dei nostri checkin.
Alcune firme del metodo prevedono la possibilità di passare un oggetto di tipo VersionSpec.
VersionSpec è una classe astratta che definisce un criterio di versionamento. Il framework mette a disposizione alcune implementazioni di VersionSpec: 

Figura2

Se volessimo recuperare i file di progetto ad una certa data (ad esempio 31/12/2010) potremmo utilizzare un metodo del tipo:

Public Function GetVersionedItems(ByVal collectionUrl As String,
                                  ByVal projectName As String,
                                  ByVal filter As String,
                                  ByVal versionDate As DateTime) As IEnumerable(Of Item)
    Dim retList As IEnumerable(Of Item) = Nothing
    If Not String.IsNullOrWhiteSpace(collectionUrl) Then
        Try
            Dim tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(New Uri(collectionUrl),
                                                                               New UICredentialsProvider())
            Dim versionControlServer = CType(tpc.GetService(Of VersionControlServer)(), VersionControlServer)
            Dim pathStr = String.Format("$/{0}/{1}", projectName, filter)
            Dim dateVerSpec = New DateVersionSpec(versionDate)
            retList = versionControlServer.GetItems(pathStr, dateVerSpec, RecursionType.Full).Items
        Catch ex As Exception
            Throw
        End Try
    Else
        Throw New ArgumentNullException("collectionUrl must be not null")
    End If
    Return retList
End Function

 

E scrivere:

Dim items = GetVersionedItems("http://myserver:8080/tfs/myCollection",
                            "MyProject",
                            "*.vb",
                            New DateTime(2010, 12, 31))

 

La classe VersionControlServer prevede la possibilità, inoltre, di eseguire delle query per cercare, ad esempio, changset, labels, workspaces, etc., etc.

Tutti i metodi che consentono di eseguire questo tipo di ricerca hanno il nome che inizia per Query, così, ad esempio, il metodo QueryHistory consente di eseguire la ricerca dei changeset all'interno di TFS.

Il metodo prevede una serie di argomenti che ci consentono di filtrare la ricerca:

Public Function QueryHistory ( _
    path As String, _
    version As VersionSpec, _
    deletionId As Integer, _
    recursion As RecursionType, _
    user As String, _
    versionFrom As VersionSpec, _
    versionTo As VersionSpec, _
    maxCount As Integer, _
    includeChanges As Boolean, _
    slotMode As Boolean _
) As IEnumerable

 

Gli argomenti hanno il seguente significato:

  • path : contiene il percorso da cui recuperare i changeset in maniera analoga al path utilizzato nel GetItems visto in precedenza;
  • version : oggetto di classe VersionSpec che identifica la versione a cui far riferimento nella ricerca (deve essere valorizzato);
  • deletionId : eventuale id di cancellazione dell'elemento. Può anche essere 0 se non utilizzato;
  • recursion : tipologia di recursione da utilizzare. Il valore è analogo a quello del metodo GetItems visto in precedenza;
  • user : username dell'utente autore dei changesets. Se non interessa un utente specifico utilizzare String.Empty. Attenzione a non utilizzare Nothing perchè non è equivalente a String.Empty;
  • versionFrom : Oggetto VersionSpec da cui iniziare la ricerca. Se utilizzato Nothing, la ricerca avviene a partire dal primo changeset;
  • versionTo : Oggetto VersionSpec a cui terminare la ricerca. Se utilizzato Nothing, la ricerca avviene fino all'ultimo changeset;
    maxCount : numero massimo di changeset restituiti. Se impostato Int32.MaxValue vengono restituiti tutti i changsets;
  • includeChanges : permette di decidere se recuperare anche le informazioni sui cambiamenti avvenuti (proprietà Changes) oppure no. Se impostato a True, viene valorizzata la proprietà Changes con la collezione degli item interessati al cambiamento. Se impostato a false, la proprietà Changes dei risultati è nothing;
  • slotMode: indentifica la modalità con cui gli elementi della history vengono presentati.

Il metodo restituisce un oggetto IEnumerable che, di fatto è un IEnumerable(of Changeset). La classe Changeset ha la seguente struttura:

Figura3

Ogni Changeset contiene:

  • una collezione di Change, ognuna delle quali contiene un ChangeType che indica la tipologia di change (Add, Edit, etc., etc.) e un Item (dello stesso tipo e significato di quelli visti nel metodo GetItems);
  • una collezione di WorkItems associati (dello stesso tipo di quelli visti negli articoli dedicati all'Item Tracking).

Un esempio di funzione che può servire a recuperare l'intero elenco di changeset di un progetto in una collection è il seguente:

Public Function GetChangesets(ByVal collectionUrl As String,
                              ByVal projectName As String,
                              ByVal filter As String,
                              ByVal versionDate As DateTime) As IEnumerable(Of Changeset)
    Dim retList As IEnumerable(Of Changeset) = Nothing
    If Not String.IsNullOrWhiteSpace(collectionUrl) Then
        Try
            Dim tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(New Uri(collectionUrl),
                                                                               New UICredentialsProvider())
            Dim versionControlServer = CType(tpc.GetService(Of VersionControlServer)(), VersionControlServer)
            Dim pathStr = String.Format("$/{0}/{1}", projectName, filter)
            Dim dateVerSpec = New DateVersionSpec(versionDate)
            retList = versionControlServer.QueryHistory(pathStr, dateVerSpec, 0, RecursionType.Full,
                                                         String.Empty, Nothing, Nothing, Int32.MaxValue,
                                                         True, True).OfType(Of Changeset)().ToList()
        Catch ex As Exception
            Throw
        End Try
    Else
        Throw New ArgumentNullException("collectionUrl must be not null")
    End If
    Return retList
End Function

 

Se volessimo recuperare tutti i changeset del progetto MyProject nella collection MyCollection di qualsiasi tipo di file e alla data di oggi, potremmo scrivere:

Dim changesets = GetChangesets("http://MyServer:8080/tfs/MyCollection",
                "MyProject",
                "*.*",
                DateTime.Now)

 

La classe VersionControlService fornisce altre funzionalità per la gestione delle label (aggiunta e cancellazione), la gestione dei workspace (che analizzeremo nel prossimo articolo), la gestione delle branch e dei pending changes.

Tutte queste funzionalità hanno la peculiarità di poter essere eseguite senza passare per il workspace (area di lavoro base per tfs lato client). Nel prossimo articolo vedremo come sia possibile, invece, recuperare un workspace di un utente e quali operazioni abbiamo a disposizione utilizzando i servizi offerti da quest'ultimo.

 

Riferimenti

[1] Team Foundation Server Architecture: http://msdn.microsoft.com/en-us/library/ms252473.aspx
[2] Extending Team Foundation: http://msdn.microsoft.com/en-us/library/bb130146.aspx
[3] Team Foundation Server 2010 SDK: http://code.msdn.microsoft.com/TfsSdk
[4] Team Foundation Server Team Blog: http://blogs.msdn.com/b/team_foundation/


Tags: TFS,Team Foundation,Team Foundation Server

 
x