Как выполнить поиск в истории комментариев к резюме
-
02-07-2019 - |
Вопрос
Я знаю об этой команде: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. =============================================================================
Решение
Тот Самый -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
.
Другие советы
Ты хочешь cvsps - который будет генерировать наборы исправлений из истории CVS.Затем у вас должен быть только один экземпляр вашего комментария в выходных данных cvsps, с файлами, аккуратно перечисленными под ним
Моими первыми мыслями было использовать 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
Вот что я сделал - простой 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
Эта команда и скрипт 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;}'
Это может быть излишеством, но вы могли бы использовать git-cvsimport импортировать историю резюме в репозиторий Git и выполнить поиск в нем с помощью инструментов Git.Вы можете выполнять поиск не только по тексту в сообщениях о фиксации, но и по коду, который когда-либо добавлялся или удален из файлов в вашем репозитории.
Поиск резюме могло бы помочь, но это CGI-приложение:'(