Upgrade to Math::BigInt 1.53.
[p5sagit/p5-mst-13.2.git] / lib / CPAN / FirstTime.pm
index 713d7dd..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.43 $, 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
@@ -174,22 +176,48 @@ disable the cache scanning with 'never'.
     } while ($ans ne 'atstart' && $ans ne 'never');
     $CPAN::Config->{scan_cache} = $ans;
 
+    #
+    # cache_metadata
+    #
     print qq{
 
-To speed up the initial CPAN shell startup, it is possible to use
-Storable to create an cache of metadata. If Storable is not available,
-the normal index mechanism will be used. This feature is still
-considered experimantal and not recommended for production use.
+To considerably speed up the initial CPAN shell startup, it is
+possible to use Storable to create a cache of metadata. If Storable
+is not available, the normal index mechanism will be used.
 
 };
 
-    defined($default = $CPAN::Config->{cache_metadata}) or $default = 0;
+    defined($default = $CPAN::Config->{cache_metadata}) or $default = 1;
     do {
         $ans = prompt("Cache metadata (yes/no)?", ($default ? 'yes' : 'no'));
     } while ($ans !~ /^\s*[yn]/i);
     $CPAN::Config->{cache_metadata} = ($ans =~ /^\s*y/i ? 1 : 0);
 
     #
+    # term_is_latin
+    #
+    print qq{
+
+The next option deals with the charset your terminal supports. In
+general CPAN is English speaking territory, thus the charset does not
+matter much, but some of the aliens out there who upload their
+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, names
+will be output in UTF-8.
+
+};
+
+    defined($default = $CPAN::Config->{term_is_latin}) or $default = 1;
+    do {
+        $ans = prompt("Your terminal expects ISO-8859-1 (yes/no)?",
+                      ($default ? 'yes' : 'no'));
+    } while ($ans !~ /^\s*[yn]/i);
+    $CPAN::Config->{term_is_latin} = ($ans =~ /^\s*y/i ? 1 : 0);
+
+    #
     # prerequisites_policy
     # Do we follow PREREQ_PM?
     #
@@ -217,10 +245,11 @@ policy to one of the three values.
 
     print qq{
 
-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.
+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. To
+disable the use of a download program, you can type a space followed
+by ENTER.
 
 };
 
@@ -229,7 +258,7 @@ those.
     my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
     local $^W = $old_warn;
     my $progname;
-    for $progname (qw/gzip tar unzip make lynx ncftpget ncftp ftp/){
+    for $progname (qw/gzip tar unzip make lynx wget ncftpget ncftp ftp/){
       if ($^O eq 'MacOS') {
           $CPAN::Config->{$progname} = 'not_here';
           next;
@@ -240,7 +269,7 @@ those.
       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
 
@@ -267,7 +296,7 @@ those.
     $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 = "";
     }
@@ -287,9 +316,9 @@ those.
     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.
 
@@ -297,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
@@ -340,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
     #
@@ -369,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;
@@ -377,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
 };
@@ -407,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;
        }
@@ -418,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);
@@ -520,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));
@@ -548,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;