1*b1cdbd2cSJim Jagielski#**************************************************************
2*b1cdbd2cSJim Jagielski#
3*b1cdbd2cSJim Jagielski#  Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski#  or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski#  distributed with this work for additional information
6*b1cdbd2cSJim Jagielski#  regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski#  to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski#  "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski#  with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski#
11*b1cdbd2cSJim Jagielski#    http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski#
13*b1cdbd2cSJim Jagielski#  Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski#  software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski#  KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski#  specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski#  under the License.
19*b1cdbd2cSJim Jagielski#
20*b1cdbd2cSJim Jagielski#**************************************************************
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielskiuse warnings;
25*b1cdbd2cSJim Jagielskiuse strict;
26*b1cdbd2cSJim Jagielskiuse diagnostics;
27*b1cdbd2cSJim Jagielski
28*b1cdbd2cSJim Jagielskisub trim;
29*b1cdbd2cSJim Jagielskisub readIncVersions($);
30*b1cdbd2cSJim Jagielskisub processLine($$);
31*b1cdbd2cSJim Jagielskisub checkName($);
32*b1cdbd2cSJim Jagielskisub incrementNewVersion($);
33*b1cdbd2cSJim Jagielskisub incrementOldVersion($);
34*b1cdbd2cSJim Jagielskisub incrementPolicyVersion($);
35*b1cdbd2cSJim Jagielskimy $usage =
36*b1cdbd2cSJim Jagielski"The tool increments the minor version of assemblies and the major version of ".
37*b1cdbd2cSJim Jagielski"the respective policy files. This is only done if new uno types have been added since".
38*b1cdbd2cSJim Jagielski"the last product upate. This information is obtained from the file which is passed as ".
39*b1cdbd2cSJim Jagielski"argument changedTypes. The names in the version file must have a particular form. ".
40*b1cdbd2cSJim Jagielski"They must end on one of folling terms: NEW_VERSION, OLD_VERSION, POLICY_VERSION\n".
41*b1cdbd2cSJim Jagielski"If no new published types habe been added then no output, argument  newVersions, is written".
42*b1cdbd2cSJim Jagielski"Usage is: \n increment_version.pl oldVersions  incVersions newVersions changedTypes\n\n".
43*b1cdbd2cSJim Jagielski"oldVersion: Contains name value pairs, which are used for forming the config files of ".
44*b1cdbd2cSJim Jagielski"the policy assemblies, for building the assemblies. \n\n".
45*b1cdbd2cSJim Jagielski"incVersions: File containing the names of which the versions are to be incremented. ".
46*b1cdbd2cSJim Jagielski"Every line may only contain one name. The names must exactly match those from the ".
47*b1cdbd2cSJim Jagielski"oldVersion file.\n\n".
48*b1cdbd2cSJim Jagielski"newVersions: Contains all entries from oldVersions, but the values of the names,".
49*b1cdbd2cSJim Jagielski"which occur in selection, have been incremented.\n\n".
50*b1cdbd2cSJim Jagielski"changedTypes: File that contains the information if new published types have been added ".
51*b1cdbd2cSJim Jagielski"since the last product update.\n\n" ;
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielskimy $sNameForm =
54*b1cdbd2cSJim Jagielski"The names must end on one of these names: NEW_VERSION, OLD_VERSION, POLICY_VERSION\n".
55*b1cdbd2cSJim Jagielski"For example, valid names are: \n".
56*b1cdbd2cSJim Jagielski"CLI_URETYPES_NEW_VERSION\nCLI_URETYPES_OLD_VERSION\nCLI_URETYPES_POLICY_VERSION\n";
57*b1cdbd2cSJim Jagielski
58*b1cdbd2cSJim Jagielskiif (scalar @ARGV < 4) {
59*b1cdbd2cSJim Jagielski   print $usage;
60*b1cdbd2cSJim Jagielski   exit -1;
61*b1cdbd2cSJim Jagielski}
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski-e "$ARGV[0]" or die "Error: wrong arguments. \n".$usage;
64*b1cdbd2cSJim Jagielski-e "$ARGV[1]" or die "Error: wrong arguments. \n".$usage;
65*b1cdbd2cSJim Jagielski-e "$ARGV[3]" or die "Error: wrong arguments. \n".$usage;
66*b1cdbd2cSJim Jagielski
67*b1cdbd2cSJim Jagielski#check if new types have been added since last release.
68*b1cdbd2cSJim Jagielski#If not, then there is nothing to be done.
69*b1cdbd2cSJim Jagielski#read in oldVersions line by line and apply the increment operation
70*b1cdbd2cSJim Jagielskiopen TYPES, "$ARGV[3]" or die "Cannot open to $ARGV[3] $!";
71*b1cdbd2cSJim Jagielski
72*b1cdbd2cSJim Jagielskimy $newTypes;
73*b1cdbd2cSJim Jagielski
74*b1cdbd2cSJim Jagielski#We look for the line that contains the number of new types
75*b1cdbd2cSJim Jagielskiwhile(<TYPES>)
76*b1cdbd2cSJim Jagielski{
77*b1cdbd2cSJim Jagielski    if (/New and published types/i)
78*b1cdbd2cSJim Jagielski    {
79*b1cdbd2cSJim Jagielski	$_ =~ /=\s*(\d+)/;
80*b1cdbd2cSJim Jagielski	if ( ! defined $1)
81*b1cdbd2cSJim Jagielski	{
82*b1cdbd2cSJim Jagielski	    print "\n###$ARGV[3] contains an invalid entry for 'New and published types'.  \n\n";
83*b1cdbd2cSJim Jagielski	    exit -1;
84*b1cdbd2cSJim Jagielski	}
85*b1cdbd2cSJim Jagielski	$newTypes = $1;
86*b1cdbd2cSJim Jagielski    }
87*b1cdbd2cSJim Jagielski}
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski#Check if changeTypes contained the line we are looking for
90*b1cdbd2cSJim Jagielskiif (! defined $newTypes)
91*b1cdbd2cSJim Jagielski{
92*b1cdbd2cSJim Jagielski    print "\n###$ARGV[3] does not contain entry about the new types ".
93*b1cdbd2cSJim Jagielski	"or we are looking for the wrong string! \n\n";
94*b1cdbd2cSJim Jagielski    exit -1;
95*b1cdbd2cSJim Jagielski}
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielskiif ( $newTypes == 0)
98*b1cdbd2cSJim Jagielski{
99*b1cdbd2cSJim Jagielski    print "\nNo new UNO types since las product update.\n";
100*b1cdbd2cSJim Jagielski    exit 0;
101*b1cdbd2cSJim Jagielski}
102*b1cdbd2cSJim Jagielskielse
103*b1cdbd2cSJim Jagielski{
104*b1cdbd2cSJim Jagielski    print "\nNew UNO types were addes since last release. The version will be increased.\n\n";
105*b1cdbd2cSJim Jagielski}
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski#read in incVersions in a list
108*b1cdbd2cSJim Jagielskimy @incVersions = readIncVersions($ARGV[1]);
109*b1cdbd2cSJim Jagielski#print "@incVersions";
110*b1cdbd2cSJim Jagielski
111*b1cdbd2cSJim Jagielski#read in oldVersions line by line and apply the increment operation
112*b1cdbd2cSJim Jagielskiopen OLDVERSION, "$ARGV[0]" or die "Cannot open to $ARGV[0] $!";
113*b1cdbd2cSJim Jagielski
114*b1cdbd2cSJim Jagielski#open file we want to write to
115*b1cdbd2cSJim Jagielskiopen NEWVERSION, "> $ARGV[2]" or die "Cannot write to $ARGV[2] $!";
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielskiprint NEWVERSION processLine($_, @incVersions) while(<OLDVERSION>);
118*b1cdbd2cSJim Jagielski
119*b1cdbd2cSJim Jagielskiclose NEWVERSION;
120*b1cdbd2cSJim Jagielskiclose OLDVERSION;
121*b1cdbd2cSJim Jagielski
122*b1cdbd2cSJim Jagielskiexit 0;
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielskisub processLine($$)
125*b1cdbd2cSJim Jagielski{
126*b1cdbd2cSJim Jagielski    my $line = $_[0];
127*b1cdbd2cSJim Jagielski    #skip empty lines
128*b1cdbd2cSJim Jagielski    my $trimmed;
129*b1cdbd2cSJim Jagielski    return $line if (length($trimmed = trim($line)) == 0);
130*b1cdbd2cSJim Jagielski    #Skip comment symbol: #
131*b1cdbd2cSJim Jagielski    return $line if ($trimmed =~ /^#/);
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski    #Get the left part of '='
134*b1cdbd2cSJim Jagielski    my $i = index($line, "=");
135*b1cdbd2cSJim Jagielski    if( $i == -1)
136*b1cdbd2cSJim Jagielski    {
137*b1cdbd2cSJim Jagielski	print "Error: No '=' found in line:,: \n $line \n";
138*b1cdbd2cSJim Jagielski	exit -1;
139*b1cdbd2cSJim Jagielski    }
140*b1cdbd2cSJim Jagielski    my $name = substr($line, 0, $i);
141*b1cdbd2cSJim Jagielski    $name = trim($name);
142*b1cdbd2cSJim Jagielski    #We do not check the names here because the file can contain
143*b1cdbd2cSJim Jagielski    #other names, e.g. CLI_URETYPES_POLICY_ASSEMBLY
144*b1cdbd2cSJim Jagielski    if (length($name) == 0) {
145*b1cdbd2cSJim Jagielski	print "Wrong line in $ARGV[0]\n", $sNameForm;
146*b1cdbd2cSJim Jagielski	exit -1;
147*b1cdbd2cSJim Jagielski    }
148*b1cdbd2cSJim Jagielski    my $value = substr($line, $i + 1);
149*b1cdbd2cSJim Jagielski    $value = trim($value);
150*b1cdbd2cSJim Jagielski
151*b1cdbd2cSJim Jagielski    #Check if the entry shall be incremented, this information is in the second
152*b1cdbd2cSJim Jagielski    #argument
153*b1cdbd2cSJim Jagielski    my $found;
154*b1cdbd2cSJim Jagielski    for(@incVersions) {
155*b1cdbd2cSJim Jagielski	if ($_ eq $name) {
156*b1cdbd2cSJim Jagielski	    $found = 1;
157*b1cdbd2cSJim Jagielski	    last;
158*b1cdbd2cSJim Jagielski	}
159*b1cdbd2cSJim Jagielski    }
160*b1cdbd2cSJim Jagielski    if ( ! defined($found)) {
161*b1cdbd2cSJim Jagielski	 return $line;
162*b1cdbd2cSJim Jagielski    }
163*b1cdbd2cSJim Jagielski
164*b1cdbd2cSJim Jagielski    #Check if the name represents a version we need to change
165*b1cdbd2cSJim Jagielski    if ($name =~ /NEW_VERSION$/)
166*b1cdbd2cSJim Jagielski    {
167*b1cdbd2cSJim Jagielski	$value = incrementNewVersion($value);
168*b1cdbd2cSJim Jagielski    }
169*b1cdbd2cSJim Jagielski    elsif ($name =~ /OLD_VERSION$/)
170*b1cdbd2cSJim Jagielski    {
171*b1cdbd2cSJim Jagielski	$value = incrementOldVersion($value);
172*b1cdbd2cSJim Jagielski    }
173*b1cdbd2cSJim Jagielski    elsif ($name =~ /POLICY_VERSION$/)
174*b1cdbd2cSJim Jagielski    {
175*b1cdbd2cSJim Jagielski	$value = incrementPolicyVersion($value);
176*b1cdbd2cSJim Jagielski    }
177*b1cdbd2cSJim Jagielski    else
178*b1cdbd2cSJim Jagielski    {
179*b1cdbd2cSJim Jagielski	#other name which we ignore
180*b1cdbd2cSJim Jagielski	return $line;
181*b1cdbd2cSJim Jagielski    }
182*b1cdbd2cSJim Jagielski    return "${name}=${value}\n";
183*b1cdbd2cSJim Jagielski}
184*b1cdbd2cSJim Jagielski
185*b1cdbd2cSJim Jagielski#The value of a new version has the form x.x.x.x
186*b1cdbd2cSJim Jagielski#We increment the third position from the left.
187*b1cdbd2cSJim Jagielski#Te argument must already be trimmed.
188*b1cdbd2cSJim Jagielskisub incrementNewVersion($)
189*b1cdbd2cSJim Jagielski{
190*b1cdbd2cSJim Jagielski   my @parts = split /\./,$_[0];
191*b1cdbd2cSJim Jagielski   if (scalar @parts != 4)
192*b1cdbd2cSJim Jagielski   {
193*b1cdbd2cSJim Jagielski       print "Error, no valid version given in $ARGV[0]\n. A 'new version' has four parts.";
194*b1cdbd2cSJim Jagielski       exit -1;
195*b1cdbd2cSJim Jagielski   }
196*b1cdbd2cSJim Jagielski   $parts[2]++;
197*b1cdbd2cSJim Jagielski   #build the version string and return
198*b1cdbd2cSJim Jagielski   return "$parts[0].$parts[1].$parts[2].$parts[3]";
199*b1cdbd2cSJim Jagielski}
200*b1cdbd2cSJim Jagielski
201*b1cdbd2cSJim Jagielski#The value of a new version has the form x.x.x.x-x.x.x.x
202*b1cdbd2cSJim Jagielski#We increment the third position of the second part.
203*b1cdbd2cSJim Jagielski#Te argument must already be trimmed.
204*b1cdbd2cSJim Jagielskisub incrementOldVersion($)
205*b1cdbd2cSJim Jagielski{
206*b1cdbd2cSJim Jagielski    my @parts = split /[\.-]/,$_[0];
207*b1cdbd2cSJim Jagielski    if (scalar @parts != 8)
208*b1cdbd2cSJim Jagielski    {
209*b1cdbd2cSJim Jagielski	print "Error, no valid version given in $ARGV[0]\n. A 'old version' has the form
210*b1cdbd2cSJim Jagielskix.x.x.x-x.x.x.x\n.";
211*b1cdbd2cSJim Jagielski	exit -1;
212*b1cdbd2cSJim Jagielski    }
213*b1cdbd2cSJim Jagielski    $parts[6]++;
214*b1cdbd2cSJim Jagielski    return "$parts[0].$parts[1].$parts[2].$parts[3]-$parts[4].$parts[5].$parts[6].$parts[7]";
215*b1cdbd2cSJim Jagielski    return $_[0];
216*b1cdbd2cSJim Jagielski}
217*b1cdbd2cSJim Jagielski
218*b1cdbd2cSJim Jagielskisub incrementPolicyVersion($)
219*b1cdbd2cSJim Jagielski{
220*b1cdbd2cSJim Jagielski   my @parts = split /\./,$_[0];
221*b1cdbd2cSJim Jagielski   if (scalar @parts != 4)
222*b1cdbd2cSJim Jagielski   {
223*b1cdbd2cSJim Jagielski       print "Error, no valid version given in $ARGV[0]\n. A 'policy version' has four parts.";
224*b1cdbd2cSJim Jagielski       exit -1;
225*b1cdbd2cSJim Jagielski   }
226*b1cdbd2cSJim Jagielski   $parts[0]++;
227*b1cdbd2cSJim Jagielski   #build the version string and return
228*b1cdbd2cSJim Jagielski   return "$parts[0].$parts[1].$parts[2].$parts[3]";
229*b1cdbd2cSJim Jagielski}
230*b1cdbd2cSJim Jagielski
231*b1cdbd2cSJim Jagielski
232*b1cdbd2cSJim Jagielskisub readIncVersions($)
233*b1cdbd2cSJim Jagielski{
234*b1cdbd2cSJim Jagielski    open INC, $_[0] or die "Could not open $_[0] $!";
235*b1cdbd2cSJim Jagielski    my $arg = $_[0];
236*b1cdbd2cSJim Jagielski    my @names;
237*b1cdbd2cSJim Jagielski
238*b1cdbd2cSJim Jagielski    while(<INC>)
239*b1cdbd2cSJim Jagielski    {
240*b1cdbd2cSJim Jagielski	chomp;
241*b1cdbd2cSJim Jagielski	#Skip empty lines
242*b1cdbd2cSJim Jagielski	my $line;
243*b1cdbd2cSJim Jagielski	if (length($line = trim($_)) == 0) {
244*b1cdbd2cSJim Jagielski	    next;
245*b1cdbd2cSJim Jagielski	}
246*b1cdbd2cSJim Jagielski	#Skip comment symbol: #
247*b1cdbd2cSJim Jagielski	if ($line =~ /^#/) {
248*b1cdbd2cSJim Jagielski	    next;
249*b1cdbd2cSJim Jagielski	}
250*b1cdbd2cSJim Jagielski	if (!checkName($line)) {
251*b1cdbd2cSJim Jagielski	    print "Wrong entry in file $_[0]\n", $sNameForm;
252*b1cdbd2cSJim Jagielski	    exit -1;
253*b1cdbd2cSJim Jagielski	}
254*b1cdbd2cSJim Jagielski	push @names, $line;
255*b1cdbd2cSJim Jagielski    }
256*b1cdbd2cSJim Jagielski    print "No entries found in $arg\n" if(scalar @names == 0);
257*b1cdbd2cSJim Jagielski    return @names;
258*b1cdbd2cSJim Jagielski}
259*b1cdbd2cSJim Jagielski
260*b1cdbd2cSJim Jagielski#The argument must already be trimmed
261*b1cdbd2cSJim Jagielski#returns 1 if ok
262*b1cdbd2cSJim Jagielskisub checkName($)
263*b1cdbd2cSJim Jagielski{
264*b1cdbd2cSJim Jagielski    my $name = $_[0];
265*b1cdbd2cSJim Jagielski    if ( $name !~/NEW_VERSION$|OLD_VERSION$|POLICY_VERSION$/) {
266*b1cdbd2cSJim Jagielski	return 0;
267*b1cdbd2cSJim Jagielski    }
268*b1cdbd2cSJim Jagielski    return 1;
269*b1cdbd2cSJim Jagielski}
270*b1cdbd2cSJim Jagielski
271*b1cdbd2cSJim Jagielskisub trim($)
272*b1cdbd2cSJim Jagielski{
273*b1cdbd2cSJim Jagielski	my $string = shift;
274*b1cdbd2cSJim Jagielski	$string =~ s/^\s+//;
275*b1cdbd2cSJim Jagielski	$string =~ s/\s+$//;
276*b1cdbd2cSJim Jagielski	return $string;
277*b1cdbd2cSJim Jagielski}
278