martes, 1 de febrero de 2011

Visual Studio Addin para operaciones con TFS

Microsoft TFS (Team Foundation Server) es un producto de Microsoft para el control de código fuente, elementos de trabajo y administración de proyectos.
A pesar de que es una herramienta bastante completa y que está totalmente integrada al IDE de Visual Studio, en mi opinión, esta integración carece de accesos rápidos a operaciones básicas que a veces hacen perder un poco el tiempo.

Por ejemplo, si queremos ubicar a un archivo dentro del control de código fuente, debemos navegar "manualmente" el árbol de archivos del servidor en la ventana Source Control Explorer.


Sería muy práctico poder acceder a un archivo del servidor directamente desde el Solution Explorer.
Ésta es una de las dos cosas que permite este Addin. Agrega menúes contextuales para poder acceder rápidamente a un archivo dentro del Source Control Explorer así como a la historia del mismo.





Actualmente existe un Addin mucho más completo (TFSPlus) que permite estas dos cosas (y algunas más), pero hasta el momento no existe una versión que funcione en Visual Studio 2010.

Para crear un Addin en Visual Studio 2010, podemos crear un nuevo proyecto de tipo Visual Studio Addin y se generará automáticamente la clase Connect, necesaria para la implementación de cualquier Addin.
Aquí hay un tutorial al respecto que está muy bien explicado, así que me limitaré sólo al código para manejar los objetos de TFS.
Para poder acceder a los objetos de TFS, necesitamos algunas referencias a librerías que están en los namespaces Microsoft.VisualStudio.TeamFoundation, y Microsoft.TeamFoundation. Normalmente se instalan en la GAC al instalar Visual Studio 2010. Pero también se pueden encontrar en C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0.

Aquí hay un ejemplo (un poco viejo pero vigente) de cómo crear un addin para comunicarse con TFS en VS2005.
La clase principal para acceder a la funcionalidad de Version Control de TFS se llama VersionControlExt. Para obtener una referencia a esta clase, podemos utilizar el objeto application que se recibe en el método OnConnect de la clase Connect de nuestro addin:

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
 DTE2 applicationObject = (DTE2)application;
 VersionControlExt vc = applicationObject.GetObject("Microsoft.VisualStudio.TeamFoundation.VersionControl.VersionControlExt") as VersionControlExt;
...

Para ubicar y mostrar un archivo en el Source Control Explorer de TFS, se puede proceder de la siguiente forma:

string localPath = applicationObject.SelectedItems.Item(1).ProjectItem.FileNames[0];
string serverPath = vc.Explorer.Workspace.GetServerItemForLocalItem(localPath);
vc.Explorer.Navigate(serverPath);
applicationObject.ExecuteCommand("View.TfsSourceControlExplorer");
En la primera línea se obtiene la ruta local del primer archivo seleccionado en el Solution Explorer.

Luego se llama al método GetServerItemForLocalItem que obtene la ruta del archivo en el servidor a partir de su ruta local.
La tercera línea provoca que se seleccione el archivo en el Source Control Explorer de TFS.
La cuarta línea es sólo para asegurar que la ventana del explorador esté abierta y enfocada.

Adicionalmente se muestra el código necesario para mostrar la historia de un archivo (aunque esta opción ya existe en VS2010 en el menú contextual view history):

VersionControlHistoryExt history = vc.History;
string localPath = applicationObject.SelectedItems.Item(1).ProjectItem.FileNames[0];
history.Show(localPath, VersionSpec.Latest, 0, RecursionType.Full);

En la primera línea, se obtiene una referencia a la clase VersionControlHistoryExt que nos permite manipular el History de los archivos en el repositorio.
La tercerá línea provoca que se muestre la historia del archivo seleccionado.


La versión completa del Addin se puede descargar desde Aquí.