#!/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_version = ""; my $x_yyyzzz_version = ""; if ( $version =~ m/^(\d+)\.(\d+)\.(\d+)$/ ) { $x_yyyzzz_version = sprintf( "%d.%03d%03d", $1, $2, $3 ); $x_y_z_version = $version; } elsif ( $version =~ m/^(\d+)\.(\d\d\d)(\d\d\d)$/ ) { $x_y_z_version = sprintf( "%d.%d.%d", $1, $2, $3 ); $x_yyyzzz_version = $version; } else { die "Unknown version syntax. Try X.Y.Z or X.YYYZZZ\n"; } print "Using version: $x_y_z_version ( $x_yyyzzz_version )\n"; my $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/XSLoader::load\( 'Lucy', '(.+?)'/XSLoader::load\( 'Lucy', '$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 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"; write_file( 'core/Lucy.cfp', $buf ); # Update temporary hack in CFCParcel. $buf = read_file('clownfish/src/CFCParcel.c'); $buf =~ s/"v\d\.\d\.\d"/"v$x_y_z_version"/ or die "no match"; write_file( 'clownfish/src/CFCParcel.c', $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'; # 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"; } 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