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
$CPAN::Config ||= {};
local($/) = "\n";
local($\) = "";
+ local($|) = 1;
my($ans,$default,$local,$cont,$url,$expected_size);
#
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.
}
$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{
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.
\(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} || "";
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);
#
#
$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
$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 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;
}
}
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)/;
undef $host;
$dst=$continent=$country="";
}
+ $fh->close;
$CPAN::Config->{urllist} ||= [];
if ($expected_size = @{$CPAN::Config->{urllist}}) {
for $url (@{$CPAN::Config->{urllist}}) {
$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(
$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;