2008-09-23 20 views
8

Soy consciente de este comando: cvs log -N -w<userid> -d"1 day ago"Cómo buscar comentario cvs historia

Desafortunadamente esto genera un informe con formato con una gran cantidad de nuevas líneas en él, de manera que el archivo de la ruta, el archivo de la versión, y el comentario -text están todos en líneas separadas. Por lo tanto, es difícil escanear todas las apariciones de texto de comentarios (por ejemplo, grep) y correlacionar las coincidencias con el archivo/versión.

(Tenga en cuenta que la salida del registro sería perfectamente aceptable, aunque sólo cvs podrían realizar el filtrado de forma nativa.)

EDIT: Ejemplo de salida. Un bloque de texto como este se informó para cada archivo de depósito:

 

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. 
============================================================================= 

Respuesta

9

Las opciones -w parecen funcionar mejor con la opción -S. 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 que he estado recibiendo un éxito razonable se conducirá a grep:

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

estoy redirigir la salida a un archivo desde el registro de cvs es ruidoso y no estoy seguro de cómo hacer es silencioso Supongo que una alternativa es redirigir el stderr al /dev/null.

+1

Eso es increíble Steve. No estaba al tanto de la opción -B grep: "imprimir NUM líneas de contexto principal". Entonces, con el informe de 15 líneas que el registro cvs genera para cada archivo (el comentario es el 15), -B14 me da el bloque completo para cada archivo coincidente. –

+0

Obviamente, esto funciona mejor cuando el texto que está buscando está en la primera línea, pero es un comienzo. –

+1

por cierto, cvs log -N -S -w -d "hace 1 día" buscará las entradas más antiguas que hace 1 día de forma predeterminada. Creo que lo que quieres es esto -d "> 1 día atrás" –

0

Esta podría ser la forma exageración, pero se puede usar git-cvsimport para importar el historial de CVS a un repositorio Git y buscarla en el uso de herramientas de Git. No solo puede buscar texto dentro de los mensajes de confirmación, sino que también puede buscar el código que se haya agregado o eliminar de los archivos de su repositorio.

+2

Y eso se haría ¿CÓMO? – dokaspar

0

CVSSearch podría ayudar, pero es una aplicación CGI: '(

2

Mis primeros pensamientos fueron para usar egrep (o grep -E, creo) para buscar múltiples patrones tales como:

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

pero luego me di cuenta de que quería filtrar de manera más inteligente.

Para ese fin, utilizaría awk (o perl) para procesar la salida línea por línea, estableciendo 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 
+0

La parte difícil de una solución de posprocesamiento es que el contenido de interés se encuentra en la parte posterior de los bloques de texto. Por lo tanto, sería necesario almacenar en memoria intermedia cada bloque, luego descartarlo o imprimirlo. Creo que awk puede hacer esto, pero probablemente involucre un proyecto de varios días para mí. –

1

Aquí es lo que hice - un simple script de 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 aquí es como lo he usado:

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

¿Quieres cvsps - que generará conjuntos de parches de la historia de CVS. Entonces, solo debe tener una instancia de su comentario en la salida de cvsps, con los archivos claramente listados debajo de

1

Este comando y secuencia de comandos gawk me ayuda a encontrar solo el nombre de archivo, fecha y línea de comentario de cada entrada de 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;}'