1 package CPAN::Mirrored::By;
7 sub continent { shift->[0] }
8 sub country { shift->[1] }
11 package CPAN::FirstTime;
14 use ExtUtils::MakeMaker qw(prompt);
17 use vars qw($VERSION);
18 $VERSION = substr q$Revision: 1.21 $, 10;
22 CPAN::FirstTime - Utility for CPAN::Config file Initialization
26 CPAN::FirstTime::init()
30 The init routine asks a few questions and writes a CPAN::Config
31 file. Nothing special.
40 eval {require CPAN::Config;};
46 my($ans,$default,$local,$cont,$url,$expected_size);
53 The CPAN module needs a directory of its own to cache important
54 index files and maybe keep a temporary mirror of CPAN files. This may
55 be a site-wide directory or a personal directory.
58 my $cpan_home = $CPAN::Config->{cpan_home} || MM->catdir($ENV{HOME}, ".cpan");
62 I see you already have a directory
64 Shall we use it as the general CPAN build and cache directory?
70 First of all, I\'d like to create this directory. Where?
75 $default = $cpan_home;
76 while ($ans = prompt("CPAN build and cache directory?",$default)) {
77 File::Path::mkpath($ans); # dies if it can't
78 if (-d $ans && -w _) {
81 warn "Couldn't find directory $ans
82 or directory is not writable. Please retry.\n";
85 $CPAN::Config->{cpan_home} = $ans;
89 If you want, I can keep the source files after a build in the cpan
90 home directory. If you choose so then future builds will take the
91 files from there. If you don\'t want to keep them, answer 0 to the
96 $CPAN::Config->{keep_source_where} = MM->catdir($CPAN::Config->{cpan_home},"sources");
97 $CPAN::Config->{build_dir} = MM->catdir($CPAN::Config->{cpan_home},"build");
100 # Cache size, Index expire
105 How big should the disk cache be for keeping the build directories
106 with all the intermediate files?
110 $default = $CPAN::Config->{build_cache} || 10;
111 $ans = prompt("Cache size for build directory (in MB)?", $default);
112 $CPAN::Config->{build_cache} = $ans;
114 # XXX This the time when we refetch the index files (in days)
115 $CPAN::Config->{'index_expire'} = 1;
123 The CPAN module will need a few external programs to work
124 properly. Please correct me, if I guess the wrong path for a program.
125 Don\'t panic if you do not have some of them, just press ENTER for
130 my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
132 for $prog (qw/gzip tar unzip make lynx ncftp ftp/){
133 my $path = $CPAN::Config->{$prog} || "";
134 if (MM->file_name_is_absolute($path)) {
135 warn "Warning: configured $path does not exist\n" unless -e $path;
140 $path ||= find_exe($prog,[@path]);
141 warn "Warning: $prog not found in PATH\n" unless -e $path;
142 $ans = prompt("Where is your $prog program?",$path) || $path;
143 $CPAN::Config->{$prog} = $ans;
145 my $path = $CPAN::Config->{'pager'} ||
146 $ENV{PAGER} || find_exe("less",[@path]) ||
147 find_exe("more",[@path]) || "more";
148 $ans = prompt("What is your favorite pager program?",$path);
149 $CPAN::Config->{'pager'} = $ans;
150 $path = $CPAN::Config->{'shell'};
151 if (MM->file_name_is_absolute($path)) {
152 warn "Warning: configured $path does not exist\n" unless -e $path;
155 $path ||= $ENV{SHELL};
156 $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only
157 $ans = prompt("What is your favorite shell?",$path);
158 $CPAN::Config->{'shell'} = $ans;
161 # Arguments to make etc.
166 Every Makefile.PL is run by perl in a separate process. Likewise we
167 run \'make\' and \'make install\' in processes. If you have any parameters
168 \(e.g. PREFIX, INSTALLPRIVLIB, UNINST or the like\) you want to pass to
169 the calls, please specify them here.
171 If you don\'t understand this question, just press ENTER.
175 $default = $CPAN::Config->{makepl_arg} || "";
176 $CPAN::Config->{makepl_arg} =
177 prompt("Parameters for the 'perl Makefile.PL' command?",$default);
178 $default = $CPAN::Config->{make_arg} || "";
179 $CPAN::Config->{make_arg} = prompt("Parameters for the 'make' command?",$default);
181 $default = $CPAN::Config->{make_install_arg} || $CPAN::Config->{make_arg} || "";
182 $CPAN::Config->{make_install_arg} =
183 prompt("Parameters for the 'make install' command?",$default);
191 Sometimes you may wish to leave the processes run by CPAN alone
192 without caring about them. As sometimes the Makefile.PL contains
193 question you\'re expected to answer, you can set a timer that will
194 kill a 'perl Makefile.PL' process after the specified time in seconds.
196 If you set this value to 0, these processes will wait forever. This is
197 the default and recommended setting.
201 $default = $CPAN::Config->{inactivity_timeout} || 0;
202 $CPAN::Config->{inactivity_timeout} =
203 prompt("Timeout for inacivity during Makefile.PL?",$default);
210 $local = 'MIRRORED.BY';
211 $local = MM->catfile($CPAN::Config->{keep_source_where},"MIRRORED.BY") unless -f $local;
212 if (@{$CPAN::Config->{urllist}||[]}) {
214 I found a list of URLs in CPAN::Config and will use this.
215 You can change it later from CPAN shell with the 'o conf urllist' command.
223 read_mirrored_by($local);
225 $CPAN::Config->{urllist} ||= [];
226 my $val = 'http://this.field.should.be.inserted/';
228 while (! @{$CPAN::Config->{urllist}}) {
229 my($input) = prompt(qq{
230 We need to know the URL of your favorite CPAN site. Any one will go,
231 you can change it later from CPAN shell with the 'o conf urllist' command.
232 A short list is available in 'perlmodlib', as in
234 Please enter it here:}, $val);
236 die "Did not obtain required field" if $cnt > 10;
237 $cnt++, next if $input eq $val;
239 my($wanted) = "MIRRORED.BY";
243 push @{$CPAN::Config->{urllist}}, $input;
244 CPAN::FTP->localize($wanted,$local,"force");
247 "$input" seems to work
250 my $ans = prompt(qq{$input doesn\'t seem to work. Keep it in the list?},"n");
251 last unless $ans =~ /^n/i;
252 pop @{$CPAN::Config->{urllist}};
257 unless (@{$CPAN::Config->{'wait_list'}||[]}) {
260 WAIT support is available as a Plugin. You need the CPAN::WAIT module
261 to actually use it. But we need to know your favorite WAIT server. If
262 you don\'t know a WAIT server near you, just press ENTER.
265 $default = "wait://ls6.informatik.uni-dortmund.de:1404";
266 $ans = prompt("Your favorite WAIT server?\n ",$default);
267 push @{$CPAN::Config->{'wait_list'}}, $ans;
272 If you\'re accessing the net via proxies, you can specify them in the
273 CPAN configuration or via environment variables. The variable in
274 the \$CPAN::Config takes precedence.
278 for (qw/ftp_proxy http_proxy no_proxy/) {
279 $default = $CPAN::Config->{$_} || $ENV{$_};
280 $CPAN::Config->{$_} = prompt("Your $_?",$default);
283 # We don't ask that now, it will be noticed in time, won't it?
284 $CPAN::Config->{'inhibit_startup_message'} = 0;
285 $CPAN::Config->{'getcwd'} = 'cwd';
288 CPAN::Config->commit($configpm);
294 #warn "in find_exe exe[$exe] path[@$path]";
296 my $abs = MM->catfile($dir,$exe);
297 if (($abs = MM->maybe_command($abs))) {
303 sub read_mirrored_by {
305 my(%all,$url,$expected_size,$default,$ans,$host,$dst,$country,$continent,@location);
306 my $fh = FileHandle->new;
307 $fh->open($local) or die "Couldn't open $local: $!";
309 ($host) = /^([\w\.\-]+)/ unless defined $host;
310 next unless defined $host;
311 next unless /\s+dst_(dst|location)/;
312 /location\s+=\s+\"([^\"]+)/ and @location = (split /\s*,\s*/, $1) and
313 ($continent, $country) = @location[-1,-2];
314 $continent =~ s/\s\(.*//;
315 /dst_dst\s+=\s+\"([^\"]+)/ and $dst = $1;
316 next unless $host && $dst && $continent && $country;
317 $all{$continent}{$country}{$dst} = CPAN::Mirrored::By->new($continent,$country,$dst);
319 $dst=$continent=$country="";
322 $CPAN::Config->{urllist} ||= [];
323 if ($expected_size = @{$CPAN::Config->{urllist}}) {
324 for $url (@{$CPAN::Config->{urllist}}) {
325 # sanity check, scheme+colon, not "q" there:
326 next unless $url =~ /^\w+:\/./;
327 $all{"[From previous setup]"}{"found URL"}{$url}=CPAN::Mirrored::By->new('[From previous setup]','found URL',$url);
329 $CPAN::Config->{urllist} = [];
336 Now we need to know, where your favorite CPAN sites are located. Push
337 a few sites onto the array (just in case the first on the array won\'t
338 work). If you are mirroring CPAN to your local workstation, specify a
341 You can enter the number in front of the URL on the next screen, a
342 file:, ftp: or http: URL, or "q" to finish selecting.
346 $ans = prompt("Press RETURN to continue");
351 my $pipe = -t *STDIN ? "| $CPAN::Config->{'pager'}" : ">/dev/null";
353 my(@valid,$previous_best);
354 my $fh = FileHandle->new;
357 my($cont,$country,$url,$item);
358 my(@cont) = sort keys %all;
360 $fh->print(" $cont\n");
361 for $country (sort {lc $a cmp lc $b} keys %{$all{$cont}}) {
362 for $url (sort {lc $a cmp lc $b} keys %{$all{$cont}{$country}}) {
369 if ($cont =~ /^\[/) {
370 $previous_best ||= $item;
372 push @valid, $all{$cont}{$country}{$url};
379 $previous_best ||= 1;
381 @{$CPAN::Config->{urllist}} >= $expected_size ? "q" : $previous_best;
383 "\nSelect an$other ftp or file URL or a number (q to finish)",
388 my $this = $valid[$ans-1];
389 my($con,$cou,$url) = ($this->continent,$this->country,$this->url);
390 push @{$CPAN::Config->{urllist}}, $url unless $seen{$url}++;
391 delete $all{$con}{$cou}{$url};
392 # print "Was a number [$ans] con[$con] cou[$cou] url[$url]\n";
393 } elsif (@{$CPAN::Config->{urllist}} && $ans =~ /^q/i) {
396 $ans =~ s|/?$|/|; # has to end with one slash
397 $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
398 if ($ans =~ /^\w+:\/./) {
399 push @{$CPAN::Config->{urllist}}, $ans unless $seen{$ans}++;
401 print qq{"$ans" doesn\'t look like an URL at first sight.
402 I\'ll ignore it for now. You can add it to lib/CPAN/Config.pm
403 later and report a bug in my Makefile.PL to me (andreas koenig).