Rechercher dans les fichiers: rechercher tout le code dans Team Foundation Server

102

Existe-t-il un moyen de rechercher dans la dernière version de chaque fichier dans TFS une chaîne ou une expression régulière spécifique? C'est probablement la seule chose qui me manque dans Visual Source Safe ...

Actuellement, j'effectue un Get Latest sur toute la base de code et j'utilise Windows Search, mais cela devient assez pénible avec plus de 1 Go de code dans 75 000 fichiers.

EDIT : J'ai essayé les outils électriques mentionnés, mais l'option "Wildcard Search" semble rechercher uniquement les noms de fichiers et non le contenu.

MISE À JOUR : Nous avons implémenté une option de recherche personnalisée dans une installation existante de MOSS (Search Server).

Mark Glorie
la source

Réponses:

57

Team Foundation Server 2015 (sur site) et Visual Studio Team Services (version cloud) incluent la prise en charge intégrée de la recherche dans tous vos codes et éléments de travail.

Vous pouvez faire des recherches de chaînes simples comme foo, des opérations booléennes comme foo OR barou des choses plus complexes spécifiques à un langage commeclass:WebRequest

capture d'écran de la syntaxe du filtre de recherche de code

Vous pouvez en savoir plus ici: https://www.visualstudio.com/en-us/docs/search/overview

Grant Holliday
la source
2
Voir ma réponse ci-dessous, et voter pour;) Ceci est désormais possible à partir de TFS 2015 en utilisant le Code Searchplugin. marketplace.visualstudio.com/items?itemName=ms.vss-code-search
deadlydog
La recherche de code est actuellement disponible uniquement pour Visual Studio Team Services. La prise en charge de Team Foundation Server est en cours de développement et sera incluse dans la prochaine version.
paparush
La recherche de code est maintenant disponible dans TFS 2017 ou plus récent.
csrowell
Si vous essayez de basculer vers la version 2015 de ce document: «La page demandée n'est pas disponible pour Team Foundation Server 2015».
AaronLS
16

Dans mon cas, l'écriture d'un petit utilitaire en C # m'a aidé. Liens qui m'ont aidé - http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

Comment lister les fichiers d'un projet d'équipe à l'aide de l'API TFS?

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 Rég
la source
13

Il existe une autre solution alternative, qui semble plus attractive.

  1. Configurer un serveur de recherche - peut être n'importe quelle machine / serveur Windows
  2. Configurez un service de notification TFS * (Bissubscribe) pour obtenir, supprimer, mettre à jour des fichiers à chaque fois qu'une archivage a lieu. Il s'agit donc d'un service Web qui agit comme un écouteur sur le serveur TFS et met à jour / synchronise les fichiers et dossiers sur le serveur de recherche. - cela améliorera considérablement la précision (recherche en direct) et évitera la charge ponctuelle de faire des obtentions périodiques
  3. Configurer un service d'indexation / une recherche indexée Windows sur le serveur de recherche pour le dossier racine
  4. Exposez un service Web pour renvoyer les résultats de la recherche

Maintenant, avec toute la configuration ci-dessus, vous avez quelques options pour le client:

  1. Configurez une page Web pour appeler le service de recherche et formater les résultats à afficher sur la page Web - vous pouvez également intégrer cette page Web dans Visual Studio (via une macro ou un complément)
  2. Créez une interface client Windows (winforms / wpf) pour appeler le service de recherche, formater les résultats et les afficher sur l'interface utilisateur - vous pouvez également intégrer cet outil client dans Visual Studio via VSPackages ou un complément

Mise à jour : j'ai emprunté cette voie et cela fonctionne bien. Je voulais juste ajouter à cela.

Liens de référence:

  1. Utilisez cet outil au lieu de bissubscribe.exe
  2. Gestion des événements TFS
  3. Notifications du système d'équipe
Vin
la source
12

Si vous installez TFS 2008 PowerTools, vous obtiendrez une action «Rechercher dans le contrôle de code source» dans le menu contextuel de Team Explorer.

Outils électriques TFS2008

Markom
la source
4
@muerte, c'est drôle qu'on les appelle des «outils électriques». Certains diraient que faire quelque chose comme une restauration est une «fonctionnalité de base». :-)
Iain Holder
eh bien, vous pouvez certainement effectuer une restauration manuellement, ce n'est tout simplement pas une opération en un seul clic. Peut-être que ça devrait être ..
Jeff Atwood
3
Bonne réponse, lien mort: microsoft.com/downloads/…
wcm
15
Je pense que rechercher uniquement le nom du fichier / dossier
Kiddo
9
-1 les outils électriques ne recherchent pas le contenu des fichiers , uniquement les noms de fichiers / dossiers.
Eugene Beresovsky
6

Nous avons mis en place une solution pour Team Foundation Server Source Control (et non SourceSafe comme vous le mentionnez) similaire à ce que suggère Grant; programmé TF Get, Search Server Express. Cependant, l'IFilter utilisé pour les fichiers C # (texte) ne donnait pas les résultats souhaités, nous convertissons donc les fichiers source en fichiers .htm. Nous pouvons maintenant ajouter des méta-données supplémentaires aux fichiers tels que:

  • Auteur (nous le définissons comme la personne qui a archivé le fichier pour la dernière fois)
  • Codage couleur (sur notre todo-list)
  • Nombre de modifications indiquant des problèmes de conception potentiels (sur notre liste de tâches)
  • Intégration avec l'IDE VSTS comme la fonctionnalité Koders SmartSearch
  • etc.

Nous préférerions cependant un gestionnaire de protocole pour TFS Source Control, et un code source dédié IFilter pour une solution beaucoup plus ciblée.

GertGregers
la source
1
Des plans pour ouvrir la conversion .htm?
technomalogical
6

D'accord,

  1. Les outils électriques TFS2008 n'ont pas de fonction de recherche dans les fichiers. «Les outils Rechercher dans le contrôle de code source offrent la possibilité de localiser des fichiers et des dossiers dans le contrôle de code source par l' état de l'élément ou avec une expression générique

  2. Il existe un programme Windows avec cette fonctionnalité publié sur CodePlex . Je viens d'installer et de tester cela et cela fonctionne bien.

abatishchev
la source
C'est floconneux et lent, mais semble faire ce qu'il dit sur l'étain
Paul Michaels
J'obtiens une erreur comme ces personnes ont obtenu dans le lien ci-dessous. Quelqu'un d'autre vit-il cela? tfssearchcode.codeplex.com/workitem/32475
strider
6

C'est désormais possible à partir de TFS 2015 en utilisant le Code Searchplugin.https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

La recherche se fait via l'interface Web et ne nécessite pas de télécharger le code sur votre machine locale, ce qui est bien.

chien mortel
la source
Remarque: La recherche de code est actuellement disponible uniquement pour Visual Studio Team Services. La prise en charge de Team Foundation Server est en cours de développement et sera incluse dans la prochaine version.
Jamie
3

Une autre solution consiste à utiliser "ctrl + shift + F". Vous pouvez modifier l'emplacement de recherche dans un répertoire local plutôt qu'une solution ou un projet. Cela remplacera simplement la recherche sur le bureau et vous devrez toujours obtenir le dernier code, mais cela vous permettra de rester dans Visual Studio pour effectuer votre recherche.

Todd
la source
4
Ne résout pas le problème de la recherche dans les versions de code TFS.
Craig
Pas ce qu'ils voulaient.
Dave
Inutile de rechercher des contenus que vous n'avez pas téléchargés. Autant utiliser grep / findstr.
Jamie
2

En supposant que vous ayez Notepad ++ , une fonctionnalité souvent manquée est «Rechercher dans les fichiers», qui est extrêmement rapide et vient avec des filtres, des expressions régulières, des remplacements et tous les goodies N ++.

homme souriant
la source
1

Ce complément prétend avoir la fonctionnalité que je pense que vous recherchez:

Sidekicks de la Fondation d'équipe

Paul G
la source
Désolé, je ne vois pas où il propose de rechercher à l'intérieur des fichiers?
Mark Glorie
4
Finalement, j'ai téléchargé ce plug-in plus tôt et il ne vous permet de rechercher que par auteur, étiquette, date, etc. mais pas dans les anciennes versions de fichiers ...: \
Sandor Davidhazi
1

Cette recherche d'un lien de fichier explique comment trouver un fichier. J'ai dû me débrouiller avec les conseils pour que cela fonctionne.

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

Dans le cas de la commande cd, j'ai exécuté la commande cd car je cherchais le fichier tf.exe. Il était plus facile de simplement commencer à partir de ce répertoire en ajoutant le chemin complet. Maintenant que je comprends comment faire ce travail, j'utiliserais le chemin absolu entre guillemets.

Dans le cas de la recherche tf, j'ai commencé à la racine du serveur avec $/et j'ai recherché tous les fichiers qui se terminaient par sqlie *.sql. Si vous ne voulez pas commencer à la racine, utilisez à la "$/myproject/*.sql"place.

Oh! Cela ne résout pas la recherche dans le fichier d'une partie de la question mais ma recherche Google m'a amené ici pour trouver des fichiers parmi d'autres liens.

Greg
la source
1

Il n'y a actuellement aucun moyen de le faire hors de la boîte, mais il y a une suggestion de voix utilisateur pour l'ajouter: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed- recherche-plein-texte-d'éléments-de-travail

Bien que je doute que ce soit aussi simple que de basculer un interrupteur, si tous ceux qui ont vu cette question votaient pour elle, MS mettrait probablement en œuvre quelque chose.

Mise à jour: il suffit de lire le blog de Brian Harry , qui montre cette demande comme étant sur leur radar, et la version en ligne de Visual Studio a une prise en charge limitée pour la recherche où git est utilisé comme vcs: http://blogs.msdn.com/b/ visualstudioalm / archive / 2015/02/13 / annonce-aperçu-limité-pour-visual-studio-online-code-search.aspx . À partir de là, je pense qu'il est juste de dire que ce n'est qu'une question de temps ...

Mise à jour 2: Il existe maintenant une extension fournie par Microsoft, Recherche de code , qui permet de rechercher dans le code ainsi que dans les éléments de travail.

jmoreno
la source