Change anchor generation in Pod::Html for "=item item 2"
[p5sagit/p5-mst-13.2.git] / lib / CPAN / FirstTime.pm
CommitLineData
8d97e4a1 1# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
5f05dabc 2package CPAN::Mirrored::By;
e82b9348 3use strict;
1a43333d 4use vars qw($VERSION);
87892b73 5$VERSION = sprintf "%.6f", substr(q$Rev: 657 $,4)/1000000 + 5.4;
5f05dabc 6
7sub new {
8 my($self,@arg) = @_;
9 bless [@arg], $self;
10}
da199366 11sub continent { shift->[0] }
12sub country { shift->[1] }
5f05dabc 13sub url { shift->[2] }
14
15package CPAN::FirstTime;
16
17use strict;
f915a99a 18use ExtUtils::MakeMaker ();
05454584 19use FileHandle ();
09d9d230 20use File::Basename ();
05454584 21use File::Path ();
5de3f0da 22use File::Spec;
5f05dabc 23use vars qw($VERSION);
87892b73 24$VERSION = sprintf "%.6f", substr(q$Rev: 657 $,4)/1000000 + 5.4;
5f05dabc 25
26=head1 NAME
27
28CPAN::FirstTime - Utility for CPAN::Config file Initialization
29
30=head1 SYNOPSIS
31
32CPAN::FirstTime::init()
33
34=head1 DESCRIPTION
35
c9869e1c 36The init routine asks a few questions and writes a CPAN/Config.pm or
37CPAN/MyConfig.pm file (depending on what it is currently using).
38
5f05dabc 39
40=cut
41
9ddc4ed0 42use vars qw( %prompts );
43
5f05dabc 44sub init {
554a9ef5 45 my($configpm, %args) = @_;
5f05dabc 46 use Config;
9ddc4ed0 47 # extra arg in 'o conf init make' selects only $item =~ /make/
48 my $matcher = $args{args} && @{$args{args}} ? $args{args}[0] : '';
c9869e1c 49 CPAN->debug("matcher[$matcher]") if $CPAN::DEBUG;
554a9ef5 50
f610777f 51 unless ($CPAN::VERSION) {
52 require CPAN::Nox;
53 }
87892b73 54 require CPAN::HandleConfig;
55 CPAN::HandleConfig::require_myconfig_or_config();
5f05dabc 56 $CPAN::Config ||= {};
da199366 57 local($/) = "\n";
58 local($\) = "";
13bc20ff 59 local($|) = 1;
da199366 60
5fc0f0f6 61 my($ans,$default);
f610777f 62
da199366 63 #
64 # Files, directories
65 #
66
9ddc4ed0 67 print $prompts{manual_config};
09d9d230 68
554a9ef5 69 my $manual_conf;
70
71 local *_real_prompt = \&ExtUtils::MakeMaker::prompt;
72 if ( $args{autoconfig} ) {
73 $manual_conf = "no";
74 } else {
75 $manual_conf = prompt("Are you ready for manual configuration?", "yes");
76 }
09d9d230 77 my $fastread;
78 {
f915a99a 79 if ($manual_conf =~ /^y/i) {
09d9d230 80 $fastread = 0;
09d9d230 81 } else {
82 $fastread = 1;
36263cb3 83 $CPAN::Config->{urllist} ||= [];
f915a99a 84
85 local $^W = 0;
c9d9b473 86 # prototype should match that of &MakeMaker::prompt
f915a99a 87 *_real_prompt = sub ($;$) {
09d9d230 88 my($q,$a) = @_;
89 my($ret) = defined $a ? $a : "";
554a9ef5 90 $CPAN::Frontend->myprint(sprintf qq{%s [%s]\n\n}, $q, $ret);
91 eval { require Time::HiRes };
92 unless ($@) {
93 Time::HiRes::sleep(0.1);
94 }
09d9d230 95 $ret;
96 };
97 }
98 }
9ddc4ed0 99
c9869e1c 100 $CPAN::Frontend->myprint($prompts{config_intro})
101 if !$matcher or 'config_intro' =~ /$matcher/;
9ddc4ed0 102
103 my $cpan_home = $CPAN::Config->{cpan_home}
104 || File::Spec->catdir($ENV{HOME}, ".cpan");
5f05dabc 105
5f05dabc 106 if (-d $cpan_home) {
c9869e1c 107 if (!$matcher or 'config_intro' =~ /$matcher/) {
108 $CPAN::Frontend->myprint(qq{
5f05dabc 109
110I see you already have a directory
111 $cpan_home
112Shall we use it as the general CPAN build and cache directory?
113
554a9ef5 114});
c9869e1c 115 }
9ddc4ed0 116 } else {
c9869e1c 117 # no cpan-home, must prompt and get one
9ddc4ed0 118 $CPAN::Frontend->myprint($prompts{cpan_home_where});
5f05dabc 119 }
120
121 $default = $cpan_home;
05454584 122 while ($ans = prompt("CPAN build and cache directory?",$default)) {
5fc0f0f6 123 unless (File::Spec->file_name_is_absolute($ans)) {
124 require Cwd;
125 my $cwd = Cwd::cwd();
126 my $absans = File::Spec->catdir($cwd,$ans);
127 warn "The path '$ans' is not an absolute path. Please specify an absolute path\n";
128 $default = $absans;
129 next;
130 }
36263cb3 131 eval { File::Path::mkpath($ans); }; # dies if it can't
132 if ($@) {
9ddc4ed0 133 warn "Couldn't create directory $ans.\nPlease retry.\n";
36263cb3 134 next;
135 }
136 if (-d $ans && -w _) {
137 last;
138 } else {
9ddc4ed0 139 warn "Couldn't find directory $ans\n"
140 . "or directory is not writable. Please retry.\n";
36263cb3 141 }
10b2abe6 142 }
5f05dabc 143 $CPAN::Config->{cpan_home} = $ans;
f610777f 144
9ddc4ed0 145 $CPAN::Frontend->myprint($prompts{keep_source_where});
5f05dabc 146
9ddc4ed0 147 $CPAN::Config->{keep_source_where}
148 = File::Spec->catdir($CPAN::Config->{cpan_home},"sources");
5f05dabc 149
9ddc4ed0 150 $CPAN::Config->{build_dir}
151 = File::Spec->catdir($CPAN::Config->{cpan_home},"build");
5f05dabc 152
da199366 153 #
154 # Cache size, Index expire
155 #
156
c9869e1c 157 $CPAN::Frontend->myprint($prompts{build_cache_intro})
158 if !$matcher or 'build_cache_intro' =~ /$matcher/;
5f05dabc 159
9ddc4ed0 160 # large enough to build large dists like Tk
161 my_dflt_prompt(build_cache => 100, $matcher);
5f05dabc 162
163 # XXX This the time when we refetch the index files (in days)
164 $CPAN::Config->{'index_expire'} = 1;
165
c9869e1c 166 $CPAN::Frontend->myprint($prompts{scan_cache_intro})
167 if !$matcher or 'build_cache_intro' =~ /$matcher/;
168
9ddc4ed0 169 my_prompt_loop(scan_cache => 'atstart', $matcher, 'atstart|never');
f610777f 170
9d61fa1d 171 #
172 # cache_metadata
173 #
5e05dca5 174
c9869e1c 175 if (!$matcher or 'build_cache_intro' =~ /$matcher/) {
5e05dca5 176
c9869e1c 177 $CPAN::Frontend->myprint($prompts{cache_metadata});
5e05dca5 178
c9869e1c 179 defined($default = $CPAN::Config->{cache_metadata}) or $default = 1;
180 do {
181 $ans = prompt("Cache metadata (yes/no)?", ($default ? 'yes' : 'no'));
182 } while ($ans !~ /^[yn]/i);
183 $CPAN::Config->{cache_metadata} = ($ans =~ /^y/i ? 1 : 0);
184 }
f610777f 185 #
9d61fa1d 186 # term_is_latin
187 #
9d61fa1d 188
c9869e1c 189 $CPAN::Frontend->myprint($prompts{term_is_latin})
190 if !$matcher or 'term_is_latin' =~ /$matcher/;
9d61fa1d 191
192 defined($default = $CPAN::Config->{term_is_latin}) or $default = 1;
193 do {
194 $ans = prompt("Your terminal expects ISO-8859-1 (yes/no)?",
195 ($default ? 'yes' : 'no'));
f915a99a 196 } while ($ans !~ /^[yn]/i);
197 $CPAN::Config->{term_is_latin} = ($ans =~ /^y/i ? 1 : 0);
9d61fa1d 198
199 #
c9869e1c 200 # save history in file 'histfile'
5fc0f0f6 201 #
5fc0f0f6 202
c9869e1c 203 $CPAN::Frontend->myprint($prompts{histfile_intro});
5fc0f0f6 204
205 defined($default = $CPAN::Config->{histfile}) or
206 $default = File::Spec->catfile($CPAN::Config->{cpan_home},"histfile");
207 $ans = prompt("File to save your history?", $default);
5fc0f0f6 208 $CPAN::Config->{histfile} = $ans;
209
210 if ($CPAN::Config->{histfile}) {
211 defined($default = $CPAN::Config->{histsize}) or $default = 100;
212 $ans = prompt("Number of lines to save?", $default);
213 $CPAN::Config->{histsize} = $ans;
214 }
215
216 #
554a9ef5 217 # do an ls on the m or the d command
218 #
9ddc4ed0 219 $CPAN::Frontend->myprint($prompts{show_upload_date_intro});
554a9ef5 220
221 defined($default = $CPAN::Config->{show_upload_date}) or
9ddc4ed0 222 $default = 'n';
223 $ans = prompt("Always try to show upload date with 'd' and 'm' command (yes/no)?",
224 ($default ? 'yes' : 'no'));
225 $CPAN::Config->{show_upload_date} = ($ans =~ /^[y1]/i ? 1 : 0);
226
227 #my_prompt_loop(show_upload_date => 'n', $matcher,
228 #'follow|ask|ignore');
554a9ef5 229
230 #
f610777f 231 # prerequisites_policy
232 # Do we follow PREREQ_PM?
233 #
f610777f 234
c9869e1c 235 $CPAN::Frontend->myprint($prompts{prerequisites_policy_intro})
236 if !$matcher or 'prerequisites_policy_intro' =~ /$matcher/;
f610777f 237
9ddc4ed0 238 my_prompt_loop(prerequisites_policy => 'ask', $matcher,
239 'follow|ask|ignore');
f610777f 240
f610777f 241
da199366 242 #
243 # External programs
244 #
245
c9869e1c 246 $CPAN::Frontend->myprint($prompts{external_progs})
247 if !$matcher or 'external_progs' =~ /$matcher/;
5f05dabc 248
f14b5cec 249 my $old_warn = $^W;
250 local $^W if $^O eq 'MacOS';
55e314ee 251 my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
f14b5cec 252 local $^W = $old_warn;
09d9d230 253 my $progname;
e82b9348 254 for $progname (qw/bzip2 gzip tar unzip make
554a9ef5 255 curl lynx wget ncftpget ncftp ftp
73beb80c 256 gpg/)
257 {
f14b5cec 258 if ($^O eq 'MacOS') {
259 $CPAN::Config->{$progname} = 'not_here';
260 next;
261 }
9ddc4ed0 262 next if $matcher && $progname !~ /$matcher/;
263
09d9d230 264 my $progcall = $progname;
2e2b7522 265 # we don't need ncftp if we have ncftpget
266 next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " ";
267 my $path = $CPAN::Config->{$progname}
268 || $Config::Config{$progname}
269 || "";
5de3f0da 270 if (File::Spec->file_name_is_absolute($path)) {
2e2b7522 271 # testing existence is not good enough, some have these exe
272 # extensions
273
274 # warn "Warning: configured $path does not exist\n" unless -e $path;
275 # $path = "";
276 } else {
277 $path = '';
278 }
279 unless ($path) {
280 # e.g. make -> nmake
281 $progcall = $Config::Config{$progname} if $Config::Config{$progname};
282 }
09d9d230 283
2e2b7522 284 $path ||= find_exe($progcall,[@path]);
554a9ef5 285 $CPAN::Frontend->mywarn("Warning: $progcall not found in PATH\n") unless
2e2b7522 286 $path; # not -e $path, because find_exe already checked that
287 $ans = prompt("Where is your $progname program?",$path) || $path;
288 $CPAN::Config->{$progname} = $ans;
5f05dabc 289 }
290 my $path = $CPAN::Config->{'pager'} ||
291 $ENV{PAGER} || find_exe("less",[@path]) ||
f14b5cec 292 find_exe("more",[@path]) || ($^O eq 'MacOS' ? $ENV{EDITOR} : 0 )
293 || "more";
55e314ee 294 $ans = prompt("What is your favorite pager program?",$path);
5f05dabc 295 $CPAN::Config->{'pager'} = $ans;
55e314ee 296 $path = $CPAN::Config->{'shell'};
5de3f0da 297 if (File::Spec->file_name_is_absolute($path)) {
55e314ee 298 warn "Warning: configured $path does not exist\n" unless -e $path;
299 $path = "";
300 }
301 $path ||= $ENV{SHELL};
c9869e1c 302 $path ||= $ENV{COMSPEC} if $^O eq "MSWin32";
f14b5cec 303 if ($^O eq 'MacOS') {
304 $CPAN::Config->{'shell'} = 'not_here';
305 } else {
306 $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only
307 $ans = prompt("What is your favorite shell?",$path);
308 $CPAN::Config->{'shell'} = $ans;
309 }
da199366 310
311 #
312 # Arguments to make etc.
313 #
314
c9869e1c 315 $CPAN::Frontend->myprint($prompts{prefer_installer_intro})
316 if !$matcher or 'prerequisites_policy_intro' =~ /$matcher/;
e82b9348 317
9ddc4ed0 318 my_prompt_loop(prefer_installer => 'EUMM', $matcher, 'MB|EUMM');
e82b9348 319
e82b9348 320
c9869e1c 321 $CPAN::Frontend->myprint($prompts{makepl_arg_intro})
322 if !$matcher or 'makepl_arg_intro' =~ /$matcher/;
e82b9348 323
9ddc4ed0 324 my_dflt_prompt(makepl_arg => "", $matcher);
e82b9348 325
9ddc4ed0 326 my_dflt_prompt(make_arg => "", $matcher);
e82b9348 327
44d21104 328 require CPAN::HandleConfig;
329 if (exists $CPAN::HandleConfig::keys{make_install_make_command}) {
330 # as long as Windows needs $self->_build_command, we cannot
331 # support sudo on windows :-)
332 my_dflt_prompt(make_install_make_command => $CPAN::Config->{make} || "",
333 $matcher);
334 }
e82b9348 335
9ddc4ed0 336 my_dflt_prompt(make_install_arg => $CPAN::Config->{make_arg} || "",
337 $matcher);
e82b9348 338
c9869e1c 339 $CPAN::Frontend->myprint($prompts{mbuildpl_arg_intro})
340 if !$matcher or 'mbuildpl_arg_intro' =~ /$matcher/;
e82b9348 341
9ddc4ed0 342 my_dflt_prompt(mbuildpl_arg => "", $matcher);
e82b9348 343
9ddc4ed0 344 my_dflt_prompt(mbuild_arg => "", $matcher);
e82b9348 345
44d21104 346 if (exists $CPAN::HandleConfig::keys{mbuild_install_build_command}) {
347 # as long as Windows needs $self->_build_command, we cannot
348 # support sudo on windows :-)
349 my_dflt_prompt(mbuild_install_build_command => "./Build", $matcher);
350 }
8d97e4a1 351
9ddc4ed0 352 my_dflt_prompt(mbuild_install_arg => "", $matcher);
5f05dabc 353
da199366 354 #
355 # Alarm period
356 #
357
c9869e1c 358 $CPAN::Frontend->myprint($prompts{inactivity_timeout_intro})
359 if !$matcher or 'inactivity_timeout_intro' =~ /$matcher/;
10b2abe6 360
9ddc4ed0 361 # my_dflt_prompt(inactivity_timeout => 0);
10b2abe6 362
363 $default = $CPAN::Config->{inactivity_timeout} || 0;
364 $CPAN::Config->{inactivity_timeout} =
9ddc4ed0 365 prompt("Timeout for inactivity during {Makefile,Build}.PL?",$default);
10b2abe6 366
09d9d230 367 # Proxies
da199366 368
c9869e1c 369 $CPAN::Frontend->myprint($prompts{proxy_intro})
370 if !$matcher or 'proxy_intro' =~ /$matcher/;
09d9d230 371
372 for (qw/ftp_proxy http_proxy no_proxy/) {
c9869e1c 373 next if $matcher and $_ =~ /$matcher/;
374
09d9d230 375 $default = $CPAN::Config->{$_} || $ENV{$_};
376 $CPAN::Config->{$_} = prompt("Your $_?",$default);
5f05dabc 377 }
378
c049f953 379 if ($CPAN::Config->{ftp_proxy} ||
380 $CPAN::Config->{http_proxy}) {
9ddc4ed0 381
c049f953 382 $default = $CPAN::Config->{proxy_user} || $CPAN::LWP::UserAgent::USER;
c049f953 383
9ddc4ed0 384 $CPAN::Frontend->myprint($prompts{proxy_user});
c049f953 385
c049f953 386 if ($CPAN::Config->{proxy_user} = prompt("Your proxy user id?",$default)) {
9ddc4ed0 387 $CPAN::Frontend->myprint($prompts{proxy_pass});
c049f953 388
389 if ($CPAN::META->has_inst("Term::ReadKey")) {
390 Term::ReadKey::ReadMode("noecho");
391 } else {
9ddc4ed0 392 $CPAN::Frontend->myprint($prompts{password_warn});
c049f953 393 }
f915a99a 394 $CPAN::Config->{proxy_pass} = prompt_no_strip("Your proxy password?");
c049f953 395 if ($CPAN::META->has_inst("Term::ReadKey")) {
396 Term::ReadKey::ReadMode("restore");
397 }
398 $CPAN::Frontend->myprint("\n\n");
399 }
400 }
401
09d9d230 402 #
403 # MIRRORED.BY
404 #
405
406 conf_sites() unless $fastread;
407
ca79d794 408 # We don't ask these now, the defaults are very likely OK.
409 $CPAN::Config->{inhibit_startup_message} = 0;
410 $CPAN::Config->{getcwd} = 'cwd';
411 $CPAN::Config->{ftp_passive} = 1;
5f05dabc 412
554a9ef5 413 $CPAN::Frontend->myprint("\n\n");
e82b9348 414 CPAN::HandleConfig->commit($configpm);
5f05dabc 415}
416
9ddc4ed0 417sub my_dflt_prompt {
418 my ($item, $dflt, $m) = @_;
419 my $default = $CPAN::Config->{$item} || $dflt;
420
421 $DB::single = 1;
422 if (!$m || $item =~ /$m/) {
423 $CPAN::Config->{$item} = prompt($prompts{$item}, $default);
424 } else {
425 $CPAN::Config->{$item} = $default;
426 }
427}
428
429sub my_prompt_loop {
430 my ($item, $dflt, $m, $ok) = @_;
431 my $default = $CPAN::Config->{$item} || $dflt;
432 my $ans;
433
434 $DB::single = 1;
435 if (!$m || $item =~ /$m/) {
436 do { $ans = prompt($prompts{$item}, $default);
437 } until $ans =~ /$ok/;
438 $CPAN::Config->{$item} = $ans;
439 } else {
440 $CPAN::Config->{$item} = $default;
441 }
442}
443
444
09d9d230 445sub conf_sites {
446 my $m = 'MIRRORED.BY';
5de3f0da 447 my $mby = File::Spec->catfile($CPAN::Config->{keep_source_where},$m);
09d9d230 448 File::Path::mkpath(File::Basename::dirname($mby));
449 if (-f $mby && -f $m && -M $m < -M $mby) {
450 require File::Copy;
451 File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
452 }
911a92db 453 my $loopcount = 0;
de34a54b 454 local $^T = time;
d8773709 455 my $overwrite_local = 0;
456 if ($mby && -f $mby && -M _ <= 60 && -s _ > 0) {
457 my $mtime = localtime((stat _)[9]);
458 my $prompt = qq{Found $mby as of $mtime
459
c049f953 460I\'d use that as a database of CPAN sites. If that is OK for you,
461please answer 'y', but if you want me to get a new database now,
462please answer 'n' to the following question.
d8773709 463
c049f953 464Shall I use the local database in $mby?};
d8773709 465 my $ans = prompt($prompt,"y");
466 $overwrite_local = 1 unless $ans =~ /^y/i;
467 }
de34a54b 468 while ($mby) {
d8773709 469 if ($overwrite_local) {
9ddc4ed0 470 print qq{Trying to overwrite $mby\n};
d8773709 471 $mby = CPAN::FTP->localize($m,$mby,3);
472 $overwrite_local = 0;
473 } elsif ( ! -f $mby ){
9ddc4ed0 474 print qq{You have no $mby\n I\'m trying to fetch one\n};
36263cb3 475 $mby = CPAN::FTP->localize($m,$mby,3);
911a92db 476 } elsif (-M $mby > 60 && $loopcount == 0) {
9ddc4ed0 477 print qq{Your $mby is older than 60 days,\n I\'m trying to fetch one\n};
36263cb3 478 $mby = CPAN::FTP->localize($m,$mby,3);
911a92db 479 $loopcount++;
36263cb3 480 } elsif (-s $mby == 0) {
9ddc4ed0 481 print qq{You have an empty $mby,\n I\'m trying to fetch one\n};
36263cb3 482 $mby = CPAN::FTP->localize($m,$mby,3);
483 } else {
484 last;
485 }
09d9d230 486 }
487 read_mirrored_by($mby);
de34a54b 488 bring_your_own();
09d9d230 489}
490
5f05dabc 491sub find_exe {
492 my($exe,$path) = @_;
55e314ee 493 my($dir);
494 #warn "in find_exe exe[$exe] path[@$path]";
5f05dabc 495 for $dir (@$path) {
5de3f0da 496 my $abs = File::Spec->catfile($dir,$exe);
13bc20ff 497 if (($abs = MM->maybe_command($abs))) {
5f05dabc 498 return $abs;
499 }
500 }
501}
502
f610777f 503sub picklist {
504 my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_;
505 $default ||= '';
506
5fc0f0f6 507 my $pos = 0;
f610777f 508
509 my @nums;
510 while (1) {
ec385757 511
5fc0f0f6 512 # display, at most, 15 items at a time
513 my $limit = $#{ $items } - $pos;
514 $limit = 15 if $limit > 15;
515
516 # show the next $limit items, get the new position
517 $pos = display_some($items, $limit, $pos);
518 $pos = 0 if $pos >= @$items;
519
520 my $num = prompt($prompt,$default);
521
522 @nums = split (' ', $num);
523 my $i = scalar @$items;
524 (warn "invalid items entered, try again\n"), next
525 if grep (/\D/ || $_ < 1 || $_ > $i, @nums);
526 if ($require_nonempty) {
527 (warn "$empty_warning\n");
528 }
529 print "\n";
530
531 # a blank line continues...
532 next unless @nums;
533 last;
f610777f 534 }
f610777f 535 for (@nums) { $_-- }
536 @{$items}[@nums];
537}
538
ec385757 539sub display_some {
540 my ($items, $limit, $pos) = @_;
541 $pos ||= 0;
542
543 my @displayable = @$items[$pos .. ($pos + $limit)];
544 for my $item (@displayable) {
545 printf "(%d) %s\n", ++$pos, $item;
546 }
5fc0f0f6 547 printf("%d more items, hit SPACE RETURN to show them\n",
548 (@$items - $pos)
549 )
550 if $pos < @$items;
ec385757 551 return $pos;
552}
553
5f05dabc 554sub read_mirrored_by {
de34a54b 555 my $local = shift or return;
9ddc4ed0 556 my(%all,$url,$expected_size,$default,$ans,$host,
557 $dst,$country,$continent,@location);
05454584 558 my $fh = FileHandle->new;
559 $fh->open($local) or die "Couldn't open $local: $!";
f14b5cec 560 local $/ = "\012";
05454584 561 while (<$fh>) {
5f05dabc 562 ($host) = /^([\w\.\-]+)/ unless defined $host;
563 next unless defined $host;
564 next unless /\s+dst_(dst|location)/;
565 /location\s+=\s+\"([^\"]+)/ and @location = (split /\s*,\s*/, $1) and
566 ($continent, $country) = @location[-1,-2];
567 $continent =~ s/\s\(.*//;
f610777f 568 $continent =~ s/\W+$//; # if Jarkko doesn't know latitude/longitude
5f05dabc 569 /dst_dst\s+=\s+\"([^\"]+)/ and $dst = $1;
570 next unless $host && $dst && $continent && $country;
571 $all{$continent}{$country}{$dst} = CPAN::Mirrored::By->new($continent,$country,$dst);
572 undef $host;
573 $dst=$continent=$country="";
574 }
05454584 575 $fh->close;
5f05dabc 576 $CPAN::Config->{urllist} ||= [];
f610777f 577 my(@previous_urls);
578 if (@previous_urls = @{$CPAN::Config->{urllist}}) {
5f05dabc 579 $CPAN::Config->{urllist} = [];
5f05dabc 580 }
f610777f 581
9ddc4ed0 582 print $prompts{urls_intro};
5f05dabc 583
f610777f 584 my (@cont, $cont, %cont, @countries, @urls, %seen);
585 my $no_previous_warn =
586 "Sorry! since you don't have any existing picks, you must make a\n" .
587 "geographic selection.";
588 @cont = picklist([sort keys %all],
589 "Select your continent (or several nearby continents)",
590 '',
591 ! @previous_urls,
592 $no_previous_warn);
593
594
595 foreach $cont (@cont) {
596 my @c = sort keys %{$all{$cont}};
597 @cont{@c} = map ($cont, 0..$#c);
598 @c = map ("$_ ($cont)", @c) if @cont > 1;
599 push (@countries, @c);
5f05dabc 600 }
f610777f 601
602 if (@countries) {
603 @countries = picklist (\@countries,
604 "Select your country (or several nearby countries)",
605 '',
606 ! @previous_urls,
607 $no_previous_warn);
608 %seen = map (($_ => 1), @previous_urls);
609 # hmmm, should take list of defaults from CPAN::Config->{'urllist'}...
610 foreach $country (@countries) {
611 (my $bare_country = $country) =~ s/ \(.*\)//;
612 my @u = sort keys %{$all{$cont{$bare_country}}{$bare_country}};
613 @u = grep (! $seen{$_}, @u);
614 @u = map ("$_ ($bare_country)", @u)
615 if @countries > 1;
616 push (@urls, @u);
617 }
618 }
619 push (@urls, map ("$_ (previous pick)", @previous_urls));
5fc0f0f6 620 my $prompt = "Select as many URLs as you like (by number),
621put them on one line, separated by blanks, e.g. '1 4 5'";
f610777f 622 if (@previous_urls) {
623 $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) ..
624 (scalar @urls));
625 $prompt .= "\n(or just hit RETURN to keep your previous picks)";
626 }
627
628 @urls = picklist (\@urls, $prompt, $default);
629 foreach (@urls) { s/ \(.*\)//; }
de34a54b 630 push @{$CPAN::Config->{urllist}}, @urls;
631}
f610777f 632
de34a54b 633sub bring_your_own {
634 my %seen = map (($_ => 1), @{$CPAN::Config->{urllist}});
635 my($ans,@urls);
f610777f 636 do {
de34a54b 637 my $prompt = "Enter another URL or RETURN to quit:";
638 unless (%seen) {
639 $prompt = qq{CPAN.pm needs at least one URL where it can fetch CPAN files from.
640
641Please enter your CPAN site:};
642 }
643 $ans = prompt ($prompt, "");
f610777f 644
645 if ($ans) {
de34a54b 646 $ans =~ s|/?\z|/|; # has to end with one slash
f610777f 647 $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
648 if ($ans =~ /^\w+:\/./) {
8d97e4a1 649 push @urls, $ans unless $seen{$ans}++;
de34a54b 650 } else {
8d97e4a1 651 printf(qq{"%s" doesn\'t look like an URL at first sight.
652I\'ll ignore it for now.
653You can add it to your %s
654later if you\'re sure it\'s right.\n},
655 $ans,
656 $INC{'CPAN/MyConfig.pm'} || $INC{'CPAN/Config.pm'} || "configuration file",
657 );
f610777f 658 }
659 }
de34a54b 660 } while $ans || !%seen;
f610777f 661
662 push @{$CPAN::Config->{urllist}}, @urls;
663 # xxx delete or comment these out when you're happy that it works
664 print "New set of picks:\n";
665 map { print " $_\n" } @{$CPAN::Config->{urllist}};
5f05dabc 666}
667
f915a99a 668
669sub _strip_spaces {
670 $_[0] =~ s/^\s+//; # no leading spaces
671 $_[0] =~ s/\s+\z//; # no trailing spaces
672}
673
674
675sub prompt ($;$) {
676 my $ans = _real_prompt(@_);
677
678 _strip_spaces($ans);
679
680 return $ans;
681}
682
683
684sub prompt_no_strip ($;$) {
685 return _real_prompt(@_);
686}
687
688
9ddc4ed0 689BEGIN {
690
691my @prompts = (
692
693manual_config => qq[
694
695CPAN is the world-wide archive of perl resources. It consists of about
696100 sites that all replicate the same contents all around the globe.
697Many countries have at least one CPAN site already. The resources
698found on CPAN are easily accessible with the CPAN.pm module. If you
699want to use CPAN.pm, you have to configure it properly.
700
701If you do not want to enter a dialog now, you can answer 'no' to this
702question and I\'ll try to autoconfigure. (Note: you can revisit this
703dialog anytime later by typing 'o conf init' at the cpan prompt.)
704
705],
706
707config_intro => qq{
708
709The following questions are intended to help you with the
710configuration. The CPAN module needs a directory of its own to cache
711important index files and maybe keep a temporary mirror of CPAN files.
712This may be a site-wide directory or a personal directory.
713
714},
715
716# cpan_home => qq{ },
717
718cpan_home_where => qq{
719
720First of all, I\'d like to create this directory. Where?
721
722},
723
724keep_source_where => qq{
725
726If you like, I can cache the source files after I build them. Doing
727so means that, if you ever rebuild that module in the future, the
728files will be taken from the cache. The tradeoff is that it takes up
729space. How much space would you like to allocate to this cache? (If
730you don\'t want me to keep a cache, answer 0.)
731
732},
733
734build_cache_intro => qq{
735
736How big should the disk cache be for keeping the build directories
737with all the intermediate files\?
738
739},
740
741build_cache =>
742"Cache size for build directory (in MB)?",
743
744
745scan_cache_intro => qq{
746
747By default, each time the CPAN module is started, cache scanning is
748performed to keep the cache size in sync. To prevent this, answer
749'never'.
750
751},
752
753scan_cache => "Perform cache scanning (atstart or never)?",
754
755cache_metadata => qq{
756
757To considerably speed up the initial CPAN shell startup, it is
758possible to use Storable to create a cache of metadata. If Storable
759is not available, the normal index mechanism will be used.
760
761},
762
763term_is_latin => qq{
764
765The next option deals with the charset (aka character set) your
766terminal supports. In general, CPAN is English speaking territory, so
767the charset does not matter much, but some of the aliens out there who
768upload their software to CPAN bear names that are outside the ASCII
769range. If your terminal supports UTF-8, you should say no to the next
770question. If it supports ISO-8859-1 (also known as LATIN1) then you
771should say yes. If it supports neither, your answer does not matter
772because you will not be able to read the names of some authors
773anyway. If you answer no, names will be output in UTF-8.
774
775},
776
c9869e1c 777histfile_intro => qq{
9ddc4ed0 778
779If you have one of the readline packages (Term::ReadLine::Perl,
780Term::ReadLine::Gnu, possibly others) installed, the interactive CPAN
781shell will have history support. The next two questions deal with the
782filename of the history file and with its size. If you do not want to
783set this variable, please hit SPACE RETURN to the following question.
784
785},
786
c9869e1c 787histfile => qq{File to save your history?},
788
9ddc4ed0 789show_upload_date_intro => qq{
790
791The 'd' and the 'm' command normally only show you information they
792have in their in-memory database and thus will never connect to the
793internet. If you set the 'show_upload_date' variable to true, 'm' and
794'd' will additionally show you the upload date of the module or
795distribution. Per default this feature is off because it may require a
796net connection to get at the upload date.
797
798},
799
800show_upload_date =>
801"Always try to show upload date with 'd' and 'm' command (yes/no)?",
802
803prerequisites_policy_intro => qq{
804
805The CPAN module can detect when a module which you are trying to build
806depends on prerequisites. If this happens, it can build the
807prerequisites for you automatically ('follow'), ask you for
808confirmation ('ask'), or just ignore them ('ignore'). Please set your
809policy to one of the three values.
810
811},
812
813prerequisites_policy =>
c9869e1c 814"Policy on building prerequisites (follow, ask or ignore)?",
9ddc4ed0 815
816external_progs => qq{
817
818The CPAN module will need a few external programs to work properly.
819Please correct me, if I guess the wrong path for a program. Don\'t
820panic if you do not have some of them, just press ENTER for those. To
821disable the use of a download program, you can type a space followed
822by ENTER.
823
824},
825
826prefer_installer_intro => qq{
827
828When you have Module::Build installed and a module comes with both a
829Makefile.PL and a Build.PL, which shall have precedence? The two
830installer modules we have are the old and well established
831ExtUtils::MakeMaker (for short: EUMM) understands the Makefile.PL and
832the next generation installer Module::Build (MB) works with the
833Build.PL.
834
835},
836
837prefer_installer =>
838qq{In case you could choose, which installer would you prefer (EUMM or MB)?},
839
840makepl_arg_intro => qq{
841
842Every Makefile.PL is run by perl in a separate process. Likewise we
843run \'make\' and \'make install\' in separate processes. If you have
844any parameters \(e.g. PREFIX, LIB, UNINST or the like\) you want to
845pass to the calls, please specify them here.
846
847If you don\'t understand this question, just press ENTER.
848},
849
850makepl_arg => qq{
851Parameters for the 'perl Makefile.PL' command?
852Typical frequently used settings:
853
854 PREFIX=~/perl # non-root users (please see manual for more hints)
855
856Your choice: },
857
858make_arg => qq{Parameters for the 'make' command?
859Typical frequently used setting:
860
861 -j3 # dual processor system
862
863Your choice: },
864
865
866make_install_make_command => qq{Do you want to use a different make command for 'make install'?
867Cautious people will probably prefer:
868
869 su root -c make
870or
871 sudo make
872or
873 /path1/to/sudo -u admin_account /path2/to/make
874
875or some such. Your choice: },
876
877
878make_install_arg => qq{Parameters for the 'make install' command?
879Typical frequently used setting:
880
881 UNINST=1 # to always uninstall potentially conflicting files
882
883Your choice: },
884
885
886mbuildpl_arg_intro => qq{
887
888The next questions deal with Module::Build support.
889
890A Build.PL is run by perl in a separate process. Likewise we run
891'./Build' and './Build install' in separate processes. If you have any
892parameters you want to pass to the calls, please specify them here.
893
894},
895
896mbuildpl_arg => qq{Parameters for the 'perl Build.PL' command?
897Typical frequently used settings:
898
899 --install_base /home/xxx # different installation directory
900
901Your choice: },
902
903mbuild_arg => qq{Parameters for the './Build' command?
904Setting might be:
905
906 --extra_linker_flags -L/usr/foo/lib # non-standard library location
907
908Your choice: },
909
910
911mbuild_install_build_command => qq{Do you want to use a different command for './Build install'?
912Sudo users will probably prefer:
913
914 su root -c ./Build
915or
916 sudo ./Build
917or
918 /path1/to/sudo -u admin_account ./Build
919
920or some such. Your choice: },
921
922
923mbuild_install_arg => qq{Parameters for the './Build install' command?
924Typical frequently used setting:
925
926 --uninst 1 # uninstall conflicting files
927
928Your choice: },
929
930
931
932inactivity_timeout_intro => qq{
933
934Sometimes you may wish to leave the processes run by CPAN alone
935without caring about them. Because the Makefile.PL sometimes contains
936question you\'re expected to answer, you can set a timer that will
937kill a 'perl Makefile.PL' process after the specified time in seconds.
938
939If you set this value to 0, these processes will wait forever. This is
940the default and recommended setting.
941
942},
943
944inactivity_timeout =>
945qq{Timeout for inactivity during {Makefile,Build}.PL? },
946
947
c9869e1c 948proxy_intro => qq{
9ddc4ed0 949
950If you\'re accessing the net via proxies, you can specify them in the
951CPAN configuration or via environment variables. The variable in
952the \$CPAN::Config takes precedence.
953
954},
955
956proxy_user => qq{
957
958If your proxy is an authenticating proxy, you can store your username
959permanently. If you do not want that, just press RETURN. You will then
960be asked for your username in every future session.
961
962},
963
964proxy_pass => qq{
965
966Your password for the authenticating proxy can also be stored
967permanently on disk. If this violates your security policy, just press
968RETURN. You will then be asked for the password in every future
969session.
970
971},
972
973urls_intro => qq{
974
975Now we need to know where your favorite CPAN sites are located. Push
976a few sites onto the array (just in case the first on the array won\'t
977work). If you are mirroring CPAN to your local workstation, specify a
978file: URL.
979
980First, pick a nearby continent and country (you can pick several of
981each, separated by spaces, or none if you just want to keep your
982existing selections). Then, you will be presented with a list of URLs
983of CPAN mirrors in the countries you selected, along with previously
984selected URLs. Select some of those URLs, or just keep the old list.
985Finally, you will be prompted for any extra URLs -- file:, ftp:, or
986http: -- that host a CPAN mirror.
987
988},
989
990password_warn => qq{
991
992Warning: Term::ReadKey seems not to be available, your password will
993be echoed to the terminal!
994
995},
996
997);
998
999die "Coding error in \@prompts declaration. Odd number of elements, above"
1000 if (@prompts % 2);
1001
1002%prompts = @prompts;
1003
1004if (scalar(keys %prompts) != scalar(@prompts)/2) {
1005
1006 my %already;
1007
1008 for my $item (0..$#prompts) {
1009 next if $item % 2;
1010 die "$prompts[$item] is duplicated\n"
1011 if $already{$prompts[$item]}++;
1012 }
1013
1014}
1015
1016}
1017
5f05dabc 10181;