Upgrade to Math::BigInt 1.53.
[p5sagit/p5-mst-13.2.git] / lib / CPAN / FirstTime.pm
index 7560321..4eb5fc5 100644 (file)
@@ -1,3 +1,4 @@
+# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
 package CPAN::Mirrored::By;
 
 sub new { 
@@ -15,8 +16,9 @@ use ExtUtils::MakeMaker qw(prompt);
 use FileHandle ();
 use File::Basename ();
 use File::Path ();
+use File::Spec;
 use vars qw($VERSION);
-$VERSION = substr q$Revision: 1.48 $, 10;
+$VERSION = substr q$Revision: 1.54 $, 10;
 
 =head1 NAME
 
@@ -96,7 +98,7 @@ This may be a site-wide directory or a personal directory.
 
 };
 
-    my $cpan_home = $CPAN::Config->{cpan_home} || MM->catdir($ENV{HOME}, ".cpan");
+    my $cpan_home = $CPAN::Config->{cpan_home} || File::Spec->catdir($ENV{HOME}, ".cpan");
     if (-d $cpan_home) {
        print qq{
 
@@ -139,8 +141,8 @@ next question.
 
 };
 
-    $CPAN::Config->{keep_source_where} = MM->catdir($CPAN::Config->{cpan_home},"sources");
-    $CPAN::Config->{build_dir} = MM->catdir($CPAN::Config->{cpan_home},"build");
+    $CPAN::Config->{keep_source_where} = File::Spec->catdir($CPAN::Config->{cpan_home},"sources");
+    $CPAN::Config->{build_dir} = File::Spec->catdir($CPAN::Config->{cpan_home},"build");
 
     #
     # Cache size, Index expire
@@ -203,7 +205,7 @@ software to CPAN bear names that are outside the ASCII range. If your
 terminal supports UTF-8, you say no to the next question, if it
 supports ISO-8859-1 (also known as LATIN1) then you say yes, and if it
 supports neither nor, your answer does not matter, you will not be
-able to read the names of some authors anyway. If you answer no, nmes
+able to read the names of some authors anyway. If you answer no, names
 will be output in UTF-8.
 
 };
@@ -267,7 +269,7 @@ by ENTER.
       my $path = $CPAN::Config->{$progname} 
          || $Config::Config{$progname}
              || "";
-      if (MM->file_name_is_absolute($path)) {
+      if (File::Spec->file_name_is_absolute($path)) {
        # testing existence is not good enough, some have these exe
        # extensions
 
@@ -294,7 +296,7 @@ by ENTER.
     $ans = prompt("What is your favorite pager program?",$path);
     $CPAN::Config->{'pager'} = $ans;
     $path = $CPAN::Config->{'shell'};
-    if (MM->file_name_is_absolute($path)) {
+    if (File::Spec->file_name_is_absolute($path)) {
        warn "Warning: configured $path does not exist\n" unless -e $path;
        $path = "";
     }
@@ -314,9 +316,9 @@ by ENTER.
     print qq{
 
 Every Makefile.PL is run by perl in a separate process. Likewise we
-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.
+run \'make\' and \'make install\' in processes. If you have any
+parameters \(e.g. PREFIX, LIB, 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.
 
@@ -324,13 +326,29 @@ If you don\'t understand this question, just press ENTER.
 
     $default = $CPAN::Config->{makepl_arg} || "";
     $CPAN::Config->{makepl_arg} =
-       prompt("Parameters for the 'perl Makefile.PL' command?",$default);
+       prompt("Parameters for the 'perl Makefile.PL' command?
+Typical frequently used settings:
+
+    POLLUTE=1        increasing backwards compatibility
+    LIB=~/perl       non-root users (please see manual for more hints)
+
+Your choice: ",$default);
     $default = $CPAN::Config->{make_arg} || "";
-    $CPAN::Config->{make_arg} = prompt("Parameters for the 'make' command?",$default);
+    $CPAN::Config->{make_arg} = prompt("Parameters for the 'make' command?
+Typical frequently used setting:
+
+    -j3              dual processor system
+
+Your choice: ",$default);
 
     $default = $CPAN::Config->{make_install_arg} || $CPAN::Config->{make_arg} || "";
     $CPAN::Config->{make_install_arg} =
-       prompt("Parameters for the 'make install' command?",$default);
+       prompt("Parameters for the 'make install' command?
+Typical frequently used setting:
+
+    UNINST=1         to always uninstall potentially conflicting files
+
+Your choice: ",$default);
 
     #
     # Alarm period
@@ -367,6 +385,44 @@ the \$CPAN::Config takes precedence.
        $CPAN::Config->{$_} = prompt("Your $_?",$default);
     }
 
+    if ($CPAN::Config->{ftp_proxy} ||
+        $CPAN::Config->{http_proxy}) {
+        $default = $CPAN::Config->{proxy_user} || $CPAN::LWP::UserAgent::USER;
+        print qq{
+
+If your proxy is an authenticating proxy, you can store your username
+permanently. If you do not want that, just press RETURN. You will then
+be asked for your username in every future session.
+
+};
+        if ($CPAN::Config->{proxy_user} = prompt("Your proxy user id?",$default)) {
+            print qq{
+
+Your password for the authenticating proxy can also be stored
+permanently on disk. If this violates your security policy, just press
+RETURN. You will then be asked for the password in every future
+session.
+
+};
+
+            if ($CPAN::META->has_inst("Term::ReadKey")) {
+                Term::ReadKey::ReadMode("noecho");
+            } else {
+                print qq{
+
+Warning: Term::ReadKey seems not to be available, your password will
+be echoed to the terminal!
+
+};
+            }
+            $CPAN::Config->{proxy_pass} = prompt("Your proxy password?");
+            if ($CPAN::META->has_inst("Term::ReadKey")) {
+                Term::ReadKey::ReadMode("restore");
+            }
+            $CPAN::Frontend->myprint("\n\n");
+        }
+    }
+
     #
     # MIRRORED.BY
     #
@@ -396,7 +452,7 @@ you don\'t know a WAIT server near you, just press ENTER.
 
 sub conf_sites {
   my $m = 'MIRRORED.BY';
-  my $mby = MM->catfile($CPAN::Config->{keep_source_where},$m);
+  my $mby = File::Spec->catfile($CPAN::Config->{keep_source_where},$m);
   File::Path::mkpath(File::Basename::dirname($mby));
   if (-f $mby && -f $m && -M $m < -M $mby) {
     require File::Copy;
@@ -404,8 +460,26 @@ sub conf_sites {
   }
   my $loopcount = 0;
   local $^T = time;
+  my $overwrite_local = 0;
+  if ($mby && -f $mby && -M _ <= 60 && -s _ > 0) {
+      my $mtime = localtime((stat _)[9]);
+      my $prompt = qq{Found $mby as of $mtime
+
+I\'d use that as a database of CPAN sites. If that is OK for you,
+please answer 'y', but if you want me to get a new database now,
+please answer 'n' to the following question.
+
+Shall I use the local database in $mby?};
+      my $ans = prompt($prompt,"y");
+      $overwrite_local = 1 unless $ans =~ /^y/i;
+  }
   while ($mby) {
-    if ( ! -f $mby ){
+    if ($overwrite_local) {
+      print qq{Trying to overwrite $mby
+};
+      $mby = CPAN::FTP->localize($m,$mby,3);
+      $overwrite_local = 0;
+    } elsif ( ! -f $mby ){
       print qq{You have no $mby
   I\'m trying to fetch one
 };
@@ -434,7 +508,7 @@ sub find_exe {
     my($dir);
     #warn "in find_exe exe[$exe] path[@$path]";
     for $dir (@$path) {
-       my $abs = MM->catfile($dir,$exe);
+       my $abs = File::Spec->catfile($dir,$exe);
        if (($abs = MM->maybe_command($abs))) {
            return $abs;
        }
@@ -445,28 +519,50 @@ sub picklist {
     my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_;
     $default ||= '';
 
-    my ($item, $i);
-    for $item (@$items) {
-       printf "(%d) %s\n", ++$i, $item;
-    }
+       my $pos = 0;
 
     my @nums;
     while (1) {
-       my $num = prompt($prompt,$default);
-       @nums = split (' ', $num);
-       (warn "invalid items entered, try again\n"), next
-           if grep (/\D/ || $_ < 1 || $_ > $i, @nums);
-       if ($require_nonempty) {
-           (warn "$empty_warning\n"), next
-               unless @nums;
-       }
-       last;
+
+               # display, at most, 15 items at a time
+               my $limit = $#{ $items } - $pos;
+               $limit = 15 if $limit > 15;
+
+               # show the next $limit items, get the new position
+               $pos = display_some($items, $limit, $pos);
+               $pos = 0 if $pos >= @$items;
+
+               my $num = prompt($prompt,$default);
+               
+               @nums = split (' ', $num);
+               my $i = scalar @$items;
+               (warn "invalid items entered, try again\n"), next
+                   if grep (/\D/ || $_ < 1 || $_ > $i, @nums);
+               if ($require_nonempty) {
+                   (warn "$empty_warning\n");
+               }
+       print "\n";
+
+               # a blank line continues...
+               next unless @nums;
+               last;
     }
-    print "\n";
     for (@nums) { $_-- }
     @{$items}[@nums];
 }
 
+sub display_some {
+       my ($items, $limit, $pos) = @_;
+       $pos ||= 0;
+
+       my @displayable = @$items[$pos .. ($pos + $limit)];
+    for my $item (@displayable) {
+               printf "(%d) %s\n", ++$pos, $item;
+    }
+       printf "%d more items, hit ENTER\n", (@$items - $pos) if $pos < @$items;
+       return $pos;
+}
+
 sub read_mirrored_by {
     my $local = shift or return;
     my(%all,$url,$expected_size,$default,$ans,$host,$dst,$country,$continent,@location);
@@ -547,7 +643,8 @@ http: -- that host a CPAN mirror.
         }
     }
     push (@urls, map ("$_ (previous pick)", @previous_urls));
-    my $prompt = "Select as many URLs as you like";
+    my $prompt = "Select as many URLs as you like,
+put them on one line, separated by blanks";
     if (@previous_urls) {
        $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) ..
                              (scalar @urls));
@@ -575,11 +672,15 @@ Please enter your CPAN site:};
             $ans =~ s|/?\z|/|; # has to end with one slash
             $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
             if ($ans =~ /^\w+:\/./) {
-               push @urls, $ans unless $seen{$ans}++;
+                push @urls, $ans unless $seen{$ans}++;
             } else {
-                print qq{"$ans" doesn\'t look like an URL at first sight.
-I\'ll ignore it for now.  You can add it to $INC{'CPAN/MyConfig.pm'}
-later if you\'re sure it\'s right.\n};
+                printf(qq{"%s" doesn\'t look like an URL at first sight.
+I\'ll ignore it for now.
+You can add it to your %s
+later if you\'re sure it\'s right.\n},
+                       $ans,
+                       $INC{'CPAN/MyConfig.pm'} || $INC{'CPAN/Config.pm'} || "configuration file",
+                      );
             }
         }
     } while $ans || !%seen;