use strict;
use warnings FATAL => 'all';
use File::Find;
-use Getopt::Long qw(:config gnu_compat);
+use Getopt::Long qw(:config gnu_getopt);
use File::Temp ();
GetOptions(
"git" => \my $git,
+ "force" => \my $force,
) or die("Error in command line arguments\n");
my ($old_version, $bump) = @ARGV;
warn "Bumping $old_version -> $new_decimal\n";
+my $file_match = qr{^(?:
+ Makefile\.PL
+ |lib[/\\].*\.(?:pod|pm)
+ |bin[/\\].*
+ |script[/\\].*
+)$}x;
+
my %files;
if ($git) {
- if (system "git diff --cached HEAD") {
+ if (system "git diff --quiet --cached HEAD") {
die "Staged changes!\n";
}
for (`git ls-files`) {
chomp;
next
- unless /^lib\/.*\.(?:pod|pm)$/ || /^Makefile\.PL$/;
+ unless /$file_match/;
$files{$_} = `git show HEAD:"$_"`;
}
}
next
unless -f;
next
- unless /^lib\/.*\.(?:pod|pm)$/ || /^Makefile\.PL$/;
+ unless /(?:\.[\/\\])?$file_match/;
open my $fh, '<', $_
or die "can't open $_: $!";
$files{$_} = do { local $/; <$fh> };
close $fh;
},
- }, 'lib');
+ }, '.');
}
my $FILE_RE = qr{
(.*)$
}x;
my $MAKE_RE = qr{
- (^.* version \s* => \s* )
+ (^.* ['"]?version['"] \s* => \s* )
(['"]?) v?([0-9]+(?:[._][0-9]+)*) \2
( \s*, )
(?:
my $line = $lines[$ln];
if ($lines[$ln] =~ $re) {
die "unable to bump version number in $file from $old_version, found $3\n"
- if $3 ne $old_version;
+ if !$force && $3 ne $old_version;
my $comment = ($5 ? $5 . $new_vstring : '');
my $new_line = "$1'$new_decimal'$4$comment$6";
$file_diff .= <<"END_DIFF";
if (!$dotted && @parts == 2) {
my $dec = pop @parts;
$dec =~ s/_//g;
+ $dec .= "0" x ((- length $dec) % 3);
push @parts, $dec =~ /(\d{1,3})/g;
}
$_ += 0 for @parts;
- push @parts, 0
- until @parts >= 3;
return @parts;
}
sub bump_version {
- my ($old_version, $new) = @_;
+ my ($version, $new) = @_;
- my %bump_part = (major => 0, minor => 1, bugfix => 2);
- my $bump_this = $bump_part{$new||'bugfix'};
+ my %bump_part = (major => 0, minor => 1, bugfix => 2, last => -1);
+ my $bump_this = $bump_part{$new||'last'};
my $new_vstring;
my $new_decimal;
if (defined $bump_this) {
- my @new_parts = version_parts($old_version);
- $new_parts[$bump_this]++;
- $new_parts[$_] = 0 for ($bump_this+1 .. $#new_parts);
- $new_vstring = join('.', @new_parts);
- my $alpha_pos = index($old_version, '_');
- my $format = '%i.' . ( '%03i' x (@new_parts - 1) );
- $new_decimal = sprintf($format, @new_parts);
- substr $new_decimal, $alpha_pos, 0, '_'
- if $alpha_pos != -1;
+ if ($version =~ /^v/ || ($version =~ tr/.//) > 1) {
+ my @parts = version_parts($version);
+ $parts[$bump_this]++;
+ $parts[$_] = 0 for (($bump_this < 0 ? @parts : 0)+$bump_this+1 .. $#parts);
+ $_ += 0
+ for @parts;
+ $new_vstring = join '.', @parts;
+ my $format = '%i.'. join '', map { '%03i' } @parts[1 .. $#parts];
+ $new_decimal = sprintf $format, @parts;
+ }
+ else {
+ my $alpha_pos = index($version, '_');
+ $version =~ s/_//g;
+ $version =~ s/^(\d+)\.//;
+ my @parts = $1;
+ push @parts, $version =~ /(\d{1,3})/g;
+ my $format = '%i.'.join '', map { '%0'.length($_).'i' } @parts[1 .. $#parts];
+ $parts[$bump_this]++;
+ $parts[$_] = 0 for (($bump_this < 0 ? @parts : 0)+$bump_this+1 .. $#parts);
+ $new_decimal = sprintf $format, @parts;
+ substr $new_decimal, $alpha_pos, 0, '_'
+ if $alpha_pos != -1;
+ $new_vstring = join '.', version_parts($new_decimal);
+ }
}
elsif ($new =~ /^v?[0-9]+(?:[._][0-9]+)*$/) {
$new_decimal = $new;