Encontrar nos arquivos: Pesquisar todos os códigos no Team Foundation Server

102

Existe uma maneira de pesquisar a versão mais recente de cada arquivo no TFS para uma string ou regex específica? Esta é provavelmente a única coisa que sinto falta do Visual Source Safe ...

Atualmente eu executo Obter o mais recente em toda a base de código e uso o Windows Search, mas isso se torna bastante doloroso com mais de 1 GB de código em 75.000 arquivos.

EDIT : Tentei os powertools mencionados, mas a opção "Wildcard Search" aparece para pesquisar apenas nomes de arquivos e não conteúdo.

ATUALIZAÇÃO : Implementamos uma opção de pesquisa personalizada em uma instalação existente do MOSS (Servidor de Pesquisa).

Mark Glorie
fonte

Respostas:

57

Team Foundation Server 2015 (local) e Visual Studio Team Services (versão em nuvem) incluem suporte integrado para pesquisar em todo o seu código e itens de trabalho.

Você pode fazer pesquisas de string simples foo, como operações booleanas, foo OR barou coisas mais complexas específicas da linguagem, comoclass:WebRequest

captura de tela da sintaxe do filtro de pesquisa de código

Você pode ler mais sobre isso aqui: https://www.visualstudio.com/en-us/docs/search/overview

Grant Holliday
fonte
2
Veja minha resposta abaixo e vote positivamente;) Isso agora é possível a partir do TFS 2015, usando o Code Searchplug - in. marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog
A Pesquisa de código está disponível atualmente apenas para o Visual Studio Team Services. O suporte para Team Foundation Server está em desenvolvimento e será incluído na próxima versão.
paparush
A Pesquisa de código agora está disponível no TFS 2017 ou mais recente.
csrowell
Se você tentar mudar para a versão 2015 desse documento: "A página solicitada não está disponível para Team Foundation Server 2015."
AaronLS
16

No meu caso, escrever um pequeno utilitário em C # ajudou. Links que me ajudaram - http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

Como listar arquivos de um projeto de equipe usando tfs api?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Framework.Client;
using System.IO;

namespace TFSSearch
{
class Program
{
    static string[] textPatterns = new[] { "void main(", "exception", "RegisterScript" };  //Text to search
    static string[] filePatterns = new[] { "*.cs", "*.xml", "*.config", "*.asp", "*.aspx", "*.js", "*.htm", "*.html", 
                                           "*.vb", "*.asax", "*.ashx", "*.asmx", "*.ascx", "*.master", "*.svc"}; //file extensions

    static void Main(string[] args)
    {
        try
        {
            var tfs = TfsTeamProjectCollectionFactory
             .GetTeamProjectCollection(new Uri("http://{tfsserver}:8080/tfs/}")); // one some servers you also need to add collection path (if it not the default collection)

            tfs.EnsureAuthenticated();

            var versionControl = tfs.GetService<VersionControlServer>();


            StreamWriter outputFile = new StreamWriter(@"C:\Find.txt");
            var allProjs = versionControl.GetAllTeamProjects(true);
            foreach (var teamProj in allProjs)
            {
                foreach (var filePattern in filePatterns)
                {
                    var items = versionControl.GetItems(teamProj.ServerItem + "/" + filePattern, RecursionType.Full).Items
                                .Where(i => !i.ServerItem.Contains("_ReSharper"));  //skipping resharper stuff
                    foreach (var item in items)
                    {
                        List<string> lines = SearchInFile(item);
                        if (lines.Count > 0)
                        {
                            outputFile.WriteLine("FILE:" + item.ServerItem);
                            outputFile.WriteLine(lines.Count.ToString() + " occurence(s) found.");
                            outputFile.WriteLine();
                        }
                        foreach (string line in lines)
                        {
                            outputFile.WriteLine(line);
                        }
                        if (lines.Count > 0)
                        {
                            outputFile.WriteLine();
                        }
                    }
                }
                outputFile.Flush();
            }
        }
        catch (Exception e)
        {
            string ex = e.Message;
            Console.WriteLine("!!EXCEPTION: " + e.Message);
            Console.WriteLine("Continuing... ");
        }
        Console.WriteLine("========");
        Console.Read();
    }

    // Define other methods and classes here
    private static List<string> SearchInFile(Item file)
    {
        var result = new List<string>();

        try
        {
            var stream = new StreamReader(file.DownloadFile(), Encoding.Default);

            var line = stream.ReadLine();
            var lineIndex = 0;

            while (!stream.EndOfStream)
            {
                if (textPatterns.Any(p => line.IndexOf(p, StringComparison.OrdinalIgnoreCase) >= 0))
                    result.Add("=== Line " + lineIndex + ": " + line.Trim());

                line = stream.ReadLine();
                lineIndex++;
            }
        }
        catch (Exception e)
        {
            string ex = e.Message;
            Console.WriteLine("!!EXCEPTION: " + e.Message);
            Console.WriteLine("Continuing... ");
        }

        return result;
    }
}
}
Vijayanand Settin
fonte
13

Existe outra solução alternativa, que parece ser mais atrativa.

  1. Configurar um servidor de pesquisa - pode ser qualquer máquina / servidor Windows
  2. Configure um serviço de notificação TFS * (Bissubscribe) para obter, excluir e atualizar arquivos sempre que ocorrer um check-in. Portanto, este é um serviço da web que atua como um ouvinte no servidor TFS e atualiza / sincroniza os arquivos e pastas no servidor de Pesquisa. - isso vai melhorar drasticamente a precisão (pesquisa ao vivo) e evitar o carregamento único de fazer obtenções periódicas
  3. Configure um serviço de indexação / pesquisa indexada do Windows no servidor de Pesquisa para a pasta raiz
  4. Expor um serviço da web para retornar resultados de pesquisa

Agora, com toda a configuração acima, você tem algumas opções para o cliente:

  1. Configure uma página da web para chamar o serviço de pesquisa e formate os resultados para serem exibidos na página da web - você também pode integrar esta página da web dentro do Visual Studio (por meio de uma macro ou um add-in)
  2. Crie uma interface do cliente do Windows (winforms / wpf) para chamar o serviço de pesquisa e formatar os resultados e mostrá-los na IU - você também pode integrar essa ferramenta do cliente dentro do Visual Studio por meio de VSPackages ou add-in

Atualização : eu segui esse caminho e tem funcionado muito bem. Só queria acrescentar algo a isso.

Links de referência:

  1. Use esta ferramenta em vez de bissubscribe.exe
  2. Tratamento de eventos TFS
  3. Notificações do sistema de equipe
Vin
fonte
12

Se você instalar o TFS 2008 PowerTools, obterá uma ação "Find in Source Control" no menu do botão direito do Team Explorer.

Ferramentas elétricas TFS2008

Markom
fonte
4
@muerte é engraçado que eles sejam chamados de 'ferramentas de poder'. Alguns diriam que fazer algo como uma reversão é 'funcionalidade básica'. :-)
Iain Holder,
bem, você certamente pode fazer uma reversão manualmente, não é apenas uma operação de um clique. Talvez devesse ser ..
Jeff Atwood,
3
Boa resposta, link morto: microsoft.com/downloads/…
wcm
15
Acho que só pesquisar pelo nome do arquivo / pasta
Kiddo
9
-1 as ferramentas elétricas não pesquisam o conteúdo dos arquivos , apenas os nomes dos arquivos / pastas.
Eugene Beresovsky
6

Nós configuramos uma solução para Team Foundation Server Source Control (não SourceSafe como você mencionou) semelhante ao que Grant sugere; TF Get agendado, Search Server Express. Porém, o IFilter usado para arquivos C # (texto) não estava dando os resultados que desejávamos, então convertemos os arquivos fonte em arquivos .htm. Agora podemos adicionar metadados adicionais aos arquivos, como:

  • Autor (nós o definimos como a última pessoa que fez check-in do arquivo)
  • Codificação de cores (em nossa lista de tarefas)
  • Número de mudanças indicando possíveis problemas de design (em nossa lista de tarefas)
  • Integre-se com o VSTS IDE como o recurso Koders SmartSearch
  • etc.

No entanto, preferiríamos um protocolhandler para o TFS Source Control e um IFilter de código-fonte dedicado para uma solução muito mais direcionada.

GertGregers
fonte
1
Algum plano para abrir o código da conversão .htm?
tecnomalógico
6

OK,

  1. As ferramentas elétricas do TFS2008 não têm uma função localizar em arquivos. "As ferramentas Localizar no controle de origem fornecem a capacidade de localizar arquivos e pastas no controle de origem pelo status do item ou com uma expressão curinga ."

  2. Existe um programa do Windows com essa funcionalidade postado no CodePlex . Acabei de instalar e testar isso e funciona bem.

Abatishchev
fonte
É escamoso e lento, mas parece fazer o que diz na lata
Paul Michaels
Recebo um erro como essas pessoas obtiveram no link abaixo. Alguém mais experimentando isso? tfssearchcode.codeplex.com/workitem/32475
strider
6

Isso agora é possível a partir do TFS 2015, usando o Code Searchplug - in. https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

A pesquisa é feita através da interface da web e não exige que você baixe o código para sua máquina local, o que é bom.

cachorro mortal
fonte
Nota: A Pesquisa de código está disponível atualmente apenas para Visual Studio Team Services. O suporte para Team Foundation Server está em desenvolvimento e será incluído na próxima versão.
Jamie
3

Outra solução é usar "ctrl + shift + F". Você pode alterar o local de pesquisa para um diretório local em vez de uma solução ou projeto. Isso apenas substituirá a pesquisa da área de trabalho e você ainda precisará obter o código mais recente, mas permitirá que você permaneça no Visual Studio para fazer sua pesquisa.

Todd
fonte
4
Não aborda o problema de pesquisar versões de código TFS.
Craig de
Não o que eles queriam.
Dave
Inútil para pesquisar conteúdos que você não baixou. Pode muito bem usar grep / findstr.
Jamie
2

Supondo que você tenha o Notepad ++ , um recurso frequentemente esquecido é 'Localizar em arquivos', que é extremamente rápido e vem com filtros, expressões regulares, substituição e todos os recursos do N ++.

homem sorridente
fonte
1

Este suplemento afirma ter a funcionalidade que acredito que você procura:

Team Foundation Sidekicks

Paul G
fonte
Desculpe, não vejo onde se oferece para pesquisar dentro de arquivos?
Mark Glorie,
4
Na verdade, eu baixei esse conjunto de plug-ins mais cedo e ele só permite pesquisar por autor, rótulo, data etc., mas não em versões anteriores de arquivos ...: \
Sandor Davidhazi
1

Esta busca por um link de arquivo explica como encontrar um arquivo. Eu tive que mexer com o conselho para fazer funcionar.

  1. cd "C: \ Arquivos de programas (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE"
  2. tf dir "$ / *. sql" / recursive / server: http: // mytfsserver: 8080 / tfs

No caso do comando cd, executei o comando cd porque estava procurando o arquivo tf.exe. Foi mais fácil simplesmente começar a partir desse diretório, adicionando todo o caminho. Agora que entendi como fazer isso funcionar, usaria o caminho absoluto entre aspas.

No caso da pesquisa tf, comecei na raiz do servidor com $/e procurei todos os arquivos que terminavam com sqlie *.sql. Se você não quiser começar na raiz, use "$/myproject/*.sql".

Oh! Isso não resolve a questão da pesquisa em arquivos, mas minha pesquisa no Google me trouxe aqui para encontrar arquivos entre outros links.

Greg
fonte
1

Atualmente não há como fazer isso imediatamente, mas há uma sugestão de voz do usuário para adicioná-lo: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed- full-text-search-of-work-items

Embora eu duvide que seja tão simples quanto apertar um botão, se todos que viram esta questão votarem a favor, o MS provavelmente implementará algo.

Atualização: basta ler o blog de Brian Harry , que mostra essa solicitação como estando em seu radar, e a versão online do Visual Studio tem suporte limitado para pesquisar onde git é usado como vcs: http://blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 / announcing-limited-preview-for-visual-studio-online-code-search.aspx . A partir disso, acho que é justo dizer que é apenas uma questão de tempo ...

Atualização 2: agora existe uma extensão fornecida pela Microsoft, Pesquisa de código , que permite pesquisar no código, bem como nos itens de trabalho.

Jmoreno
fonte