The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/freeware/bin/perl -w
use strict;
require 5.005;
use vars qw($VERSION $package_name $package_version $package_file);
use Getopt::Long;
use Pod::Usage;
use IO;
use File::Temp qw(tempfile);
use File::Copy;
use AtExit;
$VERSION = sprintf('%d.%02d', q{ $Revision: 1.2 $ } =~ /(\d+)\.(\d+)/);

# command line processing
Getopt::Long::Configure('no_ignore_case');
GetOptions(
    'package=s' => \$package_name,
    'version=s' => \$package_version,
    'pm-file=s' => \$package_file,
    'Version'   => sub { print $VERSION, "\n"; exit 0; },
    'help|?'    => sub { pod2usage(exitval => 0, verbose => 1) }, # SYNOPSIS, OPTIONS and ARGUMENTS
    'man'       => sub { pod2usage(exitval => 0, verbose => 2) }, # whole manpage
) or pod2usage(verbose => 2);
defined($package_name)    or pod2usage(msg => "ERROR: no package name specified");
defined($package_version) or pod2usage(msg => "ERROR: no package version specified");
defined($package_file)    or pod2usage(msg => "ERROR: no .pm file specified");

# copy the pm-file to a temporary file, inserting the package version where needed
my $f_in = new IO::File;
$f_in->open("<$package_file") or die "Cannot read `$package_file': $!\n";
my ($f_tmp,$tmpname) = tempfile("tmpfileXXXXX");
atexit(sub { unlink $tmpname }, "removes temporary file `$tmpname'");
my $pkg_hits = 0;
while(<$f_in>) {
    print $f_tmp $_;
    if(/^package\s+$package_name\;/o && $pkg_hits++ == 0) { # first occurence of the package declaration
	print $f_tmp "*VERSION = \\\'$package_version\'; #'\n"; # writes an unmodifiable $VERSION
    }
}
close($f_in);
close($f_tmp);
$pkg_hits > 0 or die "No such package `$package_name' declared in file `$package_file'.\n";

# overwrite the original package file
copy($tmpname,$package_file) or die "Copying of `$tmpname' to `$package_file' failed: $!\n";

__END__

=head1 NAME

add_pm_version_number.pl - utility to add a version number to Perl modules

=head1 SYNOPSIS

    add_pm_version_number.pl --package=<string> --version=<string> --pm-file=<file>
          [--help] [-?] [--man] [--Version]

Runs through the pm-file and adds the requested $VERSION line after the 1st
declaration of the package.

=head1 OPTIONS

Following options and unique abbreviations of them are accepted:

=over 4

=item B<--package>

name of the package for which the version number needs to be added

=item B<--version>

string with the version number that needs to be added

=item B<--pm-file>

name of the perl module in which the version number will be added

=item B<--help> or B<-?>

prints a brief help message and exits

=item B<--man>

prints an extended help message and exits

=item B<--Version>

prints the version number and exits

=back

=head1 ARGUMENTS

No arguments are accepted. All needed parameters are passed as options.

=head1 RELEASE

$Id: add_pm_version_number.pl,v 1.2 2000/11/07 15:17:19 verhaege Exp $

=head1 AUTHOR

Wim Verhaegen E<lt>wim.verhaegen@ieee.orgE<gt>

=cut