GetOptions(
"git" => \my $git,
"force" => \my $force,
+ 'n|dry-run' => \my $dry_run,
) 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";
+warn "Bumping $old_version -> $new_decimal" . ($new_decimal ne $new_vstring ? " ($new_vstring)" : '') . "\n";
-my $file_match = qr{^(?:
+my $file_match = qr{
Makefile\.PL
|lib[/\\].*\.(?:pod|pm)
|bin[/\\].*
|script[/\\].*
-)$}x;
+}x;
+
+my $dir_match = qr{
+ (?:
+ .
+ |lib
+ |bin
+ |script
+ )
+ (?:[/\\]|$)
+}x;
my %files;
if ($git) {
for (`git ls-files`) {
chomp;
next
- unless /$file_match/;
+ unless /^$file_match$/;
$files{$_} = `git show HEAD:"$_"`;
}
}
find({
no_chdir => 1,
wanted => sub {
- next
+ my $fn = File::Spec->abs2rel($_, '.');
+ if (-d && $fn !~ /^$dir_match$/) {
+ $File::Find::prune = 1;
+ return;
+ }
+ return
unless -f;
- next
- unless /(?:\.[\/\\])?$file_match/;
- open my $fh, '<', $_
- or die "can't open $_: $!";
- $files{$_} = do { local $/; <$fh> };
+ return
+ unless $fn =~ /^$file_match$/;
+ open my $fh, '<', $fn
+ or die "can't open $fn: $!";
+ $files{$fn} = do { local $/; <$fh> };
close $fh;
},
}, '.');
my $patch = '';
for my $file (sort keys %files) {
- my $content = $files{$file};
- my $file_diff = '';
- my $re = $file eq 'Makefile.PL' ? $MAKE_RE : $FILE_RE;
- my @lines = split /\r?\n/, $content;
- for my $ln (0 .. $#lines) {
- my $line = $lines[$ln];
- if ($lines[$ln] =~ $re) {
- die "unable to bump version number in $file from $old_version, found $3\n"
- 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";
+ eval {
+ my $content = $files{$file};
+ my $file_diff = '';
+ my $re = $file eq 'Makefile.PL' ? $MAKE_RE : $FILE_RE;
+ my @lines = split /\r?\n/, $content;
+ for my $ln (0 .. $#lines) {
+ my $line = $lines[$ln];
+ if ($lines[$ln] =~ $re) {
+ die "unable to bump version number in $file from $old_version, found $3\n"
+ 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";
@@ -@{[ $ln ]},3 +@{[ $ln ]},3 @@
$lines[$ln-1]
-$lines[$ln]
+$new_line
$lines[$ln+1]
END_DIFF
+ }
}
- }
- if ($file_diff) {
- $patch .= <<"END_HEADER" . $file_diff;
+ if ($file_diff) {
+ $patch .= <<"END_HEADER" . $file_diff;
--- a/$file
+++ b/$file
END_HEADER
- }
+ }
+ 1;
+ } or $dry_run ? warn($@) : die($@);
}
+if ($dry_run) {
+ print $patch;
+ exit;
+}
my ($fh, $file) = File::Temp::tempfile( "bump-version-XXXXXX", TMPDIR => 1 );
print { $fh } $patch;
close $fh;
if (defined $bump_this) {
if ($version =~ /^v/ || ($version =~ tr/.//) > 1) {
+ my $v = $version =~ /^(v)/ ? $1 : '';
my @parts = version_parts($version);
+ $bump_this += @parts
+ if $bump_this < 0;
+ $parts[$_] = 0 for $bump_this+1 .. $#parts;
+ $parts[$_] = 0 for $#parts+1 .. $bump_this;
$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;
+ $new_decimal = $new_vstring = $v . join '.', @parts;
}
else {
my $alpha_pos = index($version, '_');