Blame private/MakeUtil.pm

Packit Service 4a2782
package MakeUtil ;
Packit Service 4a2782
package main ;
Packit Service 4a2782
Packit Service 4a2782
use strict ;
Packit Service 4a2782
Packit Service 4a2782
use Config qw(%Config);
Packit Service 4a2782
use File::Copy;
Packit Service 4a2782
Packit Service 4a2782
my $VERSION = '1.0';
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
BEGIN
Packit Service 4a2782
{
Packit Service 4a2782
    eval { require File::Spec::Functions ; File::Spec::Functions->import() } ;
Packit Service 4a2782
    if ($@)
Packit Service 4a2782
    {
Packit Service 4a2782
        *catfile = sub { return "$_[0]/$_[1]" }
Packit Service 4a2782
    }
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
require VMS::Filespec if $^O eq 'VMS';
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
unless($ENV{PERL_CORE}) {
Packit Service 4a2782
    $ENV{PERL_CORE} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
$ENV{SKIP_FOR_CORE} = 1 if $ENV{PERL_CORE} || $ENV{MY_PERL_CORE} ;
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
sub MY::libscan
Packit Service 4a2782
{
Packit Service 4a2782
    my $self = shift;
Packit Service 4a2782
    my $path = shift;
Packit Service 4a2782
Packit Service 4a2782
    return undef
Packit Service 4a2782
        if $path =~ /(~|\.bak|_bak)$/ ||
Packit Service 4a2782
           $path =~ /\..*\.sw(o|p)$/  ||
Packit Service 4a2782
           $path =~ /\B\.svn\b/;
Packit Service 4a2782
Packit Service 4a2782
    return $path;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
sub MY::postamble 
Packit Service 4a2782
{
Packit Service 4a2782
    return ''
Packit Service 4a2782
        if $ENV{PERL_CORE} ;
Packit Service 4a2782
Packit Service 4a2782
    my @files = getPerlFiles('MANIFEST');
Packit Service 4a2782
Packit Service 4a2782
    # Note: Once you remove all the layers of shell/makefile escaping 
Packit Service 4a2782
    # the regular expression below reads
Packit Service 4a2782
    #
Packit Service 4a2782
    #    /^\s*local\s*\(\s*\$^W\s*\)/
Packit Service 4a2782
    #
Packit Service 4a2782
    my $postamble = '
Packit Service 4a2782
Packit Service 4a2782
MyTrebleCheck:
Packit Service 4a2782
	@echo Checking for $$^W in files: '. "@files" . '
Packit Service 4a2782
	perl -ne \'						\
Packit Service 4a2782
	    exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/; \'		\
Packit Service 4a2782
         ' . " @files || " . '				\
Packit Service 4a2782
	(echo found unexpected $$^W ; exit 1)
Packit Service 4a2782
	@echo All is ok.
Packit Service 4a2782
Packit Service 4a2782
';
Packit Service 4a2782
Packit Service 4a2782
    return $postamble;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
sub getPerlFiles
Packit Service 4a2782
{
Packit Service 4a2782
    my @manifests = @_ ;
Packit Service 4a2782
Packit Service 4a2782
    my @files = ();
Packit Service 4a2782
Packit Service 4a2782
    for my $manifest (@manifests)
Packit Service 4a2782
    {
Packit Service 4a2782
        my $prefix = './';
Packit Service 4a2782
Packit Service 4a2782
        $prefix = $1
Packit Service 4a2782
            if $manifest =~ m#^(.*/)#;
Packit Service 4a2782
Packit Service 4a2782
        open M, "<$manifest"
Packit Service 4a2782
            or die "Cannot open '$manifest': $!\n";
Packit Service 4a2782
        while (<M>)
Packit Service 4a2782
        {
Packit Service 4a2782
            chomp ;
Packit Service 4a2782
            next if /^\s*#/ || /^\s*$/ ;
Packit Service 4a2782
Packit Service 4a2782
            s/^\s+//;
Packit Service 4a2782
            s/\s+$//;
Packit Service 4a2782
Packit Service 4a2782
            #next if m#t/Test/More\.pm$# or m#t/Test/Builder\.pm$#;
Packit Service 4a2782
Packit Service 4a2782
            /^(\S+)\s*(.*)$/;
Packit Service 4a2782
Packit Service 4a2782
            my ($file, $rest) = ($1, $2);
Packit Service 4a2782
Packit Service 4a2782
            if ($file =~ /\.(pm|pl|t)$/ and $file !~ /MakeUtil.pm/)
Packit Service 4a2782
            {
Packit Service 4a2782
                push @files, "$prefix$file";
Packit Service 4a2782
            }
Packit Service 4a2782
            elsif ($rest =~ /perl/i)
Packit Service 4a2782
            {
Packit Service 4a2782
                push @files, "$prefix$file";
Packit Service 4a2782
            }
Packit Service 4a2782
Packit Service 4a2782
        }
Packit Service 4a2782
        close M;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    return @files;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
sub UpDowngrade
Packit Service 4a2782
{
Packit Service 4a2782
    return if defined $ENV{TipTop};
Packit Service 4a2782
Packit Service 4a2782
    my @files = @_ ;
Packit Service 4a2782
Packit Service 4a2782
    # our and use bytes/utf8 is stable from 5.6.0 onward
Packit Service 4a2782
    # warnings is stable from 5.6.1 onward
Packit Service 4a2782
Packit Service 4a2782
    # Note: this code assumes that each statement it modifies is not
Packit Service 4a2782
    #       split across multiple lines.
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
    my $warn_sub = '';
Packit Service 4a2782
    my $our_sub = '' ;
Packit Service 4a2782
Packit Service 4a2782
    my $upgrade ;
Packit Service 4a2782
    my $downgrade ;
Packit Service 4a2782
    my $do_downgrade ;
Packit Service 4a2782
Packit Service 4a2782
    my $caller = (caller(1))[3] || '';
Packit Service 4a2782
Packit Service 4a2782
    if ($caller =~ /downgrade/)
Packit Service 4a2782
    {
Packit Service 4a2782
        $downgrade = 1;
Packit Service 4a2782
    }
Packit Service 4a2782
    elsif ($caller =~ /upgrade/)
Packit Service 4a2782
    {
Packit Service 4a2782
        $upgrade = 1;
Packit Service 4a2782
    }
Packit Service 4a2782
    else
Packit Service 4a2782
    {
Packit Service 4a2782
        $do_downgrade = 1
Packit Service 4a2782
            if $] < 5.006001 ;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
#    else
Packit Service 4a2782
#    {
Packit Service 4a2782
#        my $opt = shift @ARGV || '' ;
Packit Service 4a2782
#        $upgrade = ($opt =~ /^-upgrade/i);
Packit Service 4a2782
#        $downgrade = ($opt =~ /^-downgrade/i);
Packit Service 4a2782
#        push @ARGV, $opt unless $downgrade || $upgrade;
Packit Service 4a2782
#    }
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
    if ($downgrade || $do_downgrade) {
Packit Service 4a2782
        # From: use|no warnings "blah"
Packit Service 4a2782
        # To:   local ($^W) = 1; # use|no warnings "blah"
Packit Service 4a2782
        $warn_sub = sub {
Packit Service 4a2782
                            s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ;
Packit Service 4a2782
                            s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ;
Packit Service 4a2782
                        };
Packit Service 4a2782
    }
Packit Service 4a2782
    #elsif ($] >= 5.006001 || $upgrade) {
Packit Service 4a2782
    elsif ($upgrade) {
Packit Service 4a2782
        # From: local ($^W) = 1; # use|no warnings "blah"
Packit Service 4a2782
        # To:   use|no warnings "blah"
Packit Service 4a2782
        $warn_sub = sub {
Packit Service 4a2782
            s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ;
Packit Service 4a2782
          };
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    if ($downgrade || $do_downgrade) {
Packit Service 4a2782
        $our_sub = sub {
Packit Service 4a2782
	    if ( /^(\s*)our\s+\(\s*([^)]+\s*)\)/ ) {
Packit Service 4a2782
                my $indent = $1;
Packit Service 4a2782
                my $vars = join ' ', split /\s*,\s*/, $2;
Packit Service 4a2782
                $_ = "${indent}use vars qw($vars);\n";
Packit Service 4a2782
            }
Packit Service 4a2782
	    elsif ( /^(\s*)((use|no)\s+(bytes|utf8)\s*;.*)$/)
Packit Service 4a2782
            {
Packit Service 4a2782
                $_ = "$1# $2\n";
Packit Service 4a2782
            }
Packit Service 4a2782
          };
Packit Service 4a2782
    }
Packit Service 4a2782
    #elsif ($] >= 5.006000 || $upgrade) {
Packit Service 4a2782
    elsif ($upgrade) {
Packit Service 4a2782
        $our_sub = sub {
Packit Service 4a2782
	    if ( /^(\s*)use\s+vars\s+qw\((.*?)\)/ ) {
Packit Service 4a2782
                my $indent = $1;
Packit Service 4a2782
                my $vars = join ', ', split ' ', $2;
Packit Service 4a2782
                $_ = "${indent}our ($vars);\n";
Packit Service 4a2782
            }
Packit Service 4a2782
	    elsif ( /^(\s*)#\s*((use|no)\s+(bytes|utf8)\s*;.*)$/)
Packit Service 4a2782
            {
Packit Service 4a2782
                $_ = "$1$2\n";
Packit Service 4a2782
            }
Packit Service 4a2782
          };
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    if (! $our_sub && ! $warn_sub) {
Packit Service 4a2782
        warn "Up/Downgrade not needed.\n";
Packit Service 4a2782
	if ($upgrade || $downgrade)
Packit Service 4a2782
          { exit 0 }
Packit Service 4a2782
        else
Packit Service 4a2782
          { return }
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    foreach (@files) {
Packit Service 4a2782
        #if (-l $_ )
Packit Service 4a2782
          { doUpDown($our_sub, $warn_sub, $_) }
Packit Service 4a2782
          #else  
Packit Service 4a2782
          #{ doUpDownViaCopy($our_sub, $warn_sub, $_) }
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    warn "Up/Downgrade complete.\n" ;
Packit Service 4a2782
    exit 0 if $upgrade || $downgrade;
Packit Service 4a2782
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
sub doUpDown
Packit Service 4a2782
{
Packit Service 4a2782
    my $our_sub = shift;
Packit Service 4a2782
    my $warn_sub = shift;
Packit Service 4a2782
Packit Service 4a2782
    return if -d $_[0];
Packit Service 4a2782
Packit Service 4a2782
    local ($^I) = ($^O eq 'VMS') ? "_bak" : ".bak";
Packit Service 4a2782
    local (@ARGV) = shift;
Packit Service 4a2782
 
Packit Service 4a2782
    while (<>)
Packit Service 4a2782
    {
Packit Service 4a2782
        print, last if /^__(END|DATA)__/ ;
Packit Service 4a2782
Packit Service 4a2782
        &{ $our_sub }() if $our_sub ;
Packit Service 4a2782
        &{ $warn_sub }() if $warn_sub ;
Packit Service 4a2782
        print ;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    return if eof ;
Packit Service 4a2782
Packit Service 4a2782
    while (<>)
Packit Service 4a2782
      { print }
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
sub doUpDownViaCopy
Packit Service 4a2782
{
Packit Service 4a2782
    my $our_sub = shift;
Packit Service 4a2782
    my $warn_sub = shift;
Packit Service 4a2782
    my $file     = shift ;
Packit Service 4a2782
Packit Service 4a2782
    use File::Copy ;
Packit Service 4a2782
Packit Service 4a2782
    return if -d $file ;
Packit Service 4a2782
Packit Service 4a2782
    my $backup = $file . ($^O eq 'VMS') ? "_bak" : ".bak";
Packit Service 4a2782
Packit Service 4a2782
    copy($file, $backup)
Packit Service 4a2782
        or die "Cannot copy $file to $backup: $!";
Packit Service 4a2782
Packit Service 4a2782
    my @keep = ();
Packit Service 4a2782
Packit Service 4a2782
    {
Packit Service 4a2782
        open F, "<$file"
Packit Service 4a2782
            or die "Cannot open $file: $!\n" ;
Packit Service 4a2782
        while (<F>)
Packit Service 4a2782
        {
Packit Service 4a2782
            if (/^__(END|DATA)__/)
Packit Service 4a2782
            {
Packit Service 4a2782
                push @keep, $_;
Packit Service 4a2782
                last ;
Packit Service 4a2782
            }
Packit Service 4a2782
            
Packit Service 4a2782
            &{ $our_sub }() if $our_sub ;
Packit Service 4a2782
            &{ $warn_sub }() if $warn_sub ;
Packit Service 4a2782
            push @keep, $_;
Packit Service 4a2782
        }
Packit Service 4a2782
Packit Service 4a2782
        if (! eof F)
Packit Service 4a2782
        {
Packit Service 4a2782
            while (<F>)
Packit Service 4a2782
              { push @keep, $_ }
Packit Service 4a2782
        }
Packit Service 4a2782
        close F;
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    {
Packit Service 4a2782
        open F, ">$file"
Packit Service 4a2782
            or die "Cannot open $file: $!\n";
Packit Service 4a2782
        print F @keep ;
Packit Service 4a2782
        close F;
Packit Service 4a2782
    }
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
Packit Service 4a2782
sub FindBrokenDependencies
Packit Service 4a2782
{
Packit Service 4a2782
    my $version = shift ;
Packit Service 4a2782
    my %thisModule = map { $_ => 1} @_;
Packit Service 4a2782
Packit Service 4a2782
    my @modules = qw(
Packit Service 4a2782
                    IO::Compress::Base
Packit Service 4a2782
                    IO::Compress::Base::Common
Packit Service 4a2782
                    IO::Uncompress::Base
Packit Service 4a2782
Packit Service 4a2782
                    Compress::Raw::Zlib
Packit Service 4a2782
                    Compress::Raw::Bzip2
Packit Service 4a2782
Packit Service 4a2782
                    IO::Compress::RawDeflate
Packit Service 4a2782
                    IO::Uncompress::RawInflate
Packit Service 4a2782
                    IO::Compress::Deflate
Packit Service 4a2782
                    IO::Uncompress::Inflate
Packit Service 4a2782
                    IO::Compress::Gzip
Packit Service 4a2782
                    IO::Compress::Gzip::Constants
Packit Service 4a2782
                    IO::Uncompress::Gunzip
Packit Service 4a2782
                    IO::Compress::Zip
Packit Service 4a2782
                    IO::Uncompress::Unzip
Packit Service 4a2782
Packit Service 4a2782
                    IO::Compress::Bzip2
Packit Service 4a2782
                    IO::Uncompress::Bunzip2
Packit Service 4a2782
Packit Service 4a2782
                    IO::Compress::Lzf
Packit Service 4a2782
                    IO::Uncompress::UnLzf
Packit Service 4a2782
Packit Service 4a2782
                    IO::Compress::Lzop
Packit Service 4a2782
                    IO::Uncompress::UnLzop
Packit Service 4a2782
Packit Service 4a2782
                    Compress::Zlib
Packit Service 4a2782
                    );
Packit Service 4a2782
    
Packit Service 4a2782
    my @broken = ();
Packit Service 4a2782
Packit Service 4a2782
    foreach my $module ( grep { ! $thisModule{$_} } @modules)
Packit Service 4a2782
    {
Packit Service 4a2782
        my $hasVersion = getInstalledVersion($module);
Packit Service 4a2782
Packit Service 4a2782
        # No need to upgrade if the module isn't installed at all
Packit Service 4a2782
        next 
Packit Service 4a2782
            if ! defined $hasVersion;
Packit Service 4a2782
Packit Service 4a2782
        # If already have C::Z version 1, then an upgrade to any of the
Packit Service 4a2782
        # IO::Compress modules will not break it.
Packit Service 4a2782
        next 
Packit Service 4a2782
            if $module eq 'Compress::Zlib' && $hasVersion < 2;
Packit Service 4a2782
Packit Service 4a2782
        if ($hasVersion < $version)
Packit Service 4a2782
        {
Packit Service 4a2782
            push @broken, $module
Packit Service 4a2782
        }
Packit Service 4a2782
    }
Packit Service 4a2782
Packit Service 4a2782
    return @broken;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
sub getInstalledVersion
Packit Service 4a2782
{
Packit Service 4a2782
    my $module = shift;
Packit Service 4a2782
    my $version;
Packit Service 4a2782
Packit Service 4a2782
    eval " require $module; ";
Packit Service 4a2782
Packit Service 4a2782
    if ($@ eq '')
Packit Service 4a2782
    {
Packit Service 4a2782
        no strict 'refs';
Packit Service 4a2782
        $version = ${ $module . "::VERSION" };
Packit Service 4a2782
        $version = 0 
Packit Service 4a2782
    }
Packit Service 4a2782
    
Packit Service 4a2782
    return $version;
Packit Service 4a2782
}
Packit Service 4a2782
Packit Service 4a2782
package MakeUtil ;
Packit Service 4a2782
Packit Service 4a2782
1;
Packit Service 4a2782
Packit Service 4a2782