use strict;
use ExtUtils::MakeMaker qw(prompt);
use FileHandle ();
+use File::Basename ();
use File::Path ();
use vars qw($VERSION);
-$VERSION = substr q$Revision: 1.16 $, 10;
+$VERSION = substr q$Revision: 1.30 $, 10;
=head1 NAME
$CPAN::Config ||= {};
local($/) = "\n";
local($\) = "";
+ local($|) = 1;
my($ans,$default,$local,$cont,$url,$expected_size);
# Files, directories
#
+ print qq[
+
+CPAN is the world-wide archive of perl resources. It consists of about
+100 sites that all replicate the same contents all around the globe.
+Many countries have at least one CPAN site already. The resources
+found on CPAN are easily accessible with the CPAN.pm module. If you
+want to use CPAN.pm, you have to configure it properly.
+
+If you do not want to enter a dialog now, you can answer 'no' to this
+question and I\'ll try to autoconfigure. (Note: you can revisit this
+dialog anytime later by typing 'o conf init' at the cpan prompt.)
+
+];
+
+ my $manual_conf =
+ ExtUtils::MakeMaker::prompt("Are you ready for manual configuration?",
+ "yes");
+ my $fastread;
+ {
+ local $^W;
+ if ($manual_conf =~ /^\s*y/i) {
+ $fastread = 0;
+ *prompt = \&ExtUtils::MakeMaker::prompt;
+ } else {
+ $fastread = 1;
+ *prompt = sub {
+ my($q,$a) = @_;
+ my($ret) = defined $a ? $a : "";
+ printf qq{%s [%s]\n\n}, $q, $ret;
+ $ret;
+ };
+ }
+ }
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.
+
+The following questions are intended to help you with the
+configuration. 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.
+
};
my $cpan_home = $CPAN::Config->{cpan_home} || MM->catdir($ENV{HOME}, ".cpan");
};
- 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;
- $ans = prompt("Where is your $prog program?",$path) || $path;
- $CPAN::Config->{$prog} = $ans;
+ my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
+ my $progname;
+ for $progname (qw/gzip tar unzip make lynx ncftpget ncftp ftp/){
+ my $progcall = $progname;
+ # we don't need ncftp if we have ncftpget
+ next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " ";
+ my $path = $CPAN::Config->{$progname}
+ || $Config::Config{$progname}
+ || "";
+ if (MM->file_name_is_absolute($path)) {
+ # testing existence is not good enough, some have these exe
+ # extensions
+
+ # warn "Warning: configured $path does not exist\n" unless -e $path;
+ # $path = "";
+ } else {
+ $path = '';
+ }
+ unless ($path) {
+ # e.g. make -> nmake
+ $progcall = $Config::Config{$progname} if $Config::Config{$progname};
+ }
+
+ $path ||= find_exe($progcall,[@path]);
+ warn "Warning: $progcall not found in PATH\n" unless
+ $path; # not -e $path, because find_exe already checked that
+ $ans = prompt("Where is your $progname program?",$path) || $path;
+ $CPAN::Config->{$progname} = $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;
#
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 inactivity during Makefile.PL?",$default);
+ # Proxies
- #
- # MIRRORED.BY
- #
+ print qq{
- $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.
+If you\'re accessing the net via proxies, you can specify them in the
+CPAN configuration or via environment variables. The variable in
+the \$CPAN::Config takes precedence.
-}
- } elsif (
- -s $local
- &&
- -M $local < 30
- ) {
- read_mirrored_by($local);
- } else {
- $CPAN::Config->{urllist} ||= [];
- while (! @{$CPAN::Config->{urllist}}) {
- my($input) = prompt(qq{
-We need to know the URL of your favorite CPAN site.
-Please enter it here:});
- $input =~ s/\s//g;
- next unless $input;
- my($wanted) = "MIRRORED.BY";
- print qq{
-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}};
- }
- }
+
+ for (qw/ftp_proxy http_proxy no_proxy/) {
+ $default = $CPAN::Config->{$_} || $ENV{$_};
+ $CPAN::Config->{$_} = prompt("Your $_?",$default);
}
+ #
+ # MIRRORED.BY
+ #
+
+ conf_sites() unless $fastread;
+
unless (@{$CPAN::Config->{'wait_list'}||[]}) {
print qq{
push @{$CPAN::Config->{'wait_list'}}, $ans;
}
- print qq{
-
-If you\'re accessing the net via proxies, you can specify them in the
-CPAN configuration or via environment variables. The variable in
-the \$CPAN::Config takes precedence.
-
-};
-
- for (qw/ftp_proxy http_proxy no_proxy/) {
- $default = $CPAN::Config->{$_} || $ENV{$_};
- $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);
}
+sub conf_sites {
+ my $m = 'MIRRORED.BY';
+ my $mby = MM->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;
+ File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
+ }
+ if ( ! -f $mby ){
+ print qq{You have no $mby
+ I\'m trying to fetch one
+};
+ $mby = CPAN::FTP->localize($m,$mby,3);
+ } elsif (-M $mby > 30 ) {
+ print qq{Your $mby is older than 30 days,
+ I\'m trying to fetch one
+};
+ $mby = CPAN::FTP->localize($m,$mby,3);
+ }
+ read_mirrored_by($mby);
+}
+
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;
}
}
my($cont,$country,$url,$item);
my(@cont) = sort keys %all;
for $cont (@cont) {
- $fh->print(" $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(
- " %-18s (%2d) %s\n",
+ " %-16s (%2d) %s\n",
$country,
++$item,
$url
}
}
$fh->close;
- $previous_best ||= 1;
+ $previous_best ||= "";
$default =
- @{$CPAN::Config->{urllist}} >= $expected_size ? "q" : $previous_best;
+ @{$CPAN::Config->{urllist}} >=
+ $expected_size ? "q" : $previous_best;
$ans = prompt(
"\nSelect an$other ftp or file URL or a number (q to finish)",
$default
push @{$CPAN::Config->{urllist}}, $url unless $seen{$url}++;
delete $all{$con}{$cou}{$url};
# print "Was a number [$ans] con[$con] cou[$cou] url[$url]\n";
- } elsif (@{$CPAN::Config->{urllist}} && $ans =~ /^q/i) {
+ } elsif ($ans =~ /^q/i) {
last;
} else {
$ans =~ s|/?$|/|; # has to end with one slash