-1

我在 linux 中运行以下命令来为特定修订生成详细日志。

svn log -v -r12345 http://svn-remote.com/path

输出是:

------------------------------------------------------------------------
r12345 | debajyoti.das@email.com | 2013-02-07 01:27:08 -0800 (Thu, 07 Feb 2013) | 1 line
Changed paths:
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.agent/src/main/java/com/companyname/cycle/agent/Main.java
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.agent/src/main/java/com/companyname/cycle/agent/bll/tasks/CycleGroupTask.java
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.agent/src/main/java/com/companyname/cycle/agent/bll/tasks/CycleProcessTaskBll.java
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.agent/src/main/java/com/companyname/cycle/agent/bll/tasks/CycleSequenceProcessTaskBll.java
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.test/src/main/java/com/companyname/cycle/test/bll/MockCycleBll.java
   M /PROJECT/CYCLE/branches/DEV_Branch/pas.cycle/src/main/java/com/companyname/pas/cycle/bll/DasCycleBll.java
   M /PROJECT/CYCLE/branches/DEV_Branch/pas.cycle/src/main/java/com/companyname/pas/cycle/dal/DasCycleDal.java

BUG ID 12345678 - BLAH IMPLEMENTATION IN PROJECT.CYCLE 
------------------------------------------------------------------------

我想解析这个日志输出每个文件的包名称。例如:

PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleGroupTask.java

如何编写 perl 或 python 或 shell 脚本来做到这一点,以便使用可以像这样,例如:

$ perl svnlog.pl 12345 > log.txt
4

2 回答 2

1

我认为你的java项目是maven项目:

 awk -F'src/main/java/' 'NF==2{split($1,a,"/");j=p=$2;sub(/.*\//,"",j);sub("/[^/]*$","",p);gsub("/",".",p);print a[2]"."a[3],p,j}' yourlog

用你的例子测试:

kent$  cat f1
------------------------------------------------------------------------
r12345 | debajyoti.das@email.com | 2013-02-07 01:27:08 -0800 (Thu, 07 Feb 2013) | 1 line
Changed paths:
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.agent/src/main/java/com/companyname/cycle/agent/Main.java
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.agent/src/main/java/com/companyname/cycle/agent/bll/tasks/CycleGroupTask.java
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.agent/src/main/java/com/companyname/cycle/agent/bll/tasks/CycleProcessTaskBll.java
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.agent/src/main/java/com/companyname/cycle/agent/bll/tasks/CycleSequenceProcessTaskBll.java
   M /PROJECT/CYCLE/branches/DEV_Branch/cycle.test/src/main/java/com/companyname/cycle/test/bll/MockCycleBll.java
   M /PROJECT/CYCLE/branches/DEV_Branch/pas.cycle/src/main/java/com/companyname/pas/cycle/bll/DasCycleBll.java
   M /PROJECT/CYCLE/branches/DEV_Branch/pas.cycle/src/main/java/com/companyname/pas/cycle/dal/DasCycleDal.java

BUG ID 12345678 - BLAH IMPLEMENTATION IN PROJECT.CYCLE 
------------------------------------------------------------------------

kent$  awk -F'src/main/java/' 'NF==2{split($1,a,"/");j=p=$2;sub(/.*\//,"",j);sub("/[^/]*$","",p);gsub("/",".",p);print a[2]"."a[3],p,j}' f1
PROJECT.CYCLE com.companyname.cycle.agent Main.java
PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleGroupTask.java
PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleProcessTaskBll.java
PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleSequenceProcessTaskBll.java
PROJECT.CYCLE com.companyname.cycle.test.bll MockCycleBll.java
PROJECT.CYCLE com.companyname.pas.cycle.bll DasCycleBll.java
PROJECT.CYCLE com.companyname.pas.cycle.dal DasCycleDal.java
于 2013-02-14T11:07:19.117 回答
1

这是一个将运行svn log和解析输出的版本。

当然,我没有你的仓库,所以我不得不通过cat输入你的输出来伪造命令和输出,但它可以工作。

use strict;

my $revno = shift @ARGV;

die "Usage: $0: svn-revision\n" unless $revno;

my $cmd = "svn log -v -r$revno 'http://svn-remote.com/path'";

open(SVN,"$cmd |") or die "Command '$cmd' Failed : $!\n";

