Как искать историю комментариев в cvs - PullRequest
8 голосов
/ 23 сентября 2008

Мне известна эта команда: cvs log -N -w<userid> -d"1 day ago"

К сожалению, это создает отформатированный отчет с множеством новых строк, так что путь к файлу, версия файла и текст комментария находятся в отдельных строках. Поэтому трудно отсканировать его для всех вхождений текста комментария (например, grep) и сопоставить совпадения с файлом / версией.

(Обратите внимание, что вывод журнала будет вполне приемлемым, если только cvs сможет выполнять фильтрацию изначально.)

РЕДАКТИРОВАТЬ: образец вывода. Блок текста, подобный этому, сообщается для каждого файла репозитория:


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

Ответы [ 7 ]

9 голосов
/ 19 декабря 2008

Параметры -w, кажется, лучше работают с параметром -S. В противном случае есть дополнительные результаты, которые не связаны с идентификатором пользователя. Возможно, кто-то может это объяснить.

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

С этим я добился разумного успеха, отправив команду grep:

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

Я перенаправляю вывод в файл, так как журнал cvs шумит, и я не уверен, как заставить его работать тихо. Я полагаю, что альтернативой является перенаправление stderr на /dev/null.

4 голосов
/ 18 ноября 2009

Вы хотите cvsps - который будет генерировать наборы патчей из истории CVS. Тогда у вас должен быть только один экземпляр вашего комментария в выводе cvsps с файлами, расположенными аккуратно под ним

2 голосов
/ 23 сентября 2008

Моей первой мыслью было использование egrep (или, думаю, grep -E) для поиска нескольких шаблонов, таких как:

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

но потом я понял, что вы хотите фильтровать более разумно.

С этой целью я бы использовал awk (или perl) для построчной обработки вывода, устанавливая переменную echo, когда вы находите интересующий вас раздел; псевдокод здесь:

# 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
1 голос
/ 17 декабря 2015

Эта команда и скрипт gawk помогают мне найти только имя файла, дату и строку комментария для каждой записи в журнале.

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;}'
1 голос
/ 12 февраля 2009

Вот что я сделал - простой 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();
        }
    }
}

А вот как я это использовал:

cvs log -N -S -washamsut | java ParseCVSLog GS-242
0 голосов
/ 23 сентября 2008

CVSSearch может помочь, но это приложение CGI: '(

0 голосов
/ 23 сентября 2008

Это может быть излишним, но вы можете использовать git-cvsimport , чтобы импортировать историю CVS в репозиторий Git и искать ее с помощью инструментов Git. Вы можете не только искать текст в сообщениях коммитов, но и искать код, который когда-либо был добавлен или удален из файлов в вашем хранилище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...