我知道这个命令:
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. =============================================================================
答案 0 :(得分:9)
使用-w
选项,-S
选项似乎效果更好。否则,有其他结果似乎与userid无关。也许有人可以解释一下。
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
。
答案 1 :(得分:4)
您想要cvsps - 这将从CVS历史记录中生成补丁集。那么,你应该只在cvsps输出中有一个你的评论实例,其中的文件整齐地列在它下面
答案 2 :(得分:2)
我的第一个想法是使用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
答案 3 :(得分:1)
这是我做的 - 一个简单的Javascript:
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
答案 4 :(得分:1)
这个命令和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;}'
答案 5 :(得分:0)
这可能过度,但您可以使用git-cvsimport将CVS历史记录导入Git存储库并使用Git工具进行搜索。您不仅可以在提交消息中搜索文本,还可以搜索已从存储库中的文件添加或已删除的代码。
答案 6 :(得分:0)
CVSSearch可能有所帮助,但这是一个CGI应用程序:'(