This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
eliminate PL_reg_maxiter, PL_reg_leftiter
[perl5.git] / Porting / bump-perl-version
index 2023ff8..f2f5bcc 100644 (file)
@@ -26,6 +26,9 @@
 #     $ Porting/bump-perl-version -u < /tmp/scan
 #
 # (so line 52 of Porting/config.sh is now updated)
+#
+# The -i option can be used to combine these two steps (if you prefer to make
+# all of the changes at once and then edit the results via git).
 
 # This utility 'knows' about certain files and formats, and so can spot
 # 'hidden' version numbers, like PERL_SUBVERSION=9.
@@ -40,7 +43,7 @@
 #
 # Note there are various files and directories that it skips; these are
 # ones that are unlikely to contain anything needing bumping, but which
-# will generate lots fo false positives (eg pod/*). These are listed on
+# will generate lots of false positives (eg pod/*). These are listed on
 # STDERR as they are skipped.
 
 use strict;
@@ -57,6 +60,7 @@ sub usage { die <<EOF }
 usage: $0 -c <C.C.C>
           -s <C.C.C> <N.N.N>
          -u
+         -i <C.C.C> <N.N.N>
 
     -c check files and warn if any known string values (eg
        PERL_SUBVERSION) don't match the specified version
@@ -65,12 +69,14 @@ usage: $0 -c <C.C.C>
 
     -u read in the scan file from stdin, and change all the lines specified
 
+    -i scan files and make changes inplace
+
     C.C.C the current perl version, eg 5.10.0
     N.N.N the new     perl version, eg 5.10.1
 EOF
 
 my %opts;
-getopts('csu', \%opts) or usage;
+getopts('csui', \%opts) or usage;
 if ($opts{u}) {
     @ARGV == 0 or usage('no version version numbers should be specified');
     # fake to stop warnings when calculating $oldx etc
@@ -83,7 +89,7 @@ elsif ($opts{c}) {
 else {
     @ARGV == 2 or usage('require two version numbers');
 }
-usage('only one of -c, -s and -u') if keys %opts > 1;
+usage('only one of -c, -s, -u and -i') if keys %opts > 1;
 
 my ($oldx, $oldy, $oldz) = $ARGV[0] =~ /^(\d+)\.(\d+)\.(\d+)$/
        or usage("bad version: $ARGV[0]");
@@ -180,7 +186,7 @@ my @maps =  (
        qr{\b ((?:lib)?) perl (\d\d\d) (s?) \b }x,
        sub {$2, "$1perl$newx$newy$3" },
        "$oldx$oldy",
-       qr/makedef|win32|hints/,      # makedef.pl, README.win32, win32/*, hints/*
+       qr/win32|hints/,      # README.win32, win32/*, hints/*
     ],
 
     # microperl locations should be bumped for major versions
@@ -199,12 +205,14 @@ my @maps =  (
 my %SKIP_FILES = map { ($_ => 1) } qw(
     Changes
     MANIFEST
+    Porting/Maintainers.pl
+    Porting/acknowledgements.pl
+    Porting/corelist-perldelta.pl
     Porting/epigraphs.pod
     Porting/how_to_write_a_perldelta.pod
     Porting/release_managers_guide.pod
     Porting/release_schedule.pod
     Porting/bump-perl-version
-    pod.lst
     pp_ctl.c
 );
 my @SKIP_DIRS = qw(
@@ -219,7 +227,7 @@ my @mani_files = sort keys %{ExtUtils::Manifest::maniread('MANIFEST')};
 my %mani_files = map { ($_ => 1) } @mani_files;
 die "No entries found in MANIFEST; aborting\n" unless @mani_files;
 
-if ($opts{c} or $opts{s}) {
+if ($opts{c} or $opts{s} or $opts{i}) {
     do_scan();
 }
 elsif ($opts{u}) {
@@ -242,30 +250,45 @@ sub do_scan {
        }
        open my $fh, '<', $file;
        my $header = 0;
+       my @stat = stat $file;
+       my $mode = $stat[2];
+       my $file_changed = 0;
+       my $new_contents = '';
 
-       while (<$fh>) {
+       while (my $line = <$fh>) {
+           my $oldline = $line;
            for my $map (@maps) {
                my ($pat, $sub, $expected, $file_pat) = @$map;
 
                next if defined $file_pat and $file !~ $file_pat;
-               next unless $_ =~ $pat;
+               next unless $line =~ $pat;
                my ($got, $replacement) = $sub->();
 
                if ($opts{c}) {
                    # only report unexpected 
                    next unless defined $expected and $got ne $expected;
                }
-               my $newstr = $_;
-               $newstr =~ s/$pat/$replacement/
+               $line =~ s/$pat/$replacement/
                    or die "Internal error: substitution failed: [$pat]\n";
-               if ($_ ne $newstr) {
+           }
+           $new_contents .= $line if $opts{i};
+           if ($line ne $oldline) {
+               $file_changed = 1;
+               if ($opts{s}) {
                    print "\n$file\n" unless $header;
                    $header=1;
-                   printf "\n%5d: -%s       +%s", $., $_, $newstr;
+                   printf "\n%5d: -%s       +%s", $., $oldline, $line;
                }
-               last;
            }
        }
+       if ($opts{i} && $file_changed) {
+           warn "Updating $file inplace\n";
+           open my $fh, '>', $file;
+           binmode $fh;
+           print $fh $new_contents;
+           close $fh;
+           chmod $mode & 0777, $file;
+       }
     }
     warn "(skipped  $_/*)\n" for @SKIP_DIRS;
 }