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. 1176fb12b70Safresh1In 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; 1306fb12b70Safresh1use Archive::Tar; 1316fb12b70Safresh1use File::Path qw( remove_tree ); 1326fb12b70Safresh1use File::Find; 1336fb12b70Safresh1use 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 1496fb12b70Safresh1my $tmpdir= $ENV{ TEMP } // '/tmp'; 1506fb12b70Safresh1 151898184e3Ssthenmy $package = "02packages.details.txt"; 152898184e3Ssthenmy $package_url = "http://www.cpan.org/modules/$package"; 1536fb12b70Safresh1my $package_file = "$tmpdir/$package"; # this is a cache 154898184e3Ssthen 15591f110e0Safresh1my @problematic = ( 15691f110e0Safresh1 'podlators', # weird CUSTOMIZED section due to .PL files 15791f110e0Safresh1); 15891f110e0Safresh1 159898184e3Ssthen 160*b8851fccSafresh1sub usage 161*b8851fccSafresh1{ 162*b8851fccSafresh1 my $err = shift and select STDERR; 163*b8851fccSafresh1 print "Usage: $0 module [args] [cpan package]\n"; 164*b8851fccSafresh1 exit $err; 165*b8851fccSafresh1} 166*b8851fccSafresh1 167898184e3SsthenGetOptions ('tarball=s' => \my $tarball, 168898184e3Ssthen 'version=s' => \my $version, 169*b8851fccSafresh1 force => \my $force, 170*b8851fccSafresh1 help => sub { usage 0; }, 171*b8851fccSafresh1 ) or die "Failed to parse arguments"; 172898184e3Ssthen 173*b8851fccSafresh1usage 1 unless @ARGV == 1 || @ARGV == 2; 174898184e3Ssthen 1756fb12b70Safresh1sub find_type_f { 1766fb12b70Safresh1 my @res; 1776fb12b70Safresh1 find( { no_chdir => 1, wanted => sub { 1786fb12b70Safresh1 my $file= $File::Find::name; 1796fb12b70Safresh1 return unless -f $file; 1806fb12b70Safresh1 push @res, $file 1816fb12b70Safresh1 }}, @_ ); 1826fb12b70Safresh1 @res 1836fb12b70Safresh1}; 1846fb12b70Safresh1 1856fb12b70Safresh1# Equivalent of `chmod a-x` 1866fb12b70Safresh1sub de_exec { 1876fb12b70Safresh1 for my $filename ( @_ ) { 1886fb12b70Safresh1 my $mode= (stat $filename)[2] & 0777; 1896fb12b70Safresh1 if( $mode & 0111 ) { # exec-bit set 1906fb12b70Safresh1 chmod $mode & 0666, $filename; 1916fb12b70Safresh1 }; 1926fb12b70Safresh1 } 1936fb12b70Safresh1} 1946fb12b70Safresh1 1956fb12b70Safresh1sub make { 1966fb12b70Safresh1 my @args= @_; 1976fb12b70Safresh1 if( $^O eq 'MSWin32') { 1986fb12b70Safresh1 chdir "Win32"; 1996fb12b70Safresh1 system "$Config{make} @args> ..\\make.log 2>&1" and die "Running make failed, see make.log"; 2006fb12b70Safresh1 chdir '..'; 2016fb12b70Safresh1 } else { 2026fb12b70Safresh1 system "$Config{make} @args> make.log 2>&1" and die "Running make failed, see make.log"; 2036fb12b70Safresh1 }; 2046fb12b70Safresh1}; 2056fb12b70Safresh1 206898184e3Ssthenmy ($module) = shift; 207898184e3Ssthenmy $cpan_mod = @ARGV ? shift : $module; 208898184e3Ssthen 209898184e3Ssthen 210898184e3Ssthenmy $info = $Modules {$module} or die "Cannot find module $module"; 211898184e3Ssthenmy $distribution = $$info {DISTRIBUTION}; 212898184e3Ssthen 213898184e3Ssthenmy @files = glob $$info {FILES}; 21491f110e0Safresh1if (!-d $files [0] || grep { $_ eq $module } @problematic) { 215898184e3Ssthen say "This looks like a setup $0 cannot handle (yet)"; 216898184e3Ssthen unless ($force) { 217898184e3Ssthen say "Will not continue without a --force option"; 218898184e3Ssthen exit 1; 219898184e3Ssthen } 220898184e3Ssthen say "--force is in effect, so we'll soldier on. Wish me luck!"; 221898184e3Ssthen} 222898184e3Ssthen 223898184e3Ssthen 224898184e3Ssthenchdir "cpan"; 225898184e3Ssthen 22691f110e0Safresh1my $pkg_dir = $files[0]; 227898184e3Ssthen $pkg_dir =~ s!.*/!!; 228898184e3Ssthen 2296fb12b70Safresh1my ($old_version) = $distribution =~ /-([0-9.]+(?:-TRIAL[0-9]*)?)\.tar\.gz/; 230898184e3Ssthen 231898184e3Ssthenmy $o_module = $module; 232898184e3Ssthenif ($cpan_mod =~ /-/ && $cpan_mod !~ /::/) { 233898184e3Ssthen $cpan_mod =~ s/-/::/g; 234898184e3Ssthen} 235898184e3Ssthen 236898184e3Ssthen# 237898184e3Ssthen# Find the information from CPAN. 238898184e3Ssthen# 239898184e3Ssthenmy $new_file; 240898184e3Ssthenmy $new_version; 241898184e3Ssthenunless ($tarball) { 242898184e3Ssthen # 243898184e3Ssthen # Poor man's cache 244898184e3Ssthen # 245898184e3Ssthen unless (-f $package_file && -M $package_file < 1) { 2466fb12b70Safresh1 eval { 2476fb12b70Safresh1 require HTTP::Tiny; 2486fb12b70Safresh1 my $http= HTTP::Tiny->new(); 2496fb12b70Safresh1 $http->mirror( $package_url => $package_file ); 2506fb12b70Safresh1 1 2516fb12b70Safresh1 } or system wget => $package_url, '-qO', $package_file; 252898184e3Ssthen } 253898184e3Ssthen 2546fb12b70Safresh1 open my $fh, '<', $package_file; 2556fb12b70Safresh1 (my $new_line) = grep {/^$cpan_mod/} <$fh> # Yes, this needs a lot of memory 256898184e3Ssthen or die "Cannot find $cpan_mod on CPAN\n"; 257898184e3Ssthen (undef, $new_version, my $new_path) = split ' ', $new_line; 25891f110e0Safresh1 if (defined $version) { 25991f110e0Safresh1 $new_path =~ s/-$new_version\./-$version\./; 26091f110e0Safresh1 $new_version = $version; 26191f110e0Safresh1 } 262898184e3Ssthen $new_file = (split '/', $new_path) [-1]; 263898184e3Ssthen 264898184e3Ssthen my $url = "http://search.cpan.org/CPAN/authors/id/$new_path"; 265898184e3Ssthen say "Fetching $url"; 266898184e3Ssthen # 267898184e3Ssthen # Fetch the new distro 268898184e3Ssthen # 2696fb12b70Safresh1 eval { 2706fb12b70Safresh1 require HTTP::Tiny; 2716fb12b70Safresh1 my $http= HTTP::Tiny->new(); 2726fb12b70Safresh1 $http->mirror( $url => $new_file ); 2736fb12b70Safresh1 1 2746fb12b70Safresh1 } or system wget => $url, '-qO', $new_file; 275898184e3Ssthen} 276898184e3Ssthenelse { 277898184e3Ssthen $new_file = $tarball; 2786fb12b70Safresh1 $new_version = $version // ($new_file =~ /-([0-9._]+(?:-TRIAL[0-9]*)?)\.tar\.gz/) [0]; 279898184e3Ssthen} 280898184e3Ssthen 281898184e3Ssthenmy $old_dir = "$pkg_dir-$old_version"; 282898184e3Ssthen 283898184e3Ssthensay "Cleaning out old directory"; 284898184e3Ssthensystem git => 'clean', '-dfxq', $pkg_dir; 285898184e3Ssthen 286898184e3Ssthensay "Unpacking $new_file"; 2876fb12b70Safresh1Archive::Tar->extract_archive( $new_file ); 288898184e3Ssthen 28991f110e0Safresh1(my $new_dir = $new_file) =~ s/\.tar\.gz//; 29091f110e0Safresh1# ensure 'make' will update all files 2916fb12b70Safresh1my $t= time; 2926fb12b70Safresh1for my $file (find_type_f($new_dir)) { 2936fb12b70Safresh1 open(my $fh,">>$file") || die "Cannot write $file:$!"; 2946fb12b70Safresh1 close($fh); 2956fb12b70Safresh1 utime($t,$t,$file); 2966fb12b70Safresh1}; 297898184e3Ssthen 298898184e3Ssthensay "Renaming directories"; 299898184e3Ssthenrename $pkg_dir => $old_dir; 300898184e3Ssthen 30191f110e0Safresh1say "Creating new package directory"; 30291f110e0Safresh1mkdir $pkg_dir; 30391f110e0Safresh1 30491f110e0Safresh1say "Populating new package directory"; 30591f110e0Safresh1my $map = $$info {MAP}; 30691f110e0Safresh1my @EXCLUDED_QR; 30791f110e0Safresh1my %EXCLUDED_QQ; 30891f110e0Safresh1if ($$info {EXCLUDED}) { 30991f110e0Safresh1 foreach my $entry (@{$$info {EXCLUDED}}) { 31091f110e0Safresh1 if (ref $entry) {push @EXCLUDED_QR => $entry} 31191f110e0Safresh1 else {$EXCLUDED_QQ {$entry} = 1} 31291f110e0Safresh1 } 31391f110e0Safresh1} 31491f110e0Safresh1 3156fb12b70Safresh1FILE: for my $file ( find_type_f( $new_dir )) { 31691f110e0Safresh1 my $old_file = $file; 31791f110e0Safresh1 $file =~ s{^$new_dir/}{}; 31891f110e0Safresh1 31991f110e0Safresh1 next if $EXCLUDED_QQ{$file}; 32091f110e0Safresh1 for my $qr (@EXCLUDED_QR) { 32191f110e0Safresh1 next FILE if $file =~ $qr; 32291f110e0Safresh1 } 32391f110e0Safresh1 32491f110e0Safresh1 if ( $map ) { 32591f110e0Safresh1 for my $key ( sort { length $b <=> length $a } keys %$map ) { 32691f110e0Safresh1 my $val = $map->{$key}; 32791f110e0Safresh1 last if $file =~ s/^$key/$val/; 32891f110e0Safresh1 } 32991f110e0Safresh1 } 33091f110e0Safresh1 else { 33191f110e0Safresh1 $file = $files[0] . '/' . $file; 33291f110e0Safresh1 } 33391f110e0Safresh1 33491f110e0Safresh1 if ( $file =~ m{^cpan/} ) { 33591f110e0Safresh1 $file =~ s{^cpan/}{}; 33691f110e0Safresh1 } 33791f110e0Safresh1 else { 33891f110e0Safresh1 $file = '../' . $file; 33991f110e0Safresh1 } 34091f110e0Safresh1 34191f110e0Safresh1 my $prefix = ''; 34291f110e0Safresh1 my @parts = split '/', $file; 34391f110e0Safresh1 pop @parts; 34491f110e0Safresh1 for my $part (@parts) { 34591f110e0Safresh1 $prefix .= '/' if $prefix; 34691f110e0Safresh1 $prefix .= $part; 34791f110e0Safresh1 mkdir $prefix unless -d $prefix; 34891f110e0Safresh1 } 34991f110e0Safresh1 35091f110e0Safresh1 rename $old_file => $file; 35191f110e0Safresh1} 3526fb12b70Safresh1remove_tree( $new_dir ); 353898184e3Ssthen 354898184e3Ssthenif (-f "$old_dir/.gitignore") { 355898184e3Ssthen say "Restoring .gitignore"; 356898184e3Ssthen system git => 'checkout', "$pkg_dir/.gitignore"; 357898184e3Ssthen} 358898184e3Ssthen 3596fb12b70Safresh1my @new_files = find_type_f( $pkg_dir ); 360898184e3Ssthen@new_files = grep {$_ ne $pkg_dir} @new_files; 361898184e3Ssthens!^[^/]+/!! for @new_files; 362898184e3Ssthenmy %new_files = map {$_ => 1} @new_files; 363898184e3Ssthen 3646fb12b70Safresh1my @old_files = find_type_f( $old_dir ); 365898184e3Ssthen@old_files = grep {$_ ne $old_dir} @old_files; 366898184e3Ssthens!^[^/]+/!! for @old_files; 367898184e3Ssthenmy %old_files = map {$_ => 1} @old_files; 368898184e3Ssthen 369898184e3Ssthenmy @delete; 370898184e3Ssthenmy @commit; 371898184e3Ssthenmy @gone; 372898184e3SsthenFILE: 373898184e3Ssthenforeach my $file (@new_files) { 374898184e3Ssthen next if -d "$pkg_dir/$file"; # Ignore directories. 375898184e3Ssthen next if $old_files {$file}; # It's already there. 376898184e3Ssthen if ($IGNORABLE {$file}) { 377898184e3Ssthen push @delete => $file; 378898184e3Ssthen next; 379898184e3Ssthen } 380898184e3Ssthen push @commit => $file; 381898184e3Ssthen} 382898184e3Ssthenforeach my $file (@old_files) { 383898184e3Ssthen next if -d "$old_dir/$file"; 384898184e3Ssthen next if $new_files {$file}; 385898184e3Ssthen push @gone => $file; 386898184e3Ssthen} 387898184e3Ssthen 388898184e3Ssthen# 389898184e3Ssthen# Find all files with an exec bit 390898184e3Ssthen# 3916fb12b70Safresh1my @exec = find_type_f( $pkg_dir ); 392898184e3Ssthenmy @de_exec; 393898184e3Ssthenforeach my $file (@exec) { 394898184e3Ssthen # Remove leading dir 395898184e3Ssthen $file =~ s!^[^/]+/!!; 396898184e3Ssthen if ($file =~ m!^t/!) { 397898184e3Ssthen push @de_exec => $file; 398898184e3Ssthen next; 399898184e3Ssthen } 400898184e3Ssthen # Check to see if the file exists; if it doesn't and doesn't have 401898184e3Ssthen # the exec bit, remove it. 402898184e3Ssthen if ($old_files {$file}) { 403898184e3Ssthen unless (-x "$old_dir/$file") { 404898184e3Ssthen push @de_exec => $file; 405898184e3Ssthen } 406898184e3Ssthen } 407898184e3Ssthen} 408898184e3Ssthen 409898184e3Ssthen# 410898184e3Ssthen# No need to change the +x bit on files that will be deleted. 411898184e3Ssthen# 412898184e3Ssthenif (@de_exec && @delete) { 413898184e3Ssthen my %delete = map {+"$pkg_dir/$_" => 1} @delete; 414898184e3Ssthen @de_exec = grep {!$delete {$_}} @de_exec; 415898184e3Ssthen} 416898184e3Ssthen 417898184e3Ssthensay "unlink $pkg_dir/$_" for @delete; 418898184e3Ssthensay "git add $pkg_dir/$_" for @commit; 419898184e3Ssthensay "git rm -f $pkg_dir/$_" for @gone; 420898184e3Ssthensay "chmod a-x $pkg_dir/$_" for @de_exec; 421898184e3Ssthen 422898184e3Ssthenprint "Hit return to continue; ^C to abort "; <STDIN>; 423898184e3Ssthen 424898184e3Ssthenunlink "$pkg_dir/$_" for @delete; 425898184e3Ssthensystem git => 'add', "$pkg_dir/$_" for @commit; 426898184e3Ssthensystem git => 'rm', '-f', "$pkg_dir/$_" for @gone; 4276fb12b70Safresh1de_exec( "$pkg_dir/$_" ) for @de_exec; 428898184e3Ssthen 429898184e3Ssthen# 430898184e3Ssthen# Restore anything that is customized. 431898184e3Ssthen# We don't really care whether we've deleted the file - since we 432898184e3Ssthen# do a git restore, it's going to be resurrected if necessary. 433898184e3Ssthen# 434898184e3Ssthenif ($$info {CUSTOMIZED}) { 435898184e3Ssthen say "Restoring customized files"; 436898184e3Ssthen foreach my $file (@{$$info {CUSTOMIZED}}) { 437898184e3Ssthen system git => "checkout", "$pkg_dir/$file"; 438898184e3Ssthen } 439898184e3Ssthen} 440898184e3Ssthen 441898184e3Ssthenchdir ".."; 442898184e3Ssthenif (@commit) { 443898184e3Ssthen say "Fixing MANIFEST"; 444898184e3Ssthen my $MANIFEST = "MANIFEST"; 445898184e3Ssthen my $MANIFEST_SORT = "$MANIFEST.sorted"; 446898184e3Ssthen open my $fh, ">>", $MANIFEST; 447898184e3Ssthen say $fh "cpan/$pkg_dir/$_" for @commit; 448898184e3Ssthen close $fh; 449898184e3Ssthen system perl => "Porting/manisort", '--output', $MANIFEST_SORT; 450898184e3Ssthen rename $MANIFEST_SORT => $MANIFEST; 451898184e3Ssthen} 452898184e3Ssthen 453898184e3Ssthen 454898184e3Ssthenprint "Running a make ... "; 4556fb12b70Safresh1# Prepare for running (selected) tests 4566fb12b70Safresh1make 'test-prep'; 457898184e3Ssthenprint "done\n"; 458898184e3Ssthen 459898184e3Ssthen# 460898184e3Ssthen# Must clean up, or else t/porting/FindExt.t will fail. 4616fb12b70Safresh1# Note that we can always retrieve the original directory with a git checkout. 462898184e3Ssthen# 463898184e3Ssthenprint "About to clean up; hit return or abort (^C) "; <STDIN>; 464898184e3Ssthen 4656fb12b70Safresh1remove_tree( "cpan/$old_dir" ); 4666fb12b70Safresh1unlink "cpan/$new_file" unless $tarball; 467898184e3Ssthen 468898184e3Ssthen# 469898184e3Ssthen# Run the tests. First the test belonging to the module, followed by the 470898184e3Ssthen# the tests in t/porting 471898184e3Ssthen# 4726fb12b70Safresh1chdir "t"; 473898184e3Ssthensay "Running module tests"; 4746fb12b70Safresh1my @test_files = grep { /\.t$/ } find_type_f( $pkg_dir ); 4756fb12b70Safresh1my $exe_dir= $^O =~ /MSWin/ ? "..\\" : './'; 4766fb12b70Safresh1my $output = `${exe_dir}perl$Config{_exe} TEST @test_files`; 477898184e3Ssthenunless ($output =~ /All tests successful/) { 478898184e3Ssthen say $output; 479898184e3Ssthen exit 1; 480898184e3Ssthen} 481898184e3Ssthen 482898184e3Ssthenprint "Running tests in t/porting "; 4836fb12b70Safresh1my @tests = glob 'porting/*.t'; 484898184e3Ssthenchomp @tests; 485898184e3Ssthenmy @failed; 486898184e3Ssthenforeach my $t (@tests) { 4876fb12b70Safresh1 my @not = grep {!/# TODO/ } 4886fb12b70Safresh1 grep { /^not/ } 4896fb12b70Safresh1 `${exe_dir}perl -I../lib -I.. $t`; 490898184e3Ssthen print @not ? '!' : '.'; 491898184e3Ssthen push @failed => $t if @not; 492898184e3Ssthen} 493898184e3Ssthenprint "\n"; 494898184e3Ssthensay "Failed tests: @failed" if @failed; 495898184e3Ssthen 496898184e3Ssthen 49791f110e0Safresh1say "Attempting to update Maintainers.pl"; 49891f110e0Safresh1chdir '..'; 499898184e3Ssthen 50091f110e0Safresh1open my $Maintainers_pl, '<', 'Porting/Maintainers.pl'; 50191f110e0Safresh1open my $new_Maintainers_pl, '>', 'Maintainers.pl'; 50291f110e0Safresh1 50391f110e0Safresh1my $found; 50491f110e0Safresh1my $in_mod_section; 50591f110e0Safresh1while (<$Maintainers_pl>) { 50691f110e0Safresh1 if (!$found) { 50791f110e0Safresh1 if ($in_mod_section) { 50891f110e0Safresh1 if (/DISTRIBUTION/) { 50991f110e0Safresh1 if (s/\Q$old_version/$new_version/) { 51091f110e0Safresh1 $found = 1; 51191f110e0Safresh1 } 51291f110e0Safresh1 } 51391f110e0Safresh1 51491f110e0Safresh1 if (/^ }/) { 51591f110e0Safresh1 $in_mod_section = 0; 51691f110e0Safresh1 } 51791f110e0Safresh1 } 51891f110e0Safresh1 51991f110e0Safresh1 if (/\Q$cpan_mod/) { 52091f110e0Safresh1 $in_mod_section = 1; 52191f110e0Safresh1 } 52291f110e0Safresh1 } 52391f110e0Safresh1 52491f110e0Safresh1 print $new_Maintainers_pl $_; 52591f110e0Safresh1} 52691f110e0Safresh1 52791f110e0Safresh1if ($found) { 52891f110e0Safresh1 unlink 'Porting/Maintainers.pl'; 52991f110e0Safresh1 rename 'Maintainers.pl' => 'Porting/Maintainers.pl'; 5306fb12b70Safresh1 chmod 0755 => 'Porting/Maintainers.pl'; 53191f110e0Safresh1} 53291f110e0Safresh1else { 53391f110e0Safresh1 say "Could not update Porting/Maintainers.pl."; 53491f110e0Safresh1 say "Make sure you update this by hand before committing."; 53591f110e0Safresh1} 53691f110e0Safresh1 537898184e3Ssthensay "$o_module is now version $new_version"; 53891f110e0Safresh1say "Now you ought to run a make; make test ..."; 539898184e3Ssthen 540898184e3Ssthen 541898184e3Ssthen__END__ 542