fix CPAN.pm problem, OS2 tweaks
[p5sagit/p5-mst-13.2.git] / lib / CPAN / FirstTime.pm
index e970cf1..8d7a118 100644 (file)
@@ -12,9 +12,10 @@ package CPAN::FirstTime;
 
 use strict;
 use ExtUtils::MakeMaker qw(prompt);
-require File::Path;
+use FileHandle ();
+use File::Path ();
 use vars qw($VERSION);
-$VERSION = substr q$Revision: 1.13 $, 10;
+$VERSION = substr q$Revision: 1.21 $, 10;
 
 =head1 NAME
 
@@ -40,6 +41,7 @@ sub init {
     $CPAN::Config ||= {};
     local($/) = "\n";
     local($\) = "";
+    local($|) = 1;
 
     my($ans,$default,$local,$cont,$url,$expected_size);
     
@@ -48,7 +50,6 @@ sub init {
     #
 
     print qq{
-
 The CPAN module needs a directory of its own to cache important
 index files and maybe keep a temporary mirror of CPAN files. This may
 be a site-wide directory or a personal directory.
@@ -72,11 +73,15 @@ First of all, I\'d like to create this directory. Where?
     }
 
     $default = $cpan_home;
-    until (-d ($ans = prompt("CPAN build and cache directory?",$default)) && -w _) {
-       print "Couldn't find directory $ans
+    while ($ans = prompt("CPAN build and cache directory?",$default)) {
+       File::Path::mkpath($ans); # dies if it can't
+       if (-d $ans && -w _) {
+           last;
+       } else {
+           warn "Couldn't find directory $ans
   or directory is not writable. Please retry.\n";
+       }
     }
-    File::Path::mkpath($ans); # dies if it can't
     $CPAN::Config->{cpan_home} = $ans;
     
     print qq{
@@ -117,23 +122,40 @@ with all the intermediate files?
 
 The CPAN module will need a few external programs to work
 properly. Please correct me, if I guess the wrong path for a program.
+Don\'t panic if you do not have some of them, just press ENTER for
+those.
 
 };
 
-    my(@path) = split($Config{path_sep},$ENV{PATH});
+    my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
     my $prog;
-    for $prog (qw/gzip tar unzip make lynx ftp/){
-       my $path = $CPAN::Config->{$prog} || find_exe($prog,[@path]) || $prog;
+    for $prog (qw/gzip tar unzip make lynx ncftp ftp/){
+       my $path = $CPAN::Config->{$prog} || "";
+       if (MM->file_name_is_absolute($path)) {
+           warn "Warning: configured $path does not exist\n" unless -e $path;
+           $path = "";
+       } else {
+           $path = '';
+       }
+       $path ||= find_exe($prog,[@path]);
+       warn "Warning: $prog not found in PATH\n" unless -e $path;
        $ans = prompt("Where is your $prog program?",$path) || $path;
        $CPAN::Config->{$prog} = $ans;
     }
     my $path = $CPAN::Config->{'pager'} || 
        $ENV{PAGER} || find_exe("less",[@path]) || 
            find_exe("more",[@path]) || "more";
-    $ans = prompt("What is your favorite pager program?",$path) || $path;
+    $ans = prompt("What is your favorite pager program?",$path);
     $CPAN::Config->{'pager'} = $ans;
-    $path = $CPAN::Config->{'shell'} || $ENV{SHELL} || "";
-    $ans = prompt("What is your favorite shell?",$path) || $path;
+    $path = $CPAN::Config->{'shell'};
+    if (MM->file_name_is_absolute($path)) {
+       warn "Warning: configured $path does not exist\n" unless -e $path;
+       $path = "";
+    }
+    $path ||= $ENV{SHELL};
+    $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only
+    $ans = prompt("What is your favorite shell?",$path);
+    $CPAN::Config->{'shell'} = $ans;
 
     #
     # Arguments to make etc.
@@ -146,6 +168,8 @@ run \'make\' and \'make install\' in processes. If you have any parameters
 \(e.g. PREFIX, INSTALLPRIVLIB, UNINST or the like\) you want to pass to
 the calls, please specify them here.
 
+If you don\'t understand this question, just press ENTER.
+
 };
 
     $default = $CPAN::Config->{makepl_arg} || "";
@@ -169,13 +193,14 @@ without caring about them. As sometimes the Makefile.PL contains
 question you\'re expected to answer, you can set a timer that will
 kill a 'perl Makefile.PL' process after the specified time in seconds.
 
-If you set this value to 0, these processes will wait forever.
+If you set this value to 0, these processes will wait forever. This is
+the default and recommended setting.
 
 };
 
     $default = $CPAN::Config->{inactivity_timeout} || 0;
     $CPAN::Config->{inactivity_timeout} =
-       prompt("Timout for inacivity during Makefile.PL?",$default);
+       prompt("Timeout for inacivity during Makefile.PL?",$default);
 
 
     #
@@ -183,27 +208,65 @@ If you set this value to 0, these processes will wait forever.
     #
 
     $local = 'MIRRORED.BY';
+    $local = MM->catfile($CPAN::Config->{keep_source_where},"MIRRORED.BY") unless -f $local;
     if (@{$CPAN::Config->{urllist}||[]}) {
        print qq{
 I found a list of URLs in CPAN::Config and will use this.
-You can change it later with the 'o conf' command.
+You can change it later from CPAN shell with the 'o conf urllist' command.
 
 }
-    } elsif (-f $local) { # if they really have a wrong MIRRORED.BY in
-                          # the current directory, we can't help
+    } elsif (
+            -s $local
+            &&
+            -M $local < 30
+           ) {
        read_mirrored_by($local);
     } else {
        $CPAN::Config->{urllist} ||= [];
+       my $val = 'http://this.field.should.be.inserted/';
+       my $cnt = 0;
        while (! @{$CPAN::Config->{urllist}}) {
+           my($input) = prompt(qq{
+We need to know the URL of your favorite CPAN site.  Any one will go,
+you can change it later from CPAN shell with the 'o conf urllist' command.
+A short list is available in 'perlmodlib', as in
+       perldoc perlmodlib
+Please enter it here:}, $val);
+           $input =~ s/\s//g;
+           die "Did not obtain required field" if $cnt > 10;
+           $cnt++, next if $input eq $val;
+           next unless $input;
+           my($wanted) = "MIRRORED.BY";
            print qq{
-We need to know the URL of your favorite CPAN site.
-Please enter it here: };
-           chop($_ = <>);
-           s/\s//g;
-           push @{$CPAN::Config->{urllist}}, $_ if $_;
+Testing "$input" ...
+};
+           push @{$CPAN::Config->{urllist}}, $input;
+           CPAN::FTP->localize($wanted,$local,"force");
+           if (-s $local) {
+               print qq{
+"$input" seems to work
+};
+           } else {
+               my $ans = prompt(qq{$input doesn\'t seem to work. Keep it in the list?},"n");
+               last unless $ans =~ /^n/i;
+               pop @{$CPAN::Config->{urllist}};
+           }
        }
     }
 
+    unless (@{$CPAN::Config->{'wait_list'}||[]}) {
+       print qq{
+
+WAIT support is available as a Plugin. You need the CPAN::WAIT module
+to actually use it.  But we need to know your favorite WAIT server. If
+you don\'t know a WAIT server near you, just press ENTER.
+
+};
+       $default = "wait://ls6.informatik.uni-dortmund.de:1404";
+       $ans = prompt("Your favorite WAIT server?\n  ",$default);
+       push @{$CPAN::Config->{'wait_list'}}, $ans;
+    }
+
     print qq{
 
 If you\'re accessing the net via proxies, you can specify them in the
@@ -217,8 +280,9 @@ the \$CPAN::Config takes precedence.
        $CPAN::Config->{$_} = prompt("Your $_?",$default);
     }
 
-    # We don't ask that now, it will be noticed in time....
+    # We don't ask that now, it will be noticed in time, won't it?
     $CPAN::Config->{'inhibit_startup_message'} = 0;
+    $CPAN::Config->{'getcwd'} = 'cwd';
 
     print "\n\n";
     CPAN::Config->commit($configpm);
@@ -226,12 +290,11 @@ the \$CPAN::Config takes precedence.
 
 sub find_exe {
     my($exe,$path) = @_;
-    my($dir,$MY);
-    $MY = {};
-    bless $MY, 'MY';
+    my($dir);
+    #warn "in find_exe exe[$exe] path[@$path]";
     for $dir (@$path) {
-       my $abs = $MY->catfile($dir,$exe);
-       if ($MY->maybe_command($abs)) {
+       my $abs = MM->catfile($dir,$exe);
+       if (($abs = MM->maybe_command($abs))) {
            return $abs;
        }
     }
@@ -240,8 +303,9 @@ sub find_exe {
 sub read_mirrored_by {
     my($local) = @_;
     my(%all,$url,$expected_size,$default,$ans,$host,$dst,$country,$continent,@location);
-    open FH, $local or die "Couldn't open $local: $!";
-    while (<FH>) {
+    my $fh = FileHandle->new;
+    $fh->open($local) or die "Couldn't open $local: $!";
+    while (<$fh>) {
        ($host) = /^([\w\.\-]+)/ unless defined $host;
        next unless defined $host;
        next unless /\s+dst_(dst|location)/;
@@ -254,6 +318,7 @@ sub read_mirrored_by {
        undef $host;
        $dst=$continent=$country="";
     }
+    $fh->close;
     $CPAN::Config->{urllist} ||= [];
     if ($expected_size = @{$CPAN::Config->{urllist}}) {
        for $url (@{$CPAN::Config->{urllist}}) {
@@ -283,15 +348,16 @@ file:, ftp: or http: URL, or "q" to finish selecting.
     $ans = $other = "";
     my(%seen);
     
+    my $pipe = -t *STDIN ? "| $CPAN::Config->{'pager'}" : ">/dev/null";
     while () {
-       my $pipe = -t *STDIN ? "| $CPAN::Config->{'pager'}" : ">/dev/null";
        my(@valid,$previous_best);
-       open FH, $pipe;
+       my $fh = FileHandle->new;
+       $fh->open($pipe);
        {
            my($cont,$country,$url,$item);
            my(@cont) = sort keys %all;
            for $cont (@cont) {
-               print FH "    $cont\n";
+               $fh->print("    $cont\n");
                for $country (sort {lc $a cmp lc $b} keys %{$all{$cont}}) {
                    for $url (sort {lc $a cmp lc $b} keys %{$all{$cont}{$country}}) {
                        my $t = sprintf(
@@ -304,12 +370,12 @@ file:, ftp: or http: URL, or "q" to finish selecting.
                            $previous_best ||= $item;
                        }
                        push @valid, $all{$cont}{$country}{$url};
-                       print FH $t;
+                       $fh->print($t);
                    }
                }
            }
        }
-       close FH;
+       $fh->close;
        $previous_best ||= 1;
        $default =
            @{$CPAN::Config->{urllist}} >= $expected_size ? "q" : $previous_best;