这是一个将运行 svn log 并解析输出的版本。
当然,我没有你的 repo,所以我不得不通过 cating 你的输出来伪造命令和输出,但它可以工作。
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 在另一个问题中想要的。
所以问题将是为每个$revno 循环一次 Perl 的主体。
foreach my $revno (@ARGV) {
print $revno, "\n";
}
EDIT将代码组的主体按模块更改为...
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 实现他们想要的。