解析 SVN 日志更改包名称的路径 [英] Parse SVN Log Changed Path for Package Names

查看:29
本文介绍了解析 SVN 日志更改包名称的路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 linux 中运行以下命令以生成特定版本的详细日志.

I am running the following command in linux to generate a verbose log for a particular revision.

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

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

I want to parse this log output the package names for each of those files. Eg:

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

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

How to write the perl or python or a shell script to do that so that the usage can be like this for example:

$ perl svnlog.pl 12345 > log.txt

推荐答案

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

This is a version that will run svn log and parse the output.

当然,我没有你的 repo,所以我不得不通过 cat 你的输出来伪造命令和输出,但它有效.

Of course I don't have your repo so I had to fake the command and output by just cating your output but it works.

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 仓库也会有一个 src/test/java 目录 :D,我想你对它们不感兴趣.

A maven repo would have a src/test/java directory too :D, I presume you're not interested in them.

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

EDIT Running the body of the Perl against your data basically adding my $cmd = "sh fake.sh"; from the other question produces:

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 在另一个问题中想要的.

Which seems to be what the OP wants in the other question.

因此,问题将是针对每个 $revno 在 Perl 的主体中循环一次.

So the issue would be looping around the body of the Perl once for each $revno.

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

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

EDIT changing the body of the code group by module to be...

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";
    }
}

根据先前给出的数据生成此数据.

produces this on the data previously given.

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 实现他们想要的.

Which should go someway to helping the OP achieve what they want.

这篇关于解析 SVN 日志更改包名称的路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