Frage

Ich bin dieser Befehl bewusst: cvs log -N -w<userid> -d"1 day ago"

Leider erzeugt dies einen formatierten Bericht mit vielen Zeilenumbrüche darin, so dass die Datei-Pfad, die Datei-Version, und der Kommentar-Text sind alle auf separaten Zeilen. Daher ist es schwierig, es für alle Vorkommen von Kommentartext zu scannen, (zB grep) und die Spiele korrelieren / Version Datei.

(Beachten Sie, dass die Log-Ausgabe durchaus akzeptabel wäre, wenn nur cvs nativ die Filterung durchführen kann.)

EDIT: Beispielausgabe. Ein Textblock wie dies für jede Repository-Datei gemeldet:

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.
=============================================================================
War es hilfreich?

Lösung

Die -w Optionen scheinen besser mit der -S Option zu arbeiten. Ansonsten gibt es zusätzliche Ergebnisse, die auf den Benutzer-ID im Zusammenhang scheinen nicht. Vielleicht kann jemand erklären.

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

Damit ich habe immer vernünftig Erfolg es grep kochend:

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

I-Ausgang, da der cvs log in eine Datei bin Umleitung ist laut und ich bin nicht sicher, wie es ruhig zu machen. Ich nehme eine Alternative ist es, die stderr zu umleiten /dev/null.

Andere Tipps

Sie wollen cvsps - die Patchsets aus dem CVS Geschichte generieren. Dann sollten Sie nur noch eine Instanz Ihres Kommentars im cvsps Ausgang mit den darunter aufgelisteten Dateien ordentlich

Meine erste Gedanken waren egrep (oder grep -E, glaube ich) zu verwenden, um mehrere Muster zu suchen, wie zum Beispiel:

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

aber dann merkte ich, Sie wollten mehr intelligent filtern.

Zu diesem Zweck würde ich awk (oder Perl) verwenden, um die Ausgang line-by-line zu verarbeiten, ein Echo variable Einstellung, wenn Sie einen Abschnitt von Interesse; Pseudo-Code hier:

# 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

Hier ist, was ich tat - ein einfacher Java-Skript:

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

Und hier ist, wie ich es verwendet:

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

Mit diesem Befehl und gaffen Skript hilft mir nur den Dateinamen, Datum und Kommentarzeile jeder Protokolleintrag zu finden.

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

Dies könnte Art und Weise zu viel des Guten, aber man konnte a href verwenden <= "http://www.kernel.org/pub/software/scm/git/docs/git-cvsimport.html" rel = "nofollow noreferrer" > git-cvsimport die CVS-Geschichte zu einer Git-Repository importieren und mit Git-Tool suchen. Sie können nicht nur nach Text suchen in Nachrichten begehen, aber Sie können auch für Code suchen, der jemals hinzugefügt wurde oder entfernt von Dateien im Repository.

CVSSearch könnte helfen, aber es ist eine CGI-Anwendung: '(

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top