Pregunta

Soy consciente de este comando:cvs log -N -w<userid> -d"1 day ago"

Desafortunadamente, esto genera un informe formateado con muchas líneas nuevas, de modo que la ruta del archivo, la versión del archivo y el texto del comentario están todos en líneas separadas.Por lo tanto, es difícil escanearlo en busca de todas las apariciones de texto de comentario (por ejemplo, grep) y correlacionar las coincidencias con el archivo/versión.

(Tenga en cuenta que la salida del registro sería perfectamente aceptable, si solo cvs pudiera realizar el filtrado de forma nativa).

EDITAR:Salida de muestra.Se informa un bloque de texto como este para cada archivo del repositorio:

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.
=============================================================================
¿Fue útil?

Solución

El -w Las opciones parecen funcionar mejor con el -S opción.De lo contrario, hay resultados adicionales que no parecen estar relacionados con el ID de usuario.Quizás alguien pueda explicarlo.

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

Con eso he tenido un éxito razonable al conectarlo a grep:

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

Estoy redirigiendo la salida a un archivo ya que el registro cvs tiene ruido y no estoy seguro de cómo silenciarlo.Supongo que una alternativa es redirigir el stderr a /dev/null.

Otros consejos

Quieres cvsp - que generará conjuntos de parches a partir del historial de CVS.Entonces, solo debería tener una instancia de su comentario en la salida cvsps, con los archivos listados claramente debajo.

Lo primero que pensé fue usar egrep (o grep -E, creo) para buscar múltiples patrones como:

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

pero luego me di cuenta de que querías filtrar de forma más inteligente.

Con ese fin, usaría awk (o perl) para procesar la salida línea por línea, configurando una variable de eco cuando encuentre una sección de interés;pseudocódigo aquí:

# 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

Esto es lo que hice: un simple script Java:

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();
        }
    }
}

Y así es como lo usé:

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

Este comando y script gawk me ayudan a encontrar solo el nombre del archivo, la fecha y la línea de comentario de cada entrada del registro.

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;}'

Esto puede ser demasiado exagerado, pero podrías usar git-cvsimport para importar el historial de CVS a un repositorio de Git y buscarlo usando las herramientas de Git.No solo puede buscar texto dentro de los mensajes de confirmación, sino que también puede buscar código que alguna vez se haya agregado. o eliminado de archivos en su repositorio.

CVSbúsqueda podría ayudar, pero es una aplicación CGI :'(

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top