stas        2004/03/24 11:59:41

  Modified:    lib/Apache Status.pm
               .        Changes
  Log:
  Fix Apache::Status, to lookup the Apache::Request version without
  loading it. Only if a suitable (2.x) version is found -- load and use
  it. Previously loading the 1.x version was affecting Apache::compat.
  
  Revision  Changes    Path
  1.23      +67 -21    modperl-2.0/lib/Apache/Status.pm
  
  Index: Status.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/Apache/Status.pm,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -u -r1.22 -r1.23
  --- Status.pm 23 Mar 2004 02:34:19 -0000      1.22
  +++ Status.pm 24 Mar 2004 19:59:41 -0000      1.23
  @@ -23,6 +23,9 @@
   use Apache::RequestRec ();
   use Apache::RequestUtil ();
   use Apache::ServerUtil ();
  +
  +use File::Spec ();
  +
   use Apache::Const -compile => qw(OK);
   
   $Apache::Status::VERSION = '3.00'; # mod_perl 2.0
  @@ -31,28 +34,11 @@
   
   our $newQ;
   
  -if (eval { require Apache::Request }) {
  -    if ($Apache::Request::VERSION >= 2) {
  -        $newQ ||= sub { Apache::Request->new(@_) };
  -    }
  -}
  -else {
  -    if ($@ !~ m|^Can't locate Apache/Request.pm|) {
  -        # we hit Apache::Request from mp1 which has failed to load
  -        # because it couldn't load other things, but it left all kind
  -        # of things behind, that will affect other code (e.g. magical
  -        # Apache::Table in %INC), so try to undo the damage
  -        # otherwise loading Apache::compat which calls:
  -        # $INC{'Apache/Table.pm'} = __FILE__;
  -        # crashes
  -        delete $INC{"Apache/Table.pm"};
  -        delete $INC{"Apache/Request.pm"};
  -    }
  -    else {
  -        # user has no Apache::Request installed
  -    }
  +if (parse_version("Apache::Request") > 2 &&
  +    eval { require Apache::Request }) {
  +    $newQ ||= sub { Apache::Request->new(@_) };
   }
  -if (!$newQ && eval { require CGI }) {
  +elsif (eval { require CGI }) {
       if ($CGI::VERSION >= 2.93) {
           $newQ ||= sub { CGI->new(@_) };
       }
  @@ -855,6 +841,66 @@
       else {
           return Config::myconfig();
     }
  +}
  +
  +# mp2 modules have to deal with situations where a binary incompatible
  +# mp1 version of the same module is installed in the same
  +# tree. therefore when checking for a certain version, one wants to
  +# check the version of the module 'require()' will find without
  +# loading that module. this function partially adopted from
  +# ExtUtils::MM_Unix does just that. it returns the version number of
  +# the first module that it finds, forcing numerical context, making
  +# the return value suitable for immediate numerical comparison
  +# operation. (i.e. 2.03-dev will be returned as 2.03,  0 will be
  +# returned when the parsing has failed or a module wasn't found).
  +sub parse_version {
  +    my $name = shift;
  +    die "no module name passed" unless $name;
  +    my $file = File::Spec->catfile(split /::/, $name) . '.pm';
  +    for my $dir (@INC) {
  +        next if ref $dir; # skip code refs
  +
  +        my $pmfile = File::Spec->catfile($dir, $file);
  +        next unless -r $pmfile;
  +
  +        open my $fh, $pmfile or die "can't open $pmfile: $!";
  +
  +        my $inpod = 0;
  +        my $version;
  +        while (<$fh>) {
  +            $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
  +            next if $inpod || /^\s*#/;
  +
  +            chomp;
  +            next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/;
  +            { local($1, $2); ($_ = $_) = /(.*)/; } # untaint
  +            my $eval = qq{
  +                package ModPerl::Util::_version;
  +                no strict;
  +
  +                local $1$2;
  +                \$$2=undef; do {
  +                    $_
  +                }; \$$2
  +            };
  +            no warnings;
  +            $version = eval $eval;
  +            warn "Could not eval '$eval' in $pmfile: $@" if $@;
  +            last;
  +        }
  +
  +        close $fh;
  +
  +        # avoid situations like "2.03-dev" and return a numerical
  +        # version
  +        if (defined $version) {
  +            no warnings;
  +            $version += 0; # force number
  +            return $version;
  +        }
  +    }
  +
  +    return 0; # didn't find the file or the version number
   }
   
   1;
  
  
  
  1.351     +4 -3      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.350
  retrieving revision 1.351
  diff -u -u -r1.350 -r1.351
  --- Changes   23 Mar 2004 02:34:19 -0000      1.350
  +++ Changes   24 Mar 2004 19:59:41 -0000      1.351
  @@ -12,9 +12,10 @@
   
   =item 1.99_14-dev
   
  -Fix Apache::Status, to gracefully recover from failing to load
  -Apache::Request when mp1's version is found. Previously it was
  -affecting Apache::compat [Stas]
  +Fix Apache::Status, to lookup the Apache::Request version without
  +loading it. Only if a suitable (2.x) version is found -- load and use
  +it. Previously loading the 1.x version was affecting Apache::compat.
  +[Stas]
   
   Fix a bug in special blocks handling (like END), which until now was
   dropping on the floor all blocks but the last one (mainly affecting
  
  
  

Reply via email to