add version bumping make targets
[p5sagit/Distar.git] / helpers / bump-version
CommitLineData
8ab5ea70 1#!/usr/bin/env perl
2
3use strict;
4use warnings FATAL => 'all';
5use File::Find;
6
7sub 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
19chomp(my $LATEST = qx(grep '^[0-9]' Changes | head -1 | awk '{print \$1}'));
20
21my @parts = version_parts($LATEST);
22
23my $OLD_DECIMAL = sprintf('%i.%03i%03i', @parts);
24
25my %bump_part = (major => 0, minor => 1, bugfix => 2);
26
27my @new_parts = @parts;
28
29my $bump_this = $bump_part{$ARGV[0]||'bugfix'};
30
31if (defined $bump_this) {
32 $new_parts[$bump_this]++;
33 $new_parts[$_] = 0 for ($bump_this+1 .. $#new_parts);
34}
35elsif ($ARGV[0] =~ /^[0-9]+(?:\.[0-9]+)*$/) {
36 @new_parts = version_parts($ARGV[0]);
37}
38else {
39 die "no idea which part to bump - $ARGV[0] means nothing to me"
40}
41
42my $NEW_DECIMAL = sprintf('%i.%03i%03i', @new_parts);
43
44warn "Bumping $OLD_DECIMAL -> $NEW_DECIMAL\n";
45my $vstring = join('.', @parts);
46
47my %files;
48find({
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
80for 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}