Perl查询svn分支版本、修改时间等信息

  1. 1. 查询svn分支最新版本
  2. 2. 查询svn分支最后修改时间
  3. 3. 查询最新tag

查询分支的版本,最后修改时间,最新tag等信息的方法

函数以类的私有函数的方式定义,可以改为正常函数使用,如果查询失败会自动重试,连续两次都失败后终止

先定义下全局的svn参数,以及依赖的lib

1
2
use XML::Simple;
my $svn_args = "--username xxx --password yyy --no-auth-cache --non-interactive";

查询svn分支最新版本

入参:分支URL
返回值:查询成功返回版本号,失败返回undef

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
my $get_svnVer = sub {
my ($branch, $fail_num) = @_;
chomp $branch;
if (!$fail_num) {
$fail_num = 1;
}
else {
$fail_num += 1;
}
if ($fail_num > 2) {
return undef;
}

my $result = `svn info $svn_args --xml $branch 2>/dev/null`;
if ($? == 0) {
my $xml = XML::Simple->new();
my $data = $xml->XMLin($result);
return $data->{'entry'}->{'commit'}->{'revision'};
}
else {
return $get_svnVer->($branch, $fail_num);
}
};

查询svn分支最后修改时间

入参:分支URL
返回值:查询失败返回undef,成功返回时间字符串,exp:20140821130515

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
my $get_last_mtime = sub {
my ($branch, $fail_num) = @_;
chomp $branch;
if (!$fail_num) {
$fail_num = 1;
}
else {
$fail_num += 1;
}
if ($fail_num > 2) {
return undef;
}
my $result = `svn info $svn_args --xml $branch 2>/dev/null`;
if ($? == 0) {
my $xml = XML::Simple->new();
my $data = $xml->XMLin($result);
my $time = $data->{'entry'}->{'commit'}->{'date'};
$time =~ /(\d{4})\-(\d{2})\-(\d{2})T(\d{2})\:(\d{2})\:(\d{2})\..*/;
return $1 . $2 . $3 . $4 . $5 . $6;
}
else {
return $get_last_mtime->($branch, $fail_num);
}
};

查询最新tag

如果tag也是创建在根路径tags目录适用

入参:仓库任意分支URL,需要忽略的tag名(可选)
返回值:查询成功返回tag URL,失败返回undef

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
my $get_last_tag = sub {
my ($branch, $ignoreid, $fail_num) = @_;
chomp $branch;
if (!$fail_num) {
$fail_num = 1;
}
else {
$fail_num += 1;
}
if ($fail_num > 3) {
return undef;
}
my $result = `svn info $svn_args --xml $branch 2>/dev/null`;
if ($? == 0) {
my $xml = XML::Simple->new();
my $data = $xml->XMLin($result);
my $repo_root = $data->{'entry'}->{'repository'}->{'root'};
my $num = 1;
my $last_tag;
while (!$last_tag) {
my $result_log = `svn log -l$num -v --stop-on-copy --xml $svn_args $repo_root/tags 2>/dev/null`;
if ($? == 0) {
my $xml_log = XML::Simple->new();
my $data_log = $xml_log->XMLin($result_log);
my @logs;
#如果limit 1时返回的logentry不是数组,数组赋值异常后将值push到数组
eval { @logs = @{ $data_log->{'logentry'} }; };
if ($@) {
push @logs, $data_log->{'logentry'};
}
if ($logs[ $num - 1 ]->{'revision'} == 1) {
return undef;
}

if ($logs[ $num - 1 ]->{'paths'}->{'path'}->{'action'} eq "A") {
my $tag_name = $logs[ $num - 1 ]->{'paths'}->{'path'}->{'content'};
my $tag_ver = $logs[ $num - 1 ]->{'revision'};
if ($ignoreid) {
if ($tag_name !~ /$ignoreid/) {
system("svn list $svn_args $repo_root$tag_name >/dev/null 2>&1");
if ($? == 0) {
$last_tag = $tag_name . "\@" . $tag_ver;
last;
}
}
}
else {
system("svn list $svn_args $repo_root$tag_name >/dev/null 2>&1");
if ($? == 0) {
$last_tag = $tag_name . "\@" . $tag_ver;
last;
}
}
}
}
else {
return $get_last_tag->($branch, $ignoreid, $fail_num);
}
$num++;
}
return $repo_root . $last_tag;
}
else {
return $get_last_tag->($branch, $ignoreid, $fail_num);
}
};

调用方法:

1
2
3
4
my $ver = $get_svnVer->($url);
#如果作为类函数调用,入参改为
# my ($self, $branch, $fail_num) = @_;
my $ver = $self->$get_svnVer($url);

声明: 除非注明,小峰网络遨游记文章均为原创,转载请以链接形式标明本文地址

本博客原创文字只代表本人某一时间内的观点或结论,与本人所在公司没有任何关系。

本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

第三方若用于商业用途的转载,须取得本人授权。

本文作者:

本文地址:http://xfeng.me/get-svn-info-perl/

你可能还对下面文章感兴趣: