Source
1
1
#!/usr/bin/perl
2
2
use List::Util qw(max);
3
3
use File::Basename;
4
4
5
5
$name=basename($0);
6
6
$branch='';
7
+
$url='';
7
8
$verbose='';
8
9
9
10
foreach ( @ARGV ) {
10
11
m|^branch=(.+)| && ( $branch = $1, next );
12
+
m|^url=(.+)| && ( $url = $1, next );
11
13
m|^-v$| && ( $verbose = 'yes', next );
12
14
m|^-help$| && ( usage( ), exit );
13
15
usage("unrecognized argument: $_");
14
16
}
15
17
16
18
17
-
unless ( $branch ) { usage("no branch specified") }
19
+
unless ( $branch || $url ) { usage("no branch or url specified") }
18
20
19
21
if ( $name eq 'svn-version' ) {
20
-
$revision = fetch_version($branch);
22
+
$revision = fetch_version_from_url($url ? $url : fetch_url_from_branch($branch));
21
23
} else {
22
-
$revision = fetch_revision($branch);
24
+
if ( $url ) {
25
+
$revision = fetch_revision_from_url($url);
26
+
} else {
27
+
$revision = fetch_revision_from_branch($branch);
28
+
}
23
29
}
24
30
25
31
unless ( $revision ) { die "could not find revision number for branch $branch" }
26
32
print "$revision\n";
27
33
exit 0;
28
34
29
35
30
36
sub usage {
31
37
my $error = shift(@_);
32
-
print "usage:\n\t$name [-help] [-v] [branch=<BRANCH-LABEL>]\n";
38
+
print "usage:\n\t$name [-help] [-v] [branch=<BRANCH-LABEL>] [url=<SUBVERSION-URL>]\n";
33
39
print "\t\t-v\t\tverbose\n";
34
40
print "\t\t-help\t\tdisplay this message and exit\n";
35
41
die $error if $error;
36
42
}
37
43
38
44
39
-
sub fetch_version {
45
+
sub fetch_url_from_branch {
40
46
my $branch = shift(@_);
41
47
my $result='';
42
48
my $current = '';
43
49
my %branches = ( );
44
50
open( my $branches, "echo t | svn info --depth immediates https://svn.cv.nrao.edu/svn/casa/branches 2> /dev/null |" );
45
51
foreach ( <$branches> ) {
46
52
if ( m|Path:\s+$branch-(\S+)| ||
47
53
m|Path:\s+$branch$| && $branch =~ m|((?:[0-9]+_)+[0-9]+)| ) {
48
54
my $suffix = $1;
49
55
next unless $suffix =~ m|_|;
61
67
$branches{$current} = $1;
62
68
$current = 0;
63
69
}
64
70
}
65
71
close($branches);
66
72
67
73
my $version = max(keys %branches);
68
74
my $url = $branches{$version};
69
75
unless( $url ) { die "could not find URL" }
70
76
unless( $url =~ m|^https://| ) { die "$url does not look like a subversion URL" }
77
+
return $url;
78
+
}
79
+
80
+
81
+
sub fetch_version_from_url {
82
+
my $url = shift(@_);
83
+
71
84
open( my $version, "echo t | svn cat $url/code/VERSION 2> /dev/null |" );
72
85
$_ = <$version>;
73
86
close($version);
74
87
m|^(\d+\.\d+)| or die "could not find version number";
75
88
return $1;
76
89
}
77
90
78
-
sub fetch_revision {
91
+
sub fetch_revision_from_branch {
79
92
my $branch = shift(@_);
80
93
my $result='';
81
94
my $current = '';
82
95
my %branches = ( );
83
96
open( my $branches, "echo t | svn info --depth immediates https://svn.cv.nrao.edu/svn/casa/branches 2> /dev/null |" );
84
97
foreach ( <$branches> ) {
85
98
if ( m|Path:\s+$branch-(\S+)| ||
86
99
m|Path:\s+$branch$| && $branch =~ m|((?:[0-9]+_)+[0-9]+)| ) {
87
100
my $suffix = $1;
88
101
next unless $suffix =~ m|_|;
99
112
if ( $verbose ) { print STDERR "\tfound revision $1 for $current\n" }
100
113
$branches{$current} = $1;
101
114
$current = 0;
102
115
}
103
116
}
104
117
close($branches);
105
118
106
119
my $version = max(keys %branches);
107
120
return $branches{$version};
108
121
}
122
+
123
+
sub fetch_revision_from_url {
124
+
my $url = shift(@_);
125
+
my $result='';
126
+
open( my $info, "echo t | svn info $url 2> /dev/null |" );
127
+
foreach ( <$info> ) {
128
+
if ( m|^Last Changed Rev: (\d+).*| ) {
129
+
$result = $1;
130
+
}
131
+
}
132
+
close($info);
133
+
unless ( $result ) { die "could not find revision for $url" }
134
+
return $result;
135
+
}