Buscar en archivos: buscar todo el código en Team Foundation Server

102

¿Hay alguna forma de buscar la última versión de cada archivo en TFS para una cadena o expresión regular específica? Esto es probablemente lo único que extraño de Visual Source Safe ...

Actualmente realizo un Get Latest en todo el código base y uso Windows Search, pero esto se vuelve bastante doloroso con más de 1GB de código en 75,000 archivos.

EDITAR : Probé las herramientas eléctricas mencionadas, pero la opción "Búsqueda con comodines" aparece para buscar solo nombres de archivo y no contenido.

ACTUALIZACIÓN : Hemos implementado una opción de búsqueda personalizada en una instalación de MOSS (servidor de búsqueda) existente.

Mark Glorie
fuente

Respuestas:

57

Team Foundation Server 2015 (local) y Visual Studio Team Services (versión en la nube) incluyen soporte integrado para buscar en todo su código y elementos de trabajo.

Puede realizar búsquedas de cadenas simples como foo, operaciones booleanas como foo OR baro cosas más complejas específicas del lenguaje comoclass:WebRequest

captura de pantalla de la sintaxis del filtro de búsqueda de código

Puede leer más sobre esto aquí: https://www.visualstudio.com/en-us/docs/search/overview

Grant Holliday
fuente
2
Vea mi respuesta a continuación y vote a favor;) Esto ahora es posible a partir de TFS 2015 mediante el uso del Code Searchcomplemento. marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog
Actualmente, la búsqueda de código solo está disponible para Visual Studio Team Services. El soporte para Team Foundation Server está en desarrollo y se incluirá en la próxima versión.
paparush
La búsqueda de código ahora está disponible en TFS 2017 o más reciente.
csrowell
Si intenta cambiar a la versión 2015 de ese documento: "La página solicitada no está disponible para Team Foundation Server 2015".
AaronLS
16

En mi caso, escribir una pequeña utilidad en C # ayudó. Enlaces que me ayudaron - http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

¿Cómo listar archivos de un proyecto de equipo 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
fuente
13

Existe otra solución alternativa, que parece más atractiva.

  1. Configurar un servidor de búsqueda: podría ser cualquier máquina / servidor de Windows
  2. Configure un servicio de notificación TFS * (Bissubscribe) para obtener, eliminar y actualizar archivos cada vez que se realiza un registro. Entonces, este es un servicio web que actúa como un oyente en el servidor TFS y actualiza / sincroniza los archivos y carpetas en el servidor de búsqueda. - esto mejorará drásticamente la precisión (búsqueda en vivo) y evitará la carga única de realizar búsquedas periódicas
  3. Configurar un servicio de indexación / búsqueda indexada de Windows en el servidor de búsqueda para la carpeta raíz
  4. Exponer un servicio web para devolver resultados de búsqueda

Ahora, con toda la configuración anterior, tiene algunas opciones para el cliente:

  1. Configure una página web para llamar al servicio de búsqueda y formatee los resultados para que se muestren en la página web; también puede integrar esta página web dentro de Visual Studio (a través de una macro o un complemento)
  2. Cree una interfaz de cliente de Windows (winforms / wpf) para llamar al servicio de búsqueda y formatear los resultados y mostrarlos en la interfaz de usuario; también puede integrar esta herramienta de cliente dentro de Visual Studio a través de VSPackages o complemento

Actualización : tomé esta ruta y ha funcionado bien. Solo quería agregar algo a esto.

Enlaces de referencia:

  1. Utilice esta herramienta en lugar de bissubscribe.exe
  2. Manejo de eventos de TFS
  3. Notificaciones del sistema de equipo
Vin
fuente
12

Si instala TFS 2008 PowerTools, obtendrá una acción "Buscar en control de código fuente" en el menú contextual de Team Explorer.

Herramientas eléctricas TFS2008

Markom
fuente
4
@muerte es curioso que las llamen 'herramientas eléctricas'. Algunos dirían que hacer algo como una reversión es una "funcionalidad básica". :-)
Iain Holder
Bueno, ciertamente puede hacer una reversión manualmente, simplemente no es una operación de un solo clic. Quizás debería ser ...
Jeff Atwood
3
Buena respuesta, enlace muerto: microsoft.com/downloads/…
wcm
15
Creo que solo busca el nombre de archivo / carpeta
Kiddo
9
-1 las herramientas eléctricas no buscan el contenido de los archivos , solo los nombres de archivos / carpetas.
Eugene Beresovsky
6

Hemos configurado una solución para Team Foundation Server Source Control (no SourceSafe como usted menciona) similar a lo que sugiere Grant; TF Get programado, Search Server Express. Sin embargo, el IFilter utilizado para archivos C # (texto) no estaba dando los resultados que queríamos, por lo que convertimos los archivos fuente a archivos .htm. Ahora podemos agregar metadatos adicionales a los archivos como:

  • Autor (lo definimos como la persona que verificó por última vez el archivo)
  • Codificación de colores (en nuestra lista de tareas pendientes)
  • Número de cambios que indican posibles problemas de diseño (en nuestra lista de tareas pendientes)
  • Integre con la función VSTS IDE como Koders SmartSearch
  • etc.

Sin embargo, preferiríamos un controlador de protocolo para TFS Source Control y un IFilter de código fuente dedicado para una solución mucho más específica.

GertGregers
fuente
1
¿Algún plan de código abierto para la conversión .htm?
technomalogical
6

Bueno,

  1. Las herramientas eléctricas TFS2008 no tienen una función de búsqueda en archivos. "Las herramientas Buscar en control de código fuente brindan la capacidad de ubicar archivos y carpetas en el control de código fuente por el estado del elemento o con una expresión comodín ".

  2. Hay un programa de Windows con esta funcionalidad publicado en CodePlex . Acabo de instalar y probar esto y funciona bien.

abatishchev
fuente
Es escamoso y lento, pero parece hacer lo que dice en la lata
Paul Michaels
Recibo un error como el de estas personas en el enlace de abajo. ¿Alguien más está experimentando esto? tfssearchcode.codeplex.com/workitem/32475
strider
6

Esto ahora es posible a partir de TFS 2015 mediante el Code Searchcomplemento.https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

La búsqueda se realiza a través de la interfaz web y no requiere que descargue el código en su máquina local, lo cual es bueno.

perro mortal
fuente
Nota: La búsqueda de código está disponible actualmente solo para Visual Studio Team Services. El soporte para Team Foundation Server está en desarrollo y se incluirá en la próxima versión.
Jamie
3

Otra solución es usar "ctrl + shift + F". Puede cambiar la ubicación de búsqueda a un directorio local en lugar de una solución o proyecto. Esto solo tomará el lugar de la búsqueda en el escritorio y aún necesitará obtener el código más reciente, pero le permitirá permanecer dentro de Visual Studio para hacer su búsqueda.

Todd
fuente
4
No aborda el problema de la búsqueda a través de versiones de código TFS.
Craig
No es lo que querían.
Dave
Inútil para buscar contenidos que no hayas descargado. También podría usar grep / foundtr.
Jamie
2

Suponiendo que tenga Notepad ++ , una función que a menudo se pierde es 'Buscar en archivos', que es extremadamente rápida y viene con filtros, expresiones regulares, reemplazo y todas las ventajas de N ++.

smirkingman
fuente
1

Este complemento afirma tener la funcionalidad que creo que busca:

Compañeros de la fundación del equipo

Paul G
fuente
Lo siento, no veo dónde ofrece buscar dentro de los archivos.
Mark Glorie
4
En general, descargué este conjunto de complementos anteriormente y solo le permite buscar por autor, etiqueta, fecha, etc., pero no dentro de versiones anteriores de archivos ...: \
Sandor Davidhazi
1

Esta búsqueda de un enlace de archivo explica cómo encontrar un archivo. Tuve que perder el tiempo con el consejo para que funcionara.

  1. cd "C: \ Archivos de programa (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE"
  2. tf dir "$ / *. sql" / recursivo / servidor: http: // mytfsserver: 8080 / tfs

En el caso del comando cd, realicé el comando cd porque estaba buscando el archivo tf.exe. Era más fácil comenzar desde ese directorio y agregar la ruta completa. Ahora que entiendo cómo hacer que esto funcione, usaría la ruta absoluta entre comillas.

En el caso de la búsqueda tf, comencé en la raíz del servidor con $/y busqué todos los archivos que terminaron con sqlie *.sql. Si no desea comenzar desde la raíz, utilice"$/myproject/*.sql" en lugar.

Oh! Esto no resuelve la búsqueda en la parte de archivo de la pregunta, pero mi búsqueda en Google me trajo aquí para encontrar archivos entre otros enlaces.

Greg
fuente
1

Actualmente no hay forma de hacer esto de inmediato, pero hay una sugerencia de User Voice para agregarlo: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed- búsqueda-de-texto-completo-de-elementos-de-trabajo

Aunque dudo que sea tan simple como encender un interruptor, si todos los que han visto esta pregunta votaran por ella, MS probablemente implementaría algo.

Actualización: solo lea el blog de Brian Harry , que muestra que esta solicitud está en su radar, y la versión en línea de Visual Studio tiene soporte limitado para buscar dónde se usa git como vcs: http://blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 /nouncing-limited-preview-for-visual-studio-online-code-search.aspx . De esto creo que es justo decir que es solo cuestión de tiempo ...

Actualización 2: ahora existe una extensión proporcionada por Microsoft, Búsqueda de código , que permite buscar en código y en elementos de trabajo.

jmoreno
fuente