handle alpha versions better in bump script
[p5sagit/Distar.git] / helpers / bump-version
1 #!/usr/bin/env perl
2
3 use strict;
4 use warnings FATAL => 'all';
5 use File::Find;
6
7 sub version_parts {
8   my $version = shift;
9   my $dotted = $version =~ s/^v//;
10   my @parts = split /\./, $version;
11   if (!$dotted && @parts == 2) {
12     my $dec = pop @parts;
13     $dec =~ s/_//g;
14     push @parts, $dec =~ /(\d{1,3})/g;
15   }
16   $_ += 0 for @parts;
17   push @parts, 0
18     until @parts >= 3;
19   return @parts;
20 }
21
22 my $old_version = shift;
23
24 my %bump_part = (major => 0, minor => 1, bugfix => 2);
25 my $bump_this = $bump_part{$ARGV[0]||'bugfix'};
26
27 my $new_vstring;
28 my $new_decimal;
29
30 if (defined $bump_this) {
31   my @new_parts = version_parts($old_version);
32   $new_parts[$bump_this]++;
33   $new_parts[$_] = 0 for ($bump_this+1 .. $#new_parts);
34   $new_vstring = join('.', @new_parts);
35   my $alpha_pos = index($old_version, '_');
36   my $format = '%i.' . ( '%03i' x (@new_parts - 1) );
37   $new_decimal = sprintf($format, @new_parts);
38   substr $new_decimal, $alpha_pos, 0, '_'
39     if $alpha_pos != -1;
40 }
41 elsif ($ARGV[0] =~ /^v?[0-9]+(?:[._][0-9]+)*$/) {
42   $new_decimal = $ARGV[0];
43   $new_vstring = join('.', version_parts($new_decimal));
44 }
45 else {
46   die "no idea which part to bump - $ARGV[0] means nothing to me"
47 }
48
49 warn "Bumping $old_version -> $new_decimal\n";
50
51 my %files;
52 find({
53   no_chdir => 1,
54   wanted => sub {
55     return
56       unless -f && /\.pod$|\.pm$/;
57     my $file = $_;
58     open my $fh, '<', $file
59       or die "can't open $file: $!";
60     my $content = do { local $/; <$fh> };
61     close $fh;
62
63     $content =~ s{
64       ( \$VERSION \s* = \s* )
65       (['"]?) v?([0-9]+(?:[._][0-9]+)*) \2
66       ( \s*; )
67       (?:
68         (\s*\#\s*)
69         v?[.0-9]+
70       )?
71     }{
72       die "unable to bump version number in $file from $old_version, found $3\n"
73         if $3 ne $old_version;
74       $1 . "'" . $new_decimal . "'" . $4 . ($5 ? $5 . $new_vstring : '')
75     }xe
76       or return;
77
78     $files{$file} = $content;
79   },
80 }, 'lib');
81
82 for my $file (sort keys %files) {
83   warn "    updating $file\n";
84   open my $fh, '>', $file
85     or die "can't open $file: $!";
86   print { $fh } $files{$file};
87   close $fh;
88 }