X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=helpers%2Fbump-version;h=5373656fbb4c600c6be43ef14a33a7555c7a0026;hb=eb3aeb36f8f5c565e3000d04f32d43c1cb8fbd15;hp=6b60641bdb75a964910ee235ee740795d95c8900;hpb=176acdb4ab02a4618006bac38124bd83d825ccd6;p=p5sagit%2FDistar.git diff --git a/helpers/bump-version b/helpers/bump-version index 6b60641..5373656 100755 --- a/helpers/bump-version +++ b/helpers/bump-version @@ -3,18 +3,28 @@ 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; +my $old_version = shift + or die "no old version provided!\n"; +my $bump = shift; my ($new_decimal, $new_vstring) = bump_version($old_version, $bump); 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 --quiet --cached HEAD") { @@ -23,7 +33,7 @@ if ($git) { for (`git ls-files`) { chomp; next - unless /^lib\/.*\.(?:pod|pm)$/ || /^Makefile\.PL$/; + unless /$file_match/; $files{$_} = `git show HEAD:"$_"`; } } @@ -34,13 +44,13 @@ else { 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{ @@ -54,7 +64,7 @@ my $FILE_RE = qr{ (.*)$ }x; my $MAKE_RE = qr{ - (^.* version \s* => \s* ) + (^.* ['"]?version['"] \s* => \s* ) (['"]?) v?([0-9]+(?:[._][0-9]+)*) \2 ( \s*, ) (?: @@ -74,7 +84,7 @@ for my $file (sort keys %files) { 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"; @@ -116,33 +126,47 @@ sub version_parts { 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;