#!/usr/bin/env perl # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. use strict; use warnings; use FindBin qw( $Bin ); use File::Find; # make sure we are at the top-level dir if ( !-d 'perl' and !-d 'core' ) { chdir("$Bin/../../"); } my $usage = "$0 version\n"; my $version = shift(@ARGV) or die $usage; # standardize version strings my ( $x, $y, $z ); if ( $version =~ m/^(\d+)\.(\d+)\.(\d+)$/ ) { ( $x, $y, $z ) = ( $1, $2, $3 ); } elsif ( $version =~ m/^(\d+)\.(\d\d\d)(\d\d\d)$/ ) { ( $x, $y, $z ) = ( int($1), int($2), int($3) ); } else { die "Unknown version syntax. Try X.Y.Z or X.YYYZZZ\n"; } my $x_y_z_version = sprintf( "%d.%d.%d", $x, $y, $z ); my $x_yyyzzz_version = sprintf( "%d.%03d%03d", $x, $y, $z ); print "Using version: $x_y_z_version ( $x_yyyzzz_version )\n"; my $buf; # Update charmonizer. for my $path ('common/charmonizer.c', 'common/charmonizer.main') { $buf = read_file($path); $buf =~ s/(lucy_version\[\]\s+=\s+)"[\d.]+"/$1"$x_y_z_version"/ or die "no match"; $buf =~ s/(lucy_major_version\[\]\s+=\s+)"[\d.]+"/$1"$x.$y"/ or die "no match"; $buf =~ s/(cfish_lib_name\s+=\s+)"cfish-[\d.]+"/$1"cfish-$x.$y"/ or die "no match"; write_file($path, $buf); } # Update Lucy.pm. $buf = read_file('perl/lib/Lucy.pm'); $buf =~ s/(our \$VERSION\ +=\ +)'.+?'/$1'$x_yyyzzz_version'/g or die "no match"; $buf =~ s/(bootstrap\s+Lucy\s+)'[\d\.]+'/$1'$x_y_z_version'/ or die "no match"; write_file( 'perl/lib/Lucy.pm', $buf ); # Update Lucy.pod. $buf = read_file('perl/lib/Lucy.pod'); $buf =~ s/(^=head1\s+VERSION\s+)([\d.]+)/$1$x_y_z_version/m or die "no match"; write_file( 'perl/lib/Lucy.pod', $buf ); # Update Build.PL $buf = read_file('perl/Build.PL'); $buf =~ s/(dist_version\ +=>\ +)'.+?'/$1'$x_y_z_version'/ or die "no match"; write_file( 'perl/Build.PL', $buf ); # Update ruby/apache_lucy.gemspec $buf = read_file('ruby/apache_lucy.gemspec'); $buf =~ s/(spec\.version\s+=\s+)'.+?'/$1'$x_y_z_version'/ or die "no match"; write_file( 'ruby/apache_lucy.gemspec', $buf ); # Update ruby/lib/apache_lucy.rb $buf = read_file('ruby/lib/apache_lucy.rb'); $buf =~ s/(VERSION\s+=\s+)'.+?'/$1'$x_y_z_version'/ or die "no match"; write_file( 'ruby/lib/apache_lucy.rb', $buf ); # Update Lucy.cfp. $buf = read_file('core/Lucy.cfp'); $buf =~ s/("version":\s+)"v\d+\.\d+\.\d+"/$1"v$x_y_z_version"/ or die "no match"; $buf =~ s/("Clownfish":\s+)"v\d+\.\d+\.\d+"/$1"v$x_y_z_version"/ or die "no match"; write_file( 'core/Lucy.cfp', $buf ); # Update TestLucy.cfp $buf = read_file('core/TestLucy.cfp'); $buf =~ s/("version":\s+)"v\d+\.\d+\.\d+"/$1"v$x_y_z_version"/ or die "no match"; $buf =~ s/("Clownfish":\s+)"v\d+\.\d+\.\d+"/$1"v$x_y_z_version"/ or die "no match"; $buf =~ s/("Lucy":\s+)"v\d+\.\d+\.\d+"/$1"v$x_y_z_version"/ or die "no match"; write_file( 'core/TestLucy.cfp', $buf ); # Update all other Perl modules. find sub { return unless /[.]pm$/; my $name = $_; return if $name eq 'Lucy.pm'; my $buf = read_file($name); $buf =~ s/(our \$VERSION\ +=\ +)'.+?'/$1'$x_yyyzzz_version'/g or die "no match in $File::Find::name"; write_file($name, $buf); }, 'perl'; # Update c/install.sh $buf = read_file('c/install.sh'); $buf =~ s/\bversion=[\d.]+/version=$x_y_z_version/ or die "no match"; $buf =~ s/\bmajor_version=[\d.]+/major_version=$x.$y/ or die "no match"; write_file( 'c/install.sh', $buf ); # utility functions sub read_file { my ($file) = @_; local $/; open( F, "< $file" ) or die "Cannot read $file: $!\n"; my $buf = ; close(F) or die "Cannot close $file: $!\n"; return $buf; } sub write_file { my ( $file, $buf ) = @_; open( F, "> $file" ) or die "Cannot write $file: $!\n"; print F $buf; close(F) or die "Cannot close $file: $!\n"; } print "Done. Consider running git grep to search for the old version.\n"; exit(); __END__ =head1 NAME update_version - update Lucy version strings in source files =head1 SYNOPSIS perl devel/bin/update_version version =head1 DESCRIPTION Updates key source files with I, using correct syntax depending on the file format and type. I may be specified in either format: X.Y.Z X.YYYZZZ and update_version will convert the specified string into the correct format for each relevant file. =cut