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