Question

Je connais cette commande: cvs log -N -w<userid> -d"1 day ago"

Malheureusement, cela génère un rapport formaté contenant de nombreux sauts de ligne, tels que le chemin du fichier, la version du fichier et le texte du commentaire sont tous séparés. Par conséquent, il est difficile de numériser toutes les occurrences de texte de commentaire (par exemple, grep) et de corréler les correspondances au fichier / à la version.

(Notez que la sortie du journal serait parfaitement acceptable si seulement cvs pouvait effectuer le filtrage de manière native.)

EDIT: Exemple de sortie. Un bloc de texte comme celui-ci est indiqué pour chaque fichier de référentiel:

RCS file: /data/cvs/dps/build.xml,v
Working file: build.xml
head: 1.49
branch:
locks: strict
access list:
keyword substitution: kv
total revisions: 57;    selected revisions: 1
description:
----------------------------
revision 1.48
date: 2008/07/09 17:17:32;  author: noec;  state: Exp;  lines: +2 -2
Fixed src.jar references
----------------------------
revision 1.47
date: 2008/07/03 13:13:14;  author: noec;  state: Exp;  lines: +1 -1
Fixed common-src.jar reference.
=============================================================================
Était-ce utile?

La solution

Les options -w semblent mieux fonctionner avec l'option -S. Sinon, il y a des résultats supplémentaires qui ne semblent pas liés à l'ID utilisateur. Peut-être que quelqu'un peut l'expliquer.

cvs log -N -S -w<userid> -d"1 day ago"

Grâce à cela, le succès a été raisonnable. Je l'ai envoyé à grep:

cvs log -N -S -w<userid> -d"1 day ago" | grep -B14 "some text" > afile

Je redirige la sortie vers un fichier car le journal cvs est bruyant et je ne sais pas comment le rendre silencieux. Je suppose qu’une alternative consiste à rediriger le stderr vers /dev/null.

Autres conseils

Vous voulez cvsps - qui générera des correctifs à partir de l'historique CVS. Ensuite, vous ne devriez avoir qu'une seule instance de votre commentaire dans la sortie cvsps, avec les fichiers listés clairement en dessous

Mes premières pensées ont été d'utiliser egrep (ou grep -E, je pense) pour rechercher plusieurs modèles tels que:

<Cmd> | egrep 'Filename:|Version:|Comment:'

mais ensuite j'ai réalisé que vous vouliez filtrer plus intelligemment.

À cette fin, j'utiliserais awk (ou perl) pour traiter la sortie ligne par ligne, en définissant une variable d'écho lorsque vous trouverez une section d'intérêt; pseudocode ici:

# Assume the sections are of the format:
#   Filename: <filename>
#   Version:  <version>
#   Comment:  <comment>
#             <more comment>

Set echo to false
While more lines left
    Get line
    If line starts with "Filename: " and <filename> is of interest
        Set echo to true
    If line starts with "Filename: " and <filename> is not of interest
        Set echo to false
    If echo is true
        Output line
End while

Voici ce que j'ai fait - un simple Javascript:

import java.io.IOException;


public class ParseCVSLog
{

    public static final String CVS_LOG_FILE_SEPARATOR = "=============================================================================";
    public static final String CVS_LOG_REVISION_SEPARATOR = "----------------------------";
    public static final String CVS_LOG_HEADER_FILE_NAME = "Working file";
    public static final String CVS_LOG_VERSION_PREFIX = "revision";

    public static void main(String[] args) throws IOException
    {
        String searchString = args[0];

        System.out.println( "SEARCHING FOR: " + searchString );

        StringBuffer cvsLogOutputBuffer = new StringBuffer();
        byte[] bytes = new byte[1024];
        int numBytesRead = 0;
        while( (numBytesRead = System.in.read( bytes )) > 0 )
        {
            String bytesString = new String(bytes, 0,  numBytesRead);
            cvsLogOutputBuffer.append( bytesString );
        }

        String cvsLogOutput = cvsLogOutputBuffer.toString();

        String newLine = System.getProperty("line.separator");
        String[] fileArray = cvsLogOutput.split( CVS_LOG_FILE_SEPARATOR );


        for ( String fileRecord : fileArray )
        {
            if ( !fileRecord.contains( searchString ) )
            {
                continue;
            }

            String[] revisionArray = fileRecord.split( CVS_LOG_REVISION_SEPARATOR );
            String[] fileHeaderLineArray = revisionArray[ 0 ].split( newLine );
            String fileName = "";
            for ( String fileHeadeLine : fileHeaderLineArray )
            {
                if ( fileHeadeLine.contains( CVS_LOG_HEADER_FILE_NAME ) )
                {
                    fileName = fileHeadeLine.split( ": " )[ 1 ];
                    break;
                }
            }
            System.out.print( fileName );
            for ( int i = 1; i < revisionArray.length; i++ )
            {
                String versionRecord = revisionArray[ i ];
                if ( !versionRecord.contains( searchString ) )
                {
                    continue;
                }
                String[] versionLineArray = versionRecord.split( newLine );
                for ( String versionLine : versionLineArray )
                {
                    if ( versionLine.contains( CVS_LOG_VERSION_PREFIX ) )
                    {
                        System.out.print( " " + versionLine.split( " " )[ 1 ] );
                    }
                }

            }
            System.out.println();
        }
    }
}

Et voici comment je l'ai utilisé:

cvs log -N -S -washamsut | java ParseCVSLog GS-242

Ce script de commande et gawk m'aide à rechercher uniquement le nom de fichier, la date et la ligne de commentaire de chaque entrée de journal.

cvs log -N -S -b -w<userid> -d ">1 day ago" 2>/dev/null | gawk 'BEGIN{out=0;} /^Working file:/ { print $0; } /^date:/ { out=1; } /^===/ { print ""; out=0; } (out==1){print $0;}'

Cela peut paraître excessif, mais vous pouvez utiliser git-cvsimport pour importer l'historique CVS dans un référentiel Git et le rechercher à l'aide des outils Git. Vous pouvez non seulement rechercher du texte dans les messages de validation, mais également rechercher du code qui a déjà été ajouté ou supprimé des fichiers de votre référentiel.

CVSSearch pourrait aider, mais il s'agit d'une application CGI: '(

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top