die with missing old version
[p5sagit/Distar.git] / helpers / bump-version
index 89fac0c..5373656 100755 (executable)
@@ -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";
@@ -120,30 +130,43 @@ sub version_parts {
     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;