Essa semana, um desenvolvedor me perguntou como ele poderia obter todos os arquivos .sql de um determinado work item. Ele precisava atualizar o banco de dados de produção e gostaria de saber quais scripts ele deveria executar.
Inicialmente, achei o pedido um pouco estranho, pois o Visual Studio faz isso automaticamente pra gente quando estamos utilizando um projeto do tipo Database Project, porém acabei descobrindo que o projeto estava fora do nosso padrão recomendado e além de não ter o Database Project, também estava sem a estratégia de branch, builds, etc.
O mais triste é que o desenvolver até tinha achado uma “solução”: Ele estava acessando a aba All Links do Work Item, clicando em cada changeset e anotando cada arquivo manualmente, parecido com as imagens abaixo. Confesso que até pensei em deixar o desenvolvedor sofrer um pouco mais, já que ele estava fora do padrão, porém quando vi a quantidade de changesets que havia no work item, mudei de ideia e resolvi ajudar o cidadão.
Imagem 1: Work Item com a listagem das changesets
Imagem 2: Detalhes de uma changeset
A ajuda foi, basicamente, escrever o código C# abaixo que usa as APIs do TFS. Esse código conecta no servidor, obtém uma referência para o Work Item, entra em cada link do tipo changeset e imprime os nomes de arquivos lá existentes.
Para rodar o código abaixo, você precisará instalar o Visual Studio 2010 SDK e adicionar as seguintes referências em seu projeto:
- Microsoft.TeamFoundation.Client
- Microsoft.TeamFoundation.Common
- Microsoft.TeamFoundation.VersionControl.Client
- Microsoft.TeamFoundation.WorkItemTracking.Client
//Id do Work Item a ser consultado
const int workItemId = 63;
//Endereço da coleção do Team Foundation Server
Uri collectionUri = new Uri("https://localhost:8080/tfs/DefaultCollection");
//Connecta no team foundation server
using (var tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(collectionUri))
{
//Obtém referências para os repositórios de Work Item e de Código Fonte
var workItemStore = tpc.GetService<WorkItemStore>();
var versionControlServer = tpc.GetService<VersionControlServer>();
//Obtém o Work Item armazenado no repositório
WorkItem wi = workItemStore.GetWorkItem(workItemId);
//Varre todos os links do Work Item
foreach (var link in wi.Links)
{
//Verifica se o link é um link externo pois queremos
//os links do tipo changeset (externos)
if (link is ExternalLink)
{
//Utiliza um utilitário para quebrar a URL do recurso
//em diversos campos
var artefactId = LinkingUtilities.DecodeUri(((ExternalLink)link).LinkedArtifactUri);
//verifica se o link externo é do tipo Changeset
if (artefactId.ArtifactType == "Changeset")
{
//captura o Id do Changeset
int changesetId = int.Parse(artefactId.ToolSpecificId);
//obtem o objeto changeset de acordo com o seu ID
var changeset = versionControlServer.GetChangeset(changesetId);
//Imprime no console todos os arquivos que foram
//encontrados dentro da changeset
Console.WriteLine("Arquivos da changeset: " + changesetId);
changeset.Changes.ToList().ForEach(p => Console.WriteLine(p.Item.ServerItem));
}
}
}
}
Como vocês podem ver o código não é nada complexo. Ele trabalha com vários recursos do TFS, além de acessar dois de seus principais repositórios: Work Items e Source Control, logo é um código que você pode facilmente adaptá-lo para outras necessidades.
Bom, é isso! Espero que seja útil para vocês também :-)
Abraços e até a próxima!
André Dias
Comments
- Anonymous
August 16, 2010
"Confesso que até pensei em deixar o desenvolvedor sofrer um pouco mais..." hauhuahuaQue pior! rsrsAbraços; - Anonymous
June 15, 2012
Obrigado, funcionou legal, fiz algumas modificações para listar todos os arquivos de vários changesets.