while(<SVN>) {
    chomp;
    if ( /^\s+\S\s\/([^\/]+\/[^\/]+).*[^\/]$/ ) {
        (my $tag = $1) =~ s!/!.!g;
        s!.*/src/main/java/!!;
        my @a =  split(/\//);
        my $file = pop @a;
        print $tag, " ",  join(".", @a), " ",  $file, "\n";
    }
}

我的测试输出。

PROJECT.CYCLE com.companyname.cycle.agent Main.java
PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleGroupTask.java
PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleProcessTaskBll.java
PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleSequenceProcessTaskBll.java
PROJECT.CYCLE com.companyname.cycle.test.bll MockCycleBll.java
PROJECT.CYCLE com.companyname.pas.cycle.bll DasCycleBll.java
PROJECT.CYCLE com.companyname.pas.cycle.dal DasCycleDal.java

maven repo 也会有一个src/test/java目录:D,我想你对它们不感兴趣。


编辑 针对您的数据运行 Perl 的主体,基本上my $cmd = "sh fake.sh";从另一个问题添加会产生:

PROJECT.CYCLE com.companyname.cycle.agent Main.java
PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleGroupTask.java
PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleProcessTaskBll.java
PROJECT.CYCLE com.companyname.cycle.agent.bll.tasks CycleSequenceProcessTaskBll.java
PROJECT.CYCLE com.companyname.cycle.test.bll MockCycleBll.java
PROJECT.CYCLE com.companyname.pas.cycle.bll DasCycleBll.java
PROJECT.CYCLE com.companyname.pas.cycle.dal DasCycleDal.java
PROJECT.SHARED com.companyname.extensibility NamedExtensionPoint.java
PROJECT.SHARED com.companyname.extensibility PrePostExtensionPoint.java
PROJECT.SHARED com.companyname.extensibility.helper ExtensionConfigurationHelper.java
PROJECT.SRE com.companyname.ext DocumentGeneratorExt.java
PROJECT.SRE com.companyname.ext NamedExtensionPoint.java
PROJECT.SRE com.companyname.ext SystemDateBll.java
MODULE.CYCLE com.companyname.extensibility FileCycle1.java
MODULE.CYCLE com.companyname.extensibility FileCycle2.java

这似乎是 OP 在另一个问题中想要的。

因此,问题将是在 Perl 的主体中为 each 循环一次$revno

foreach my $revno (@ARGV)   {
        print $revno, "\n";
}

编辑按模块将代码组的主体更改为...

my %info;
while(<SVN>) {
    chomp;
    if ( /^\s+\S\s\/([^\/]+\/[^\/]+).*[^\/]$/ ) {
        (my $tag = $1) =~ s!/!.!g;
        s!.*/src/main/java/!!;
        my @a =  split(/\//);
        my $file = pop @a;
        print $tag, " ",  join(".", @a), " ",  $file, "\n";
        push @{$info{$tag}}, join(" ", join(".", @a), $file);
        #push @{$info{$tag}}, $file;
    }
}

while ( my ($key, $value) = each %info )
{
    print "$key\n";
    for my $line ( @{$info{$key}} ) {
        print "\t", $line, "\n";
    }
}

在之前给出的数据上产生这个。

PROJECT.SHARED
    com.companyname.extensibility NamedExtensionPoint.java
    com.companyname.extensibility PrePostExtensionPoint.java
    com.companyname.extensibility.helper ExtensionConfigurationHelper.java
PROJECT.CYCLE
    com.companyname.cycle.agent Main.java
    com.companyname.cycle.agent.bll.tasks CycleGroupTask.java
    com.companyname.cycle.agent.bll.tasks CycleProcessTaskBll.java
    com.companyname.cycle.agent.bll.tasks CycleSequenceProcessTaskBll.java
    com.companyname.cycle.test.bll MockCycleBll.java
    com.companyname.pas.cycle.bll DasCycleBll.java
    com.companyname.pas.cycle.dal DasCycleDal.java
MODULE.CYCLE
    com.companyname.extensibility FileCycle1.java
    com.companyname.extensibility FileCycle2.java
PROJECT.SRE
    com.companyname.ext DocumentGeneratorExt.java
    com.companyname.ext NamedExtensionPoint.java
    com.companyname.ext SystemDateBll.java

这应该以某种方式帮助 OP 实现他们想要的。

于 2013-02-14T11:49:51.063 回答