X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCPAN%2FFirstTime.pm;h=8d7a118a9d343b916c56fd30120446513c3b4bd8;hb=13bc20ff1c1c1ed66d854591abb2409e14aff8a1;hp=e970cf1535839f027a614eedcab8976184a7b97c;hpb=da199366aa5ce8c7b022c7fe15903f820a6cd708;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/CPAN/FirstTime.pm b/lib/CPAN/FirstTime.pm index e970cf1..8d7a118 100644 --- a/lib/CPAN/FirstTime.pm +++ b/lib/CPAN/FirstTime.pm @@ -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 () { + 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;