1898184e3Ssthen#!/usr/bin/env perl 2898184e3Ssthen 391f110e0Safresh1=head1 NAME 491f110e0Safresh1 591f110e0Safresh1Porting/sync-with-cpan - Synchronize with CPAN distributions 691f110e0Safresh1 791f110e0Safresh1=head1 SYNOPSIS 891f110e0Safresh1 991f110e0Safresh1 perl Porting/sync-with-cpan <module> 1091f110e0Safresh1 1191f110e0Safresh1where <module> is the name it appears in the C<%Modules> hash 1291f110e0Safresh1of F<Porting/Maintainers.pl> 1391f110e0Safresh1 1491f110e0Safresh1=head1 DESCRIPTION 1591f110e0Safresh1 1691f110e0Safresh1Script to help out with syncing cpan distros. 1791f110e0Safresh1 1891f110e0Safresh1Does the following: 1991f110e0Safresh1 2091f110e0Safresh1=over 4 2191f110e0Safresh1 2291f110e0Safresh1=item * 2391f110e0Safresh1 2491f110e0Safresh1Fetches the package list from CPAN. Finds the current version of the given 2591f110e0Safresh1package. [1] 2691f110e0Safresh1 2791f110e0Safresh1=item * 2891f110e0Safresh1 2991f110e0Safresh1Downloads the relevant tarball; unpacks the tarball. [1] 3091f110e0Safresh1 3191f110e0Safresh1=item * 3291f110e0Safresh1 3391f110e0Safresh1Clean out the old directory (C<git clean -dfx>) 3491f110e0Safresh1 3591f110e0Safresh1=item * 3691f110e0Safresh1 3791f110e0Safresh1Moves the old directory out of the way, moves the new directory in place. 3891f110e0Safresh1 3991f110e0Safresh1=item * 4091f110e0Safresh1 4191f110e0Safresh1Restores any F<.gitignore> file. 4291f110e0Safresh1 4391f110e0Safresh1=item * 4491f110e0Safresh1 4591f110e0Safresh1Removes files from C<@IGNORE> and C<EXCLUDED> 4691f110e0Safresh1 4791f110e0Safresh1=item * 4891f110e0Safresh1 4991f110e0Safresh1C<git add> any new files. 5091f110e0Safresh1 5191f110e0Safresh1=item * 5291f110e0Safresh1 5391f110e0Safresh1C<git rm> any files that are gone. 5491f110e0Safresh1 5591f110e0Safresh1=item * 5691f110e0Safresh1 5791f110e0Safresh1Remove the +x bit on files in F<t/> 5891f110e0Safresh1 5991f110e0Safresh1=item * 6091f110e0Safresh1 6191f110e0Safresh1Remove the +x bit on files that don't have it enabled in the current dir 6291f110e0Safresh1 6391f110e0Safresh1=item * 6491f110e0Safresh1 6591f110e0Safresh1Restore files mentioned in C<CUSTOMIZED> 6691f110e0Safresh1 6791f110e0Safresh1=item * 6891f110e0Safresh1 6991f110e0Safresh1Adds new files to F<MANIFEST> 7091f110e0Safresh1 7191f110e0Safresh1=item * 7291f110e0Safresh1 7391f110e0Safresh1Runs a C<make> (assumes a configure has been run) 7491f110e0Safresh1 7591f110e0Safresh1=item * 7691f110e0Safresh1 7791f110e0Safresh1Cleans up 7891f110e0Safresh1 7991f110e0Safresh1=item * 8091f110e0Safresh1 8191f110e0Safresh1Runs tests for the package 8291f110e0Safresh1 8391f110e0Safresh1=item * 8491f110e0Safresh1 8591f110e0Safresh1Runs the porting tests 8691f110e0Safresh1 8791f110e0Safresh1=back 8891f110e0Safresh1 8991f110e0Safresh1[1] If the C<--tarball> option is given, then CPAN is not consulted. 9091f110e0Safresh1C<--tarball> should be the path to the tarball; the version is extracted 9191f110e0Safresh1from the filename -- but can be overwritten by the C<--version> option. 9291f110e0Safresh1 9391f110e0Safresh1=head1 TODO 9491f110e0Safresh1 9591f110e0Safresh1=over 4 9691f110e0Safresh1 9791f110e0Safresh1=item * 9891f110e0Safresh1 9991f110e0Safresh1Delete files from F<MANIFEST> 10091f110e0Safresh1 10191f110e0Safresh1=item * 10291f110e0Safresh1 10391f110e0Safresh1Update F<Porting/Maintainers.pl> 10491f110e0Safresh1 10591f110e0Safresh1=item * 10691f110e0Safresh1 10791f110e0Safresh1Optional, run a full test suite 10891f110e0Safresh1 10991f110e0Safresh1=item * 11091f110e0Safresh1 11191f110e0Safresh1Handle complicated C<FILES> 11291f110e0Safresh1 11391f110e0Safresh1=back 11491f110e0Safresh1 11591f110e0Safresh1This is an initial version; no attempt has been made yet to make this 11691f110e0Safresh1portable. It shells out instead of trying to find a Perl solution. 117*6fb12b70Safresh1In particular, it assumes git, perl, and make 11891f110e0Safresh1to be available. 11991f110e0Safresh1 12091f110e0Safresh1=cut 12191f110e0Safresh1 122898184e3Ssthen 123898184e3Ssthenpackage Maintainers; 124898184e3Ssthen 125898184e3Ssthenuse 5.010; 126898184e3Ssthen 127898184e3Ssthenuse strict; 128898184e3Ssthenuse warnings; 129898184e3Ssthenuse Getopt::Long; 130*6fb12b70Safresh1use Archive::Tar; 131*6fb12b70Safresh1use File::Path qw( remove_tree ); 132*6fb12b70Safresh1use File::Find; 133*6fb12b70Safresh1use Config qw( %Config ); 134898184e3Ssthen 135898184e3Ssthen$| = 1; 136898184e3Ssthen 13791f110e0Safresh1die "This does not look like a top level directory" 138898184e3Ssthen unless -d "cpan" && -d "Porting"; 139898184e3Ssthen 140898184e3Ssthenour @IGNORABLE; 141898184e3Ssthenour %Modules; 142898184e3Ssthen 143898184e3Ssthenuse autodie; 144898184e3Ssthen 145898184e3Ssthenrequire "Porting/Maintainers.pl"; 146898184e3Ssthen 147898184e3Ssthenmy %IGNORABLE = map {$_ => 1} @IGNORABLE; 148898184e3Ssthen 149*6fb12b70Safresh1my $tmpdir= $ENV{ TEMP } // '/tmp'; 150*6fb12b70Safresh1 151898184e3Ssthenmy $package = "02packages.details.txt"; 152898184e3Ssthenmy $package_url = "http://www.cpan.org/modules/$package"; 153*6fb12b70Safresh1my $package_file = "$tmpdir/$package"; # this is a cache 154898184e3Ssthen 15591f110e0Safresh1my @problematic = ( 15691f110e0Safresh1 'podlators', # weird CUSTOMIZED section due to .PL files 15791f110e0Safresh1); 15891f110e0Safresh1 159898184e3Ssthen 160898184e3SsthenGetOptions ('tarball=s' => \my $tarball, 161898184e3Ssthen 'version=s' => \my $version, 162898184e3Ssthen force => \my $force,) 163898184e3Ssthen or die "Failed to parse arguments"; 164898184e3Ssthen 165898184e3Ssthendie "Usage: $0 module [args] [cpan package]" unless @ARGV == 1 || @ARGV == 2; 166898184e3Ssthen 167*6fb12b70Safresh1sub find_type_f { 168*6fb12b70Safresh1 my @res; 169*6fb12b70Safresh1 find( { no_chdir => 1, wanted => sub { 170*6fb12b70Safresh1 my $file= $File::Find::name; 171*6fb12b70Safresh1 return unless -f $file; 172*6fb12b70Safresh1 push @res, $file 173*6fb12b70Safresh1 }}, @_ ); 174*6fb12b70Safresh1 @res 175*6fb12b70Safresh1}; 176*6fb12b70Safresh1 177*6fb12b70Safresh1# Equivalent of `chmod a-x` 178*6fb12b70Safresh1sub de_exec { 179*6fb12b70Safresh1 for my $filename ( @_ ) { 180*6fb12b70Safresh1 my $mode= (stat $filename)[2] & 0777; 181*6fb12b70Safresh1 if( $mode & 0111 ) { # exec-bit set 182*6fb12b70Safresh1 chmod $mode & 0666, $filename; 183*6fb12b70Safresh1 }; 184*6fb12b70Safresh1 } 185*6fb12b70Safresh1} 186*6fb12b70Safresh1 187*6fb12b70Safresh1sub make { 188*6fb12b70Safresh1 my @args= @_; 189*6fb12b70Safresh1 if( $^O eq 'MSWin32') { 190*6fb12b70Safresh1 chdir "Win32"; 191*6fb12b70Safresh1 system "$Config{make} @args> ..\\make.log 2>&1" and die "Running make failed, see make.log"; 192*6fb12b70Safresh1 chdir '..'; 193*6fb12b70Safresh1 } else { 194*6fb12b70Safresh1 system "$Config{make} @args> make.log 2>&1" and die "Running make failed, see make.log"; 195*6fb12b70Safresh1 }; 196*6fb12b70Safresh1}; 197*6fb12b70Safresh1 198898184e3Ssthenmy ($module) = shift; 199898184e3Ssthenmy $cpan_mod = @ARGV ? shift : $module; 200898184e3Ssthen 201898184e3Ssthen 202898184e3Ssthenmy $info = $Modules {$module} or die "Cannot find module $module"; 203898184e3Ssthenmy $distribution = $$info {DISTRIBUTION}; 204898184e3Ssthen 205898184e3Ssthenmy @files = glob $$info {FILES}; 20691f110e0Safresh1if (!-d $files [0] || grep { $_ eq $module } @problematic) { 207898184e3Ssthen say "This looks like a setup $0 cannot handle (yet)"; 208898184e3Ssthen unless ($force) { 209898184e3Ssthen say "Will not continue without a --force option"; 210898184e3Ssthen exit 1; 211898184e3Ssthen } 212898184e3Ssthen say "--force is in effect, so we'll soldier on. Wish me luck!"; 213898184e3Ssthen} 214898184e3Ssthen 215898184e3Ssthen 216898184e3Ssthenchdir "cpan"; 217898184e3Ssthen 21891f110e0Safresh1my $pkg_dir = $files[0]; 219898184e3Ssthen $pkg_dir =~ s!.*/!!; 220898184e3Ssthen 221*6fb12b70Safresh1my ($old_version) = $distribution =~ /-([0-9.]+(?:-TRIAL[0-9]*)?)\.tar\.gz/; 222898184e3Ssthen 223898184e3Ssthenmy $o_module = $module; 224898184e3Ssthenif ($cpan_mod =~ /-/ && $cpan_mod !~ /::/) { 225898184e3Ssthen $cpan_mod =~ s/-/::/g; 226898184e3Ssthen} 227898184e3Ssthen 228898184e3Ssthen# 229898184e3Ssthen# Find the information from CPAN. 230898184e3Ssthen# 231898184e3Ssthenmy $new_file; 232898184e3Ssthenmy $new_version; 233898184e3Ssthenunless ($tarball) { 234898184e3Ssthen # 235898184e3Ssthen # Poor man's cache 236898184e3Ssthen # 237898184e3Ssthen unless (-f $package_file && -M $package_file < 1) { 238*6fb12b70Safresh1 eval { 239*6fb12b70Safresh1 require HTTP::Tiny; 240*6fb12b70Safresh1 my $http= HTTP::Tiny->new(); 241*6fb12b70Safresh1 $http->mirror( $package_url => $package_file ); 242*6fb12b70Safresh1 1 243*6fb12b70Safresh1 } or system wget => $package_url, '-qO', $package_file; 244898184e3Ssthen } 245898184e3Ssthen 246*6fb12b70Safresh1 open my $fh, '<', $package_file; 247*6fb12b70Safresh1 (my $new_line) = grep {/^$cpan_mod/} <$fh> # Yes, this needs a lot of memory 248898184e3Ssthen or die "Cannot find $cpan_mod on CPAN\n"; 249898184e3Ssthen (undef, $new_version, my $new_path) = split ' ', $new_line; 25091f110e0Safresh1 if (defined $version) { 25191f110e0Safresh1 $new_path =~ s/-$new_version\./-$version\./; 25291f110e0Safresh1 $new_version = $version; 25391f110e0Safresh1 } 254898184e3Ssthen $new_file = (split '/', $new_path) [-1]; 255898184e3Ssthen 256898184e3Ssthen my $url = "http://search.cpan.org/CPAN/authors/id/$new_path"; 257898184e3Ssthen say "Fetching $url"; 258898184e3Ssthen # 259898184e3Ssthen # Fetch the new distro 260898184e3Ssthen # 261*6fb12b70Safresh1 eval { 262*6fb12b70Safresh1 require HTTP::Tiny; 263*6fb12b70Safresh1 my $http= HTTP::Tiny->new(); 264*6fb12b70Safresh1 $http->mirror( $url => $new_file ); 265*6fb12b70Safresh1 1 266*6fb12b70Safresh1 } or system wget => $url, '-qO', $new_file; 267898184e3Ssthen} 268898184e3Ssthenelse { 269898184e3Ssthen $new_file = $tarball; 270*6fb12b70Safresh1 $new_version = $version // ($new_file =~ /-([0-9._]+(?:-TRIAL[0-9]*)?)\.tar\.gz/) [0]; 271898184e3Ssthen} 272898184e3Ssthen 273898184e3Ssthenmy $old_dir = "$pkg_dir-$old_version"; 274898184e3Ssthen 275898184e3Ssthensay "Cleaning out old directory"; 276898184e3Ssthensystem git => 'clean', '-dfxq', $pkg_dir; 277898184e3Ssthen 278898184e3Ssthensay "Unpacking $new_file"; 279*6fb12b70Safresh1Archive::Tar->extract_archive( $new_file ); 280898184e3Ssthen 28191f110e0Safresh1(my $new_dir = $new_file) =~ s/\.tar\.gz//; 28291f110e0Safresh1# ensure 'make' will update all files 283*6fb12b70Safresh1my $t= time; 284*6fb12b70Safresh1for my $file (find_type_f($new_dir)) { 285*6fb12b70Safresh1 open(my $fh,">>$file") || die "Cannot write $file:$!"; 286*6fb12b70Safresh1 close($fh); 287*6fb12b70Safresh1 utime($t,$t,$file); 288*6fb12b70Safresh1}; 289898184e3Ssthen 290898184e3Ssthensay "Renaming directories"; 291898184e3Ssthenrename $pkg_dir => $old_dir; 292898184e3Ssthen 29391f110e0Safresh1say "Creating new package directory"; 29491f110e0Safresh1mkdir $pkg_dir; 29591f110e0Safresh1 29691f110e0Safresh1say "Populating new package directory"; 29791f110e0Safresh1my $map = $$info {MAP}; 29891f110e0Safresh1my @EXCLUDED_QR; 29991f110e0Safresh1my %EXCLUDED_QQ; 30091f110e0Safresh1if ($$info {EXCLUDED}) { 30191f110e0Safresh1 foreach my $entry (@{$$info {EXCLUDED}}) { 30291f110e0Safresh1 if (ref $entry) {push @EXCLUDED_QR => $entry} 30391f110e0Safresh1 else {$EXCLUDED_QQ {$entry} = 1} 30491f110e0Safresh1 } 30591f110e0Safresh1} 30691f110e0Safresh1 307*6fb12b70Safresh1FILE: for my $file ( find_type_f( $new_dir )) { 30891f110e0Safresh1 my $old_file = $file; 30991f110e0Safresh1 $file =~ s{^$new_dir/}{}; 31091f110e0Safresh1 31191f110e0Safresh1 next if $EXCLUDED_QQ{$file}; 31291f110e0Safresh1 for my $qr (@EXCLUDED_QR) { 31391f110e0Safresh1 next FILE if $file =~ $qr; 31491f110e0Safresh1 } 31591f110e0Safresh1 31691f110e0Safresh1 if ( $map ) { 31791f110e0Safresh1 for my $key ( sort { length $b <=> length $a } keys %$map ) { 31891f110e0Safresh1 my $val = $map->{$key}; 31991f110e0Safresh1 last if $file =~ s/^$key/$val/; 32091f110e0Safresh1 } 32191f110e0Safresh1 } 32291f110e0Safresh1 else { 32391f110e0Safresh1 $file = $files[0] . '/' . $file; 32491f110e0Safresh1 } 32591f110e0Safresh1 32691f110e0Safresh1 if ( $file =~ m{^cpan/} ) { 32791f110e0Safresh1 $file =~ s{^cpan/}{}; 32891f110e0Safresh1 } 32991f110e0Safresh1 else { 33091f110e0Safresh1 $file = '../' . $file; 33191f110e0Safresh1 } 33291f110e0Safresh1 33391f110e0Safresh1 my $prefix = ''; 33491f110e0Safresh1 my @parts = split '/', $file; 33591f110e0Safresh1 pop @parts; 33691f110e0Safresh1 for my $part (@parts) { 33791f110e0Safresh1 $prefix .= '/' if $prefix; 33891f110e0Safresh1 $prefix .= $part; 33991f110e0Safresh1 mkdir $prefix unless -d $prefix; 34091f110e0Safresh1 } 34191f110e0Safresh1 34291f110e0Safresh1 rename $old_file => $file; 34391f110e0Safresh1} 344*6fb12b70Safresh1remove_tree( $new_dir ); 345898184e3Ssthen 346898184e3Ssthenif (-f "$old_dir/.gitignore") { 347898184e3Ssthen say "Restoring .gitignore"; 348898184e3Ssthen system git => 'checkout', "$pkg_dir/.gitignore"; 349898184e3Ssthen} 350898184e3Ssthen 351*6fb12b70Safresh1my @new_files = find_type_f( $pkg_dir ); 352898184e3Ssthen@new_files = grep {$_ ne $pkg_dir} @new_files; 353898184e3Ssthens!^[^/]+/!! for @new_files; 354898184e3Ssthenmy %new_files = map {$_ => 1} @new_files; 355898184e3Ssthen 356*6fb12b70Safresh1my @old_files = find_type_f( $old_dir ); 357898184e3Ssthen@old_files = grep {$_ ne $old_dir} @old_files; 358898184e3Ssthens!^[^/]+/!! for @old_files; 359898184e3Ssthenmy %old_files = map {$_ => 1} @old_files; 360898184e3Ssthen 361898184e3Ssthenmy @delete; 362898184e3Ssthenmy @commit; 363898184e3Ssthenmy @gone; 364898184e3SsthenFILE: 365898184e3Ssthenforeach my $file (@new_files) { 366898184e3Ssthen next if -d "$pkg_dir/$file"; # Ignore directories. 367898184e3Ssthen next if $old_files {$file}; # It's already there. 368898184e3Ssthen if ($IGNORABLE {$file}) { 369898184e3Ssthen push @delete => $file; 370898184e3Ssthen next; 371898184e3Ssthen } 372898184e3Ssthen push @commit => $file; 373898184e3Ssthen} 374898184e3Ssthenforeach my $file (@old_files) { 375898184e3Ssthen next if -d "$old_dir/$file"; 376898184e3Ssthen next if $new_files {$file}; 377898184e3Ssthen push @gone => $file; 378898184e3Ssthen} 379898184e3Ssthen 380898184e3Ssthen# 381898184e3Ssthen# Find all files with an exec bit 382898184e3Ssthen# 383*6fb12b70Safresh1my @exec = find_type_f( $pkg_dir ); 384898184e3Ssthenmy @de_exec; 385898184e3Ssthenforeach my $file (@exec) { 386898184e3Ssthen # Remove leading dir 387898184e3Ssthen $file =~ s!^[^/]+/!!; 388898184e3Ssthen if ($file =~ m!^t/!) { 389898184e3Ssthen push @de_exec => $file; 390898184e3Ssthen next; 391898184e3Ssthen } 392898184e3Ssthen # Check to see if the file exists; if it doesn't and doesn't have 393898184e3Ssthen # the exec bit, remove it. 394898184e3Ssthen if ($old_files {$file}) { 395898184e3Ssthen unless (-x "$old_dir/$file") { 396898184e3Ssthen push @de_exec => $file; 397898184e3Ssthen } 398898184e3Ssthen } 399898184e3Ssthen} 400898184e3Ssthen 401898184e3Ssthen# 402898184e3Ssthen# No need to change the +x bit on files that will be deleted. 403898184e3Ssthen# 404898184e3Ssthenif (@de_exec && @delete) { 405898184e3Ssthen my %delete = map {+"$pkg_dir/$_" => 1} @delete; 406898184e3Ssthen @de_exec = grep {!$delete {$_}} @de_exec; 407898184e3Ssthen} 408898184e3Ssthen 409898184e3Ssthensay "unlink $pkg_dir/$_" for @delete; 410898184e3Ssthensay "git add $pkg_dir/$_" for @commit; 411898184e3Ssthensay "git rm -f $pkg_dir/$_" for @gone; 412898184e3Ssthensay "chmod a-x $pkg_dir/$_" for @de_exec; 413898184e3Ssthen 414898184e3Ssthenprint "Hit return to continue; ^C to abort "; <STDIN>; 415898184e3Ssthen 416898184e3Ssthenunlink "$pkg_dir/$_" for @delete; 417898184e3Ssthensystem git => 'add', "$pkg_dir/$_" for @commit; 418898184e3Ssthensystem git => 'rm', '-f', "$pkg_dir/$_" for @gone; 419*6fb12b70Safresh1de_exec( "$pkg_dir/$_" ) for @de_exec; 420898184e3Ssthen 421898184e3Ssthen# 422898184e3Ssthen# Restore anything that is customized. 423898184e3Ssthen# We don't really care whether we've deleted the file - since we 424898184e3Ssthen# do a git restore, it's going to be resurrected if necessary. 425898184e3Ssthen# 426898184e3Ssthenif ($$info {CUSTOMIZED}) { 427898184e3Ssthen say "Restoring customized files"; 428898184e3Ssthen foreach my $file (@{$$info {CUSTOMIZED}}) { 429898184e3Ssthen system git => "checkout", "$pkg_dir/$file"; 430898184e3Ssthen } 431898184e3Ssthen} 432898184e3Ssthen 433898184e3Ssthenchdir ".."; 434898184e3Ssthenif (@commit) { 435898184e3Ssthen say "Fixing MANIFEST"; 436898184e3Ssthen my $MANIFEST = "MANIFEST"; 437898184e3Ssthen my $MANIFEST_SORT = "$MANIFEST.sorted"; 438898184e3Ssthen open my $fh, ">>", $MANIFEST; 439898184e3Ssthen say $fh "cpan/$pkg_dir/$_" for @commit; 440898184e3Ssthen close $fh; 441898184e3Ssthen system perl => "Porting/manisort", '--output', $MANIFEST_SORT; 442898184e3Ssthen rename $MANIFEST_SORT => $MANIFEST; 443898184e3Ssthen} 444898184e3Ssthen 445898184e3Ssthen 446898184e3Ssthenprint "Running a make ... "; 447*6fb12b70Safresh1# Prepare for running (selected) tests 448*6fb12b70Safresh1make 'test-prep'; 449898184e3Ssthenprint "done\n"; 450898184e3Ssthen 451898184e3Ssthen# 452898184e3Ssthen# Must clean up, or else t/porting/FindExt.t will fail. 453*6fb12b70Safresh1# Note that we can always retrieve the original directory with a git checkout. 454898184e3Ssthen# 455898184e3Ssthenprint "About to clean up; hit return or abort (^C) "; <STDIN>; 456898184e3Ssthen 457*6fb12b70Safresh1remove_tree( "cpan/$old_dir" ); 458*6fb12b70Safresh1unlink "cpan/$new_file" unless $tarball; 459898184e3Ssthen 460898184e3Ssthen# 461898184e3Ssthen# Run the tests. First the test belonging to the module, followed by the 462898184e3Ssthen# the tests in t/porting 463898184e3Ssthen# 464*6fb12b70Safresh1chdir "t"; 465898184e3Ssthensay "Running module tests"; 466*6fb12b70Safresh1my @test_files = grep { /\.t$/ } find_type_f( $pkg_dir ); 467*6fb12b70Safresh1my $exe_dir= $^O =~ /MSWin/ ? "..\\" : './'; 468*6fb12b70Safresh1my $output = `${exe_dir}perl$Config{_exe} TEST @test_files`; 469898184e3Ssthenunless ($output =~ /All tests successful/) { 470898184e3Ssthen say $output; 471898184e3Ssthen exit 1; 472898184e3Ssthen} 473898184e3Ssthen 474898184e3Ssthenprint "Running tests in t/porting "; 475*6fb12b70Safresh1my @tests = glob 'porting/*.t'; 476898184e3Ssthenchomp @tests; 477898184e3Ssthenmy @failed; 478898184e3Ssthenforeach my $t (@tests) { 479*6fb12b70Safresh1 my @not = grep {!/# TODO/ } 480*6fb12b70Safresh1 grep { /^not/ } 481*6fb12b70Safresh1 `${exe_dir}perl -I../lib -I.. $t`; 482898184e3Ssthen print @not ? '!' : '.'; 483898184e3Ssthen push @failed => $t if @not; 484898184e3Ssthen} 485898184e3Ssthenprint "\n"; 486898184e3Ssthensay "Failed tests: @failed" if @failed; 487898184e3Ssthen 488898184e3Ssthen 48991f110e0Safresh1say "Attempting to update Maintainers.pl"; 49091f110e0Safresh1chdir '..'; 491898184e3Ssthen 49291f110e0Safresh1open my $Maintainers_pl, '<', 'Porting/Maintainers.pl'; 49391f110e0Safresh1open my $new_Maintainers_pl, '>', 'Maintainers.pl'; 49491f110e0Safresh1 49591f110e0Safresh1my $found; 49691f110e0Safresh1my $in_mod_section; 49791f110e0Safresh1while (<$Maintainers_pl>) { 49891f110e0Safresh1 if (!$found) { 49991f110e0Safresh1 if ($in_mod_section) { 50091f110e0Safresh1 if (/DISTRIBUTION/) { 50191f110e0Safresh1 if (s/\Q$old_version/$new_version/) { 50291f110e0Safresh1 $found = 1; 50391f110e0Safresh1 } 50491f110e0Safresh1 } 50591f110e0Safresh1 50691f110e0Safresh1 if (/^ }/) { 50791f110e0Safresh1 $in_mod_section = 0; 50891f110e0Safresh1 } 50991f110e0Safresh1 } 51091f110e0Safresh1 51191f110e0Safresh1 if (/\Q$cpan_mod/) { 51291f110e0Safresh1 $in_mod_section = 1; 51391f110e0Safresh1 } 51491f110e0Safresh1 } 51591f110e0Safresh1 51691f110e0Safresh1 print $new_Maintainers_pl $_; 51791f110e0Safresh1} 51891f110e0Safresh1 51991f110e0Safresh1if ($found) { 52091f110e0Safresh1 unlink 'Porting/Maintainers.pl'; 52191f110e0Safresh1 rename 'Maintainers.pl' => 'Porting/Maintainers.pl'; 522*6fb12b70Safresh1 chmod 0755 => 'Porting/Maintainers.pl'; 52391f110e0Safresh1} 52491f110e0Safresh1else { 52591f110e0Safresh1 say "Could not update Porting/Maintainers.pl."; 52691f110e0Safresh1 say "Make sure you update this by hand before committing."; 52791f110e0Safresh1} 52891f110e0Safresh1 529898184e3Ssthensay "$o_module is now version $new_version"; 53091f110e0Safresh1say "Now you ought to run a make; make test ..."; 531898184e3Ssthen 532898184e3Ssthen 533898184e3Ssthen__END__ 534