remove backing up outercc->cur in regmatch()/WHILEM
[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);
2ccf00a7 5$VERSION = sprintf "%.6f", substr(q$Rev: 879 $,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;
8962fc49 23use vars qw($VERSION $urllist);
2ccf00a7 24$VERSION = sprintf "%.6f", substr(q$Rev: 879 $,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
26844e27 39=head1 LICENSE
40
41This program is free software; you can redistribute it and/or
42modify it under the same terms as Perl itself.
5f05dabc 43
44=cut
45
9ddc4ed0 46use vars qw( %prompts );
47
5f05dabc 48sub init {
554a9ef5 49 my($configpm, %args) = @_;
5f05dabc 50 use Config;
26844e27 51 # extra args after 'o conf init'
9ddc4ed0 52 my $matcher = $args{args} && @{$args{args}} ? $args{args}[0] : '';
26844e27 53 if ($matcher =~ /^\/(.*)\/$/) {
54 # case /regex/ => take the first, ignore the rest
55 $matcher = $1;
56 shift @{$args{args}};
57 if (@{$args{args}}) {
58 local $" = " ";
59 $CPAN::Frontend->mywarn("Ignoring excessive arguments '@{$args{args}}'");
60 $CPAN::Frontend->mysleep(2);
61 }
62 } elsif (0 == length $matcher) {
63 } else {
64 # case WORD... => all arguments must be valid
65 for my $arg (@{$args{args}}) {
66 unless (exists $CPAN::HandleConfig::keys{$arg}) {
67 $CPAN::Frontend->mywarn("'$arg' is not a valid configuration variable");
68 return;
69 }
8962fc49 70 }
26844e27 71 $matcher = "\\b(".join("|",@{$args{args}}).")\\b";
8962fc49 72 }
c9869e1c 73 CPAN->debug("matcher[$matcher]") if $CPAN::DEBUG;
554a9ef5 74
f610777f 75 unless ($CPAN::VERSION) {
76 require CPAN::Nox;
77 }
87892b73 78 require CPAN::HandleConfig;
79 CPAN::HandleConfig::require_myconfig_or_config();
5f05dabc 80 $CPAN::Config ||= {};
da199366 81 local($/) = "\n";
82 local($\) = "";
13bc20ff 83 local($|) = 1;
da199366 84
5fc0f0f6 85 my($ans,$default);
f610777f 86
da199366 87 #
8962fc49 88 #= Files, directories
da199366 89 #
90
8962fc49 91 unless ($matcher) {
92 $CPAN::Frontend->myprint($prompts{manual_config});
93 }
09d9d230 94
554a9ef5 95 my $manual_conf;
96
7fefbd44 97 local *_real_prompt;
554a9ef5 98 if ( $args{autoconfig} ) {
99 $manual_conf = "no";
8962fc49 100 } elsif ($matcher) {
101 $manual_conf = "yes";
554a9ef5 102 } else {
8962fc49 103 my $_conf = prompt("Would you like me to configure as much as possible ".
104 "automatically?", "yes");
105 $manual_conf = ($_conf and $_conf =~ /^y/i) ? "no" : "yes";
554a9ef5 106 }
8962fc49 107 CPAN->debug("manual_conf[$manual_conf]") if $CPAN::DEBUG;
09d9d230 108 my $fastread;
109 {
f915a99a 110 if ($manual_conf =~ /^y/i) {
09d9d230 111 $fastread = 0;
09d9d230 112 } else {
113 $fastread = 1;
36263cb3 114 $CPAN::Config->{urllist} ||= [];
f915a99a 115
116 local $^W = 0;
c9d9b473 117 # prototype should match that of &MakeMaker::prompt
8962fc49 118 my $current_second = time;
119 my $current_second_count = 0;
120 my $i_am_mad = 0;
f915a99a 121 *_real_prompt = sub ($;$) {
09d9d230 122 my($q,$a) = @_;
123 my($ret) = defined $a ? $a : "";
554a9ef5 124 $CPAN::Frontend->myprint(sprintf qq{%s [%s]\n\n}, $q, $ret);
125 eval { require Time::HiRes };
126 unless ($@) {
8962fc49 127 if (time == $current_second) {
128 $current_second_count++;
129 if ($current_second_count > 20) {
130 # I don't like more than 20 prompts per second
131 $i_am_mad++;
132 }
133 } else {
134 $current_second = time;
135 $current_second_count = 0;
136 $i_am_mad-- if $i_am_mad>0;
137 }
138 if ($i_am_mad>0){
139 #require Carp;
140 #Carp::cluck("SLEEEEEEEEPIIIIIIIIIIINGGGGGGGGGGG");
141 Time::HiRes::sleep(0.1);
142 }
554a9ef5 143 }
09d9d230 144 $ret;
145 };
146 }
147 }
9ddc4ed0 148
8962fc49 149 if (!$matcher or 'cpan_home keep_source_where build_dir' =~ /$matcher/){
150 $CPAN::Frontend->myprint($prompts{config_intro});
9ddc4ed0 151
8962fc49 152 if (!$matcher or 'cpan_home' =~ /$matcher/) {
153 my $cpan_home = $CPAN::Config->{cpan_home}
154 || File::Spec->catdir($ENV{HOME}, ".cpan");
5f05dabc 155
8962fc49 156 if (-d $cpan_home) {
157 $CPAN::Frontend->myprint(qq{
5f05dabc 158
159I see you already have a directory
160 $cpan_home
161Shall we use it as the general CPAN build and cache directory?
162
554a9ef5 163});
8962fc49 164 } else {
165 # no cpan-home, must prompt and get one
166 $CPAN::Frontend->myprint($prompts{cpan_home_where});
167 }
f610777f 168
8962fc49 169 $default = $cpan_home;
170 while ($ans = prompt("CPAN build and cache directory?",$default)) {
171 unless (File::Spec->file_name_is_absolute($ans)) {
172 require Cwd;
173 my $cwd = Cwd::cwd();
174 my $absans = File::Spec->catdir($cwd,$ans);
175 $CPAN::Frontend->mywarn("The path '$ans' is not an ".
176 "absolute path. Please specify ".
177 "an absolute path\n");
178 $default = $absans;
179 next;
180 }
181 eval { File::Path::mkpath($ans); }; # dies if it can't
182 if ($@) {
183 $CPAN::Frontend->mywarn("Couldn't create directory $ans.\n".
184 "Please retry.\n");
185 next;
186 }
187 if (-d $ans && -w _) {
188 last;
189 } else {
190 $CPAN::Frontend->mywarn("Couldn't find directory $ans\n".
191 "or directory is not writable. Please retry.\n");
192 }
193 }
194 $CPAN::Config->{cpan_home} = $ans;
195 }
5f05dabc 196
8962fc49 197 if (!$matcher or 'keep_source_where' =~ /$matcher/) {
198 my_dflt_prompt("keep_source_where",
199 File::Spec->catdir($CPAN::Config->{cpan_home},"sources"),
200 $matcher,
201 );
202 }
5f05dabc 203
8962fc49 204 if (!$matcher or 'build_dir' =~ /$matcher/) {
205 my_dflt_prompt("build_dir",
206 File::Spec->catdir($CPAN::Config->{cpan_home},"build"),
207 $matcher
208 );
209 }
210 }
5f05dabc 211
da199366 212 #
8962fc49 213 #= Cache size, Index expire
da199366 214 #
215
8962fc49 216 if (!$matcher or 'build_cache' =~ /$matcher/){
217 $CPAN::Frontend->myprint($prompts{build_cache_intro});
5f05dabc 218
8962fc49 219 # large enough to build large dists like Tk
220 my_dflt_prompt(build_cache => 100, $matcher);
221 }
5e05dca5 222
8962fc49 223 if (!$matcher or 'index_expire' =~ /$matcher/) {
224 $CPAN::Frontend->myprint($prompts{index_expire_intro});
5e05dca5 225
8962fc49 226 my_dflt_prompt(index_expire => 1, $matcher);
c9869e1c 227 }
9d61fa1d 228
8962fc49 229 if (!$matcher or 'scan_cache' =~ /$matcher/){
230 $CPAN::Frontend->myprint($prompts{scan_cache_intro});
9d61fa1d 231
8962fc49 232 my_prompt_loop(scan_cache => 'atstart', $matcher, 'atstart|never');
233 }
9d61fa1d 234
235 #
8962fc49 236 #= cache_metadata
5fc0f0f6 237 #
5fc0f0f6 238
8962fc49 239 my_yn_prompt(cache_metadata => 1, $matcher);
5fc0f0f6 240
241 #
8962fc49 242 #= Do we follow PREREQ_PM?
554a9ef5 243 #
554a9ef5 244
8962fc49 245 if (!$matcher or 'prerequisites_policy' =~ /$matcher/){
246 $CPAN::Frontend->myprint($prompts{prerequisites_policy_intro});
9ddc4ed0 247
8962fc49 248 my_prompt_loop(prerequisites_policy => 'ask', $matcher,
249 'follow|ask|ignore');
250 }
554a9ef5 251
252 #
8962fc49 253 #= Module::Signature
f610777f 254 #
8962fc49 255 if (!$matcher or 'check_sigs' =~ /$matcher/) {
256 my_yn_prompt(check_sigs => 0, $matcher);
257 }
f610777f 258
da199366 259 #
8962fc49 260 #= CPAN::Reporter
ed84aac9 261 #
8962fc49 262 if (!$matcher or 'test_report' =~ /$matcher/) {
263 my_yn_prompt(test_report => 0, $matcher);
264 if (
265 $CPAN::Config->{test_report} &&
266 $CPAN::META->has_inst("CPAN::Reporter") &&
267 CPAN::Reporter->can('configure')
268 ) {
269 $CPAN::Frontend->myprint("\nProceeding to configure CPAN::Reporter.\n");
270 CPAN::Reporter::configure();
271 $CPAN::Frontend->myprint("\nReturning to CPAN configuration.\n");
272 }
273 }
ed84aac9 274
275 #
8962fc49 276 #= External programs
da199366 277 #
278
8962fc49 279 my @external_progs = qw/bzip2 gzip tar unzip make
554a9ef5 280 curl lynx wget ncftpget ncftp ftp
8962fc49 281 gpg/;
282 my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
283 if (!$matcher or "@external_progs" =~ /$matcher/) {
284 $CPAN::Frontend->myprint($prompts{external_progs});
285
286 my $old_warn = $^W;
287 local $^W if $^O eq 'MacOS';
288 local $^W = $old_warn;
289 my $progname;
290 for $progname (@external_progs) {
2ccf00a7 291 next if $matcher && $progname !~ /$matcher/;
8962fc49 292 if ($^O eq 'MacOS') {
293 $CPAN::Config->{$progname} = 'not_here';
294 next;
295 }
8962fc49 296
297 my $progcall = $progname;
2ccf00a7 298 unless ($matcher) {
299 # we really don't need ncftp if we have ncftpget, but
300 # if they chose this dialog via matcher, they shall have it
301 next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " ";
302 }
8962fc49 303 my $path = $CPAN::Config->{$progname}
304 || $Config::Config{$progname}
305 || "";
306 if (File::Spec->file_name_is_absolute($path)) {
307 # testing existence is not good enough, some have these exe
308 # extensions
309
310 # warn "Warning: configured $path does not exist\n" unless -e $path;
311 # $path = "";
312 } elsif ($path =~ /^\s+$/) {
313 # preserve disabled programs
314 } else {
315 $path = '';
316 }
317 unless ($path) {
318 # e.g. make -> nmake
319 $progcall = $Config::Config{$progname} if $Config::Config{$progname};
320 }
09d9d230 321
8962fc49 322 $path ||= find_exe($progcall,[@path]);
323 $CPAN::Frontend->mywarn("Warning: $progcall not found in PATH\n") unless
324 $path; # not -e $path, because find_exe already checked that
325 $ans = prompt("Where is your $progname program?",$path) || $path;
326 $CPAN::Config->{$progname} = $ans;
327 }
5f05dabc 328 }
8962fc49 329
330 if (!$matcher or 'pager' =~ /$matcher/) {
331 my $path = $CPAN::Config->{'pager'} ||
332 $ENV{PAGER} || find_exe("less",[@path]) ||
333 find_exe("more",[@path]) || ($^O eq 'MacOS' ? $ENV{EDITOR} : 0 )
334 || "more";
335 $ans = prompt("What is your favorite pager program?",$path);
336 $CPAN::Config->{'pager'} = $ans;
55e314ee 337 }
8962fc49 338
339 if (!$matcher or 'shell' =~ /$matcher/) {
340 my $path = $CPAN::Config->{'shell'};
341 if (File::Spec->file_name_is_absolute($path)) {
342 $CPAN::Frontend->mywarn("Warning: configured $path does not exist\n")
343 unless -e $path;
344 $path = "";
345 }
346 $path ||= $ENV{SHELL};
347 $path ||= $ENV{COMSPEC} if $^O eq "MSWin32";
348 if ($^O eq 'MacOS') {
349 $CPAN::Config->{'shell'} = 'not_here';
350 } else {
351 $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only
352 $ans = prompt("What is your favorite shell?",$path);
353 $CPAN::Config->{'shell'} = $ans;
354 }
f14b5cec 355 }
da199366 356
357 #
8962fc49 358 #= Installer, arguments to make etc.
da199366 359 #
360
8962fc49 361 if (!$matcher or 'prefer_installer' =~ /$matcher/){
362 $CPAN::Frontend->myprint($prompts{prefer_installer_intro});
e82b9348 363
8962fc49 364 my_prompt_loop(prefer_installer => 'EUMM', $matcher, 'MB|EUMM');
365 }
e82b9348 366
8962fc49 367 if (!$matcher or 'makepl_arg make_arg' =~ /$matcher/){
368 $CPAN::Frontend->myprint($prompts{makepl_arg_intro});
e82b9348 369
8962fc49 370 my_dflt_prompt(makepl_arg => "", $matcher);
371 my_dflt_prompt(make_arg => "", $matcher);
372 }
e82b9348 373
44d21104 374 require CPAN::HandleConfig;
375 if (exists $CPAN::HandleConfig::keys{make_install_make_command}) {
376 # as long as Windows needs $self->_build_command, we cannot
377 # support sudo on windows :-)
378 my_dflt_prompt(make_install_make_command => $CPAN::Config->{make} || "",
379 $matcher);
380 }
e82b9348 381
9ddc4ed0 382 my_dflt_prompt(make_install_arg => $CPAN::Config->{make_arg} || "",
383 $matcher);
e82b9348 384
8962fc49 385 if (!$matcher or 'mbuildpl_arg mbuild_arg' =~ /$matcher/){
386 $CPAN::Frontend->myprint($prompts{mbuildpl_arg_intro});
e82b9348 387
8962fc49 388 my_dflt_prompt(mbuildpl_arg => "", $matcher);
e82b9348 389
8962fc49 390 my_dflt_prompt(mbuild_arg => "", $matcher);
391 }
e82b9348 392
44d21104 393 if (exists $CPAN::HandleConfig::keys{mbuild_install_build_command}) {
394 # as long as Windows needs $self->_build_command, we cannot
395 # support sudo on windows :-)
396 my_dflt_prompt(mbuild_install_build_command => "./Build", $matcher);
397 }
8d97e4a1 398
9ddc4ed0 399 my_dflt_prompt(mbuild_install_arg => "", $matcher);
5f05dabc 400
da199366 401 #
8962fc49 402 #= Alarm period
403 #
404
405 if (!$matcher or 'inactivity_timeout' =~ /$matcher/) {
406 $CPAN::Frontend->myprint($prompts{inactivity_timeout_intro});
407 $default = $CPAN::Config->{inactivity_timeout} || 0;
408 $CPAN::Config->{inactivity_timeout} =
409 prompt("Timeout for inactivity during {Makefile,Build}.PL?",$default);
410 }
411
412 #
413 #= Proxies
da199366 414 #
415
8962fc49 416 my @proxy_vars = qw/ftp_proxy http_proxy no_proxy/;
417 my @proxy_user_vars = qw/proxy_user proxy_pass/;
418 if (!$matcher or "@proxy_vars @proxy_user_vars" =~ /$matcher/){
419 $CPAN::Frontend->myprint($prompts{proxy_intro});
10b2abe6 420
8962fc49 421 for (@proxy_vars) {
422 if (!$matcher or /$matcher/){
423 $default = $CPAN::Config->{$_} || $ENV{$_} || "";
424 $CPAN::Config->{$_} = prompt("Your $_?",$default);
425 }
426 }
10b2abe6 427
8962fc49 428 if ($CPAN::Config->{ftp_proxy} ||
429 $CPAN::Config->{http_proxy}) {
10b2abe6 430
8962fc49 431 $default = $CPAN::Config->{proxy_user} || $CPAN::LWP::UserAgent::USER || "";
da199366 432
8962fc49 433 $CPAN::Frontend->myprint($prompts{proxy_user});
09d9d230 434
8962fc49 435 if ($CPAN::Config->{proxy_user} = prompt("Your proxy user id?",$default)) {
436 $CPAN::Frontend->myprint($prompts{proxy_pass});
c9869e1c 437
8962fc49 438 if ($CPAN::META->has_inst("Term::ReadKey")) {
439 Term::ReadKey::ReadMode("noecho");
440 } else {
441 $CPAN::Frontend->myprint($prompts{password_warn});
442 }
443 $CPAN::Config->{proxy_pass} = prompt_no_strip("Your proxy password?");
444 if ($CPAN::META->has_inst("Term::ReadKey")) {
445 Term::ReadKey::ReadMode("restore");
446 }
447 $CPAN::Frontend->myprint("\n\n");
448 }
449 }
5f05dabc 450 }
451
8962fc49 452 #
453 #= how FTP works
454 #
9ddc4ed0 455
8962fc49 456 my_yn_prompt(ftp_passive => 1, $matcher);
c049f953 457
8962fc49 458 #
459 #= how cwd works
460 #
c049f953 461
8962fc49 462 if (!$matcher or 'getcwd' =~ /$matcher/){
463 $CPAN::Frontend->myprint($prompts{getcwd_intro});
c049f953 464
8962fc49 465 my_prompt_loop(getcwd => 'cwd', $matcher,
466 'cwd|getcwd|fastcwd|backtickcwd');
467 }
468
469 #
470 #= the CPAN shell itself
471 #
472
473 my_yn_prompt(commandnumber_in_prompt => 1, $matcher);
474 my_yn_prompt(term_ornaments => 1, $matcher);
475 if ("colorize_output colorize_print colorize_warn" =~ $matcher) {
476 my_yn_prompt(colorize_output => 0, $matcher);
477 if ($CPAN::Config->{colorize_output}) {
478 for my $tuple (
2ccf00a7 479 ["colorize_print", "bold blue on_white"],
480 ["colorize_warn", "bold red on_white"],
8962fc49 481 ) {
482 my_dflt_prompt($tuple->[0] => $tuple->[1], $matcher);
483 if ($CPAN::META->has_inst("Term::ANSIColor")) {
484 eval { Term::ANSIColor::color($CPAN::Config->{$tuple->[0]})};
485 if ($@) {
486 $CPAN::Config->{$tuple->[0]} = $tuple->[1];
487 $CPAN::Frontend->mywarn($@."setting to default '$tuple->[1]'\n");
488 }
489 }
c049f953 490 }
c049f953 491 }
492 }
493
09d9d230 494 #
8962fc49 495 #== term_is_latin
496 #
497
498 if (!$matcher or 'term_is_latin' =~ /$matcher/){
499 $CPAN::Frontend->myprint($prompts{term_is_latin});
500 my_yn_prompt(term_is_latin => 1, $matcher);
501 }
502
503 #
504 #== save history in file 'histfile'
505 #
506
507 if (!$matcher or 'histfile histsize' =~ /$matcher/) {
508 $CPAN::Frontend->myprint($prompts{histfile_intro});
509 defined($default = $CPAN::Config->{histfile}) or
510 $default = File::Spec->catfile($CPAN::Config->{cpan_home},"histfile");
511 $ans = prompt("File to save your history?", $default);
512 $CPAN::Config->{histfile} = $ans;
513
514 if ($CPAN::Config->{histfile}) {
515 defined($default = $CPAN::Config->{histsize}) or $default = 100;
516 $ans = prompt("Number of lines to save?", $default);
517 $CPAN::Config->{histsize} = $ans;
518 }
519 }
520
521 #
522 #== do an ls on the m or the d command
523 #
524 if (!$matcher or 'show_upload_date' =~ /$matcher/) {
525 $CPAN::Frontend->myprint($prompts{show_upload_date_intro});
526
527 defined($default = $CPAN::Config->{show_upload_date}) or
528 $default = 'n';
529 $ans = prompt("Always try to show upload date with 'd' and 'm' command (yes/no)?",
530 ($default ? 'yes' : 'no'));
531 $CPAN::Config->{show_upload_date} = ($ans =~ /^[y1]/i ? 1 : 0);
532 }
533
534 #
535 #= MIRRORED.BY and conf_sites()
09d9d230 536 #
537
8962fc49 538 if ($matcher){
539 if ("urllist" =~ $matcher) {
540 # conf_sites would go into endless loop with the smash prompt
541 local *_real_prompt;
542 *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt;
543 conf_sites();
544 }
545 } elsif ($fastread) {
546 $CPAN::Frontend->myprint("Autoconfigured everything but 'urllist'.\n".
547 "Please call 'o conf init urllist' to configure ".
548 "your CPAN server(s) now!");
549 } else {
550 conf_sites();
551 }
09d9d230 552
8962fc49 553 # We don't ask this one now, it's plain silly and maybe is not
554 # even used correctly everywhere.
ca79d794 555 $CPAN::Config->{inhibit_startup_message} = 0;
5f05dabc 556
554a9ef5 557 $CPAN::Frontend->myprint("\n\n");
8962fc49 558 if ($matcher) {
559 $CPAN::Frontend->myprint("Please remember to call 'o conf commit' to ".
560 "make the config permanent!\n\n");
561 } else {
562 CPAN::HandleConfig->commit($configpm);
563 }
5f05dabc 564}
565
9ddc4ed0 566sub my_dflt_prompt {
567 my ($item, $dflt, $m) = @_;
568 my $default = $CPAN::Config->{$item} || $dflt;
569
570 $DB::single = 1;
571 if (!$m || $item =~ /$m/) {
572 $CPAN::Config->{$item} = prompt($prompts{$item}, $default);
573 } else {
574 $CPAN::Config->{$item} = $default;
575 }
576}
577
8962fc49 578sub my_yn_prompt {
579 my ($item, $dflt, $m) = @_;
580 my $default;
581 defined($default = $CPAN::Config->{$item}) or $default = $dflt;
582
583 $DB::single = 1;
584 if (!$m || $item =~ /$m/) {
585 if (my $intro = $prompts{$item . "_intro"}) {
586 $CPAN::Frontend->myprint($intro);
587 }
588 my $ans = prompt($prompts{$item}, $default ? 'yes' : 'no');
589 $CPAN::Config->{$item} = ($ans =~ /^[y1]/i ? 1 : 0);
590 } else {
591 $CPAN::Config->{$item} = $default;
592 }
593}
594
9ddc4ed0 595sub my_prompt_loop {
596 my ($item, $dflt, $m, $ok) = @_;
597 my $default = $CPAN::Config->{$item} || $dflt;
598 my $ans;
599
600 $DB::single = 1;
601 if (!$m || $item =~ /$m/) {
602 do { $ans = prompt($prompts{$item}, $default);
603 } until $ans =~ /$ok/;
604 $CPAN::Config->{$item} = $ans;
605 } else {
606 $CPAN::Config->{$item} = $default;
607 }
608}
609
610
09d9d230 611sub conf_sites {
612 my $m = 'MIRRORED.BY';
5de3f0da 613 my $mby = File::Spec->catfile($CPAN::Config->{keep_source_where},$m);
09d9d230 614 File::Path::mkpath(File::Basename::dirname($mby));
615 if (-f $mby && -f $m && -M $m < -M $mby) {
616 require File::Copy;
617 File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
618 }
911a92db 619 my $loopcount = 0;
de34a54b 620 local $^T = time;
d8773709 621 my $overwrite_local = 0;
622 if ($mby && -f $mby && -M _ <= 60 && -s _ > 0) {
623 my $mtime = localtime((stat _)[9]);
624 my $prompt = qq{Found $mby as of $mtime
625
c049f953 626I\'d use that as a database of CPAN sites. If that is OK for you,
627please answer 'y', but if you want me to get a new database now,
628please answer 'n' to the following question.
d8773709 629
c049f953 630Shall I use the local database in $mby?};
d8773709 631 my $ans = prompt($prompt,"y");
632 $overwrite_local = 1 unless $ans =~ /^y/i;
633 }
de34a54b 634 while ($mby) {
d8773709 635 if ($overwrite_local) {
8962fc49 636 $CPAN::Frontend->myprint(qq{Trying to overwrite $mby\n});
d8773709 637 $mby = CPAN::FTP->localize($m,$mby,3);
638 $overwrite_local = 0;
639 } elsif ( ! -f $mby ){
8962fc49 640 $CPAN::Frontend->myprint(qq{You have no $mby\n I\'m trying to fetch one\n});
36263cb3 641 $mby = CPAN::FTP->localize($m,$mby,3);
911a92db 642 } elsif (-M $mby > 60 && $loopcount == 0) {
8962fc49 643 $CPAN::Frontend->myprint(qq{Your $mby is older than 60 days,\n I\'m trying }.
644 qq{to fetch one\n});
645 $mby = CPAN::FTP->localize($m,$mby,3);
646 $loopcount++;
36263cb3 647 } elsif (-s $mby == 0) {
8962fc49 648 $CPAN::Frontend->myprint(qq{You have an empty $mby,\n I\'m trying to fetch one\n});
36263cb3 649 $mby = CPAN::FTP->localize($m,$mby,3);
650 } else {
651 last;
652 }
09d9d230 653 }
8962fc49 654 local $urllist = [];
09d9d230 655 read_mirrored_by($mby);
de34a54b 656 bring_your_own();
8962fc49 657 $CPAN::Config->{urllist} = $urllist;
09d9d230 658}
659
5f05dabc 660sub find_exe {
661 my($exe,$path) = @_;
55e314ee 662 my($dir);
663 #warn "in find_exe exe[$exe] path[@$path]";
5f05dabc 664 for $dir (@$path) {
5de3f0da 665 my $abs = File::Spec->catfile($dir,$exe);
13bc20ff 666 if (($abs = MM->maybe_command($abs))) {
5f05dabc 667 return $abs;
668 }
669 }
670}
671
f610777f 672sub picklist {
673 my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_;
8962fc49 674 CPAN->debug("picklist('$items','$prompt','$default','$require_nonempty',".
675 "'$empty_warning')") if $CPAN::DEBUG;
f610777f 676 $default ||= '';
677
5fc0f0f6 678 my $pos = 0;
f610777f 679
680 my @nums;
8962fc49 681 SELECTION: while (1) {
ec385757 682
5fc0f0f6 683 # display, at most, 15 items at a time
684 my $limit = $#{ $items } - $pos;
685 $limit = 15 if $limit > 15;
686
687 # show the next $limit items, get the new position
8962fc49 688 $pos = display_some($items, $limit, $pos, $default);
5fc0f0f6 689 $pos = 0 if $pos >= @$items;
690
691 my $num = prompt($prompt,$default);
692
693 @nums = split (' ', $num);
8962fc49 694 {
695 my %seen;
696 @nums = grep { !$seen{$_}++ } @nums;
697 }
5fc0f0f6 698 my $i = scalar @$items;
26844e27 699 unrangify(\@nums);
8962fc49 700 if (grep (/\D/ || $_ < 1 || $_ > $i, @nums)){
701 $CPAN::Frontend->mywarn("invalid items entered, try again\n");
702 if ("@nums" =~ /\D/) {
26844e27 703 $CPAN::Frontend->mywarn("(we are expecting only numbers between 1 and $i)\n");
8962fc49 704 }
705 next SELECTION;
706 }
707 if ($require_nonempty && !@nums) {
708 $CPAN::Frontend->mywarn("$empty_warning\n");
5fc0f0f6 709 }
8962fc49 710 $CPAN::Frontend->myprint("\n");
5fc0f0f6 711
712 # a blank line continues...
8962fc49 713 next SELECTION unless @nums;
5fc0f0f6 714 last;
f610777f 715 }
f610777f 716 for (@nums) { $_-- }
717 @{$items}[@nums];
718}
719
26844e27 720sub unrangify ($) {
721 my($nums) = $_[0];
722 my @nums2 = ();
723 while (@{$nums||[]}) {
724 my $n = shift @$nums;
725 if ($n =~ /^(\d+)-(\d+)$/) {
726 my @range = $1 .. $2;
727 # warn "range[@range]";
728 push @nums2, @range;
729 } else {
730 push @nums2, $n;
731 }
732 }
733 push @$nums, @nums2;
734}
735
ec385757 736sub display_some {
8962fc49 737 my ($items, $limit, $pos, $default) = @_;
738 $pos ||= 0;
ec385757 739
8962fc49 740 my @displayable = @$items[$pos .. ($pos + $limit)];
ec385757 741 for my $item (@displayable) {
8962fc49 742 $CPAN::Frontend->myprint(sprintf "(%d) %s\n", ++$pos, $item);
ec385757 743 }
8962fc49 744 my $hit_what = $default ? "SPACE RETURN" : "RETURN";
745 $CPAN::Frontend->myprint(sprintf("%d more items, hit %s to show them\n",
746 (@$items - $pos),
747 $hit_what,
748 ))
749 if $pos < @$items;
750 return $pos;
ec385757 751}
752
5f05dabc 753sub read_mirrored_by {
de34a54b 754 my $local = shift or return;
9ddc4ed0 755 my(%all,$url,$expected_size,$default,$ans,$host,
756 $dst,$country,$continent,@location);
05454584 757 my $fh = FileHandle->new;
758 $fh->open($local) or die "Couldn't open $local: $!";
f14b5cec 759 local $/ = "\012";
05454584 760 while (<$fh>) {
5f05dabc 761 ($host) = /^([\w\.\-]+)/ unless defined $host;
762 next unless defined $host;
763 next unless /\s+dst_(dst|location)/;
764 /location\s+=\s+\"([^\"]+)/ and @location = (split /\s*,\s*/, $1) and
765 ($continent, $country) = @location[-1,-2];
766 $continent =~ s/\s\(.*//;
f610777f 767 $continent =~ s/\W+$//; # if Jarkko doesn't know latitude/longitude
5f05dabc 768 /dst_dst\s+=\s+\"([^\"]+)/ and $dst = $1;
769 next unless $host && $dst && $continent && $country;
770 $all{$continent}{$country}{$dst} = CPAN::Mirrored::By->new($continent,$country,$dst);
771 undef $host;
772 $dst=$continent=$country="";
773 }
05454584 774 $fh->close;
5f05dabc 775 $CPAN::Config->{urllist} ||= [];
8962fc49 776 my @previous_urls = @{$CPAN::Config->{urllist}};
f610777f 777
8962fc49 778 $CPAN::Frontend->myprint($prompts{urls_intro});
5f05dabc 779
f610777f 780 my (@cont, $cont, %cont, @countries, @urls, %seen);
8962fc49 781 my $no_previous_warn =
782 "Sorry! since you don't have any existing picks, you must make a\n" .
783 "geographic selection.";
784 my $offer_cont = [sort keys %all];
785 if (@previous_urls) {
786 push @$offer_cont, "(edit previous picks)";
787 $default = @$offer_cont;
788 }
789 @cont = picklist($offer_cont,
f610777f 790 "Select your continent (or several nearby continents)",
8962fc49 791 $default,
f610777f 792 ! @previous_urls,
793 $no_previous_warn);
794
795
796 foreach $cont (@cont) {
797 my @c = sort keys %{$all{$cont}};
798 @cont{@c} = map ($cont, 0..$#c);
799 @c = map ("$_ ($cont)", @c) if @cont > 1;
800 push (@countries, @c);
5f05dabc 801 }
8962fc49 802 if (@previous_urls && @countries) {
803 push @countries, "(edit previous picks)";
804 $default = @countries;
805 }
f610777f 806
807 if (@countries) {
808 @countries = picklist (\@countries,
809 "Select your country (or several nearby countries)",
8962fc49 810 $default,
f610777f 811 ! @previous_urls,
812 $no_previous_warn);
813 %seen = map (($_ => 1), @previous_urls);
814 # hmmm, should take list of defaults from CPAN::Config->{'urllist'}...
815 foreach $country (@countries) {
8962fc49 816 next if $country =~ /edit previous picks/;
f610777f 817 (my $bare_country = $country) =~ s/ \(.*\)//;
818 my @u = sort keys %{$all{$cont{$bare_country}}{$bare_country}};
819 @u = grep (! $seen{$_}, @u);
820 @u = map ("$_ ($bare_country)", @u)
8962fc49 821 if @countries > 1;
f610777f 822 push (@urls, @u);
823 }
824 }
825 push (@urls, map ("$_ (previous pick)", @previous_urls));
5fc0f0f6 826 my $prompt = "Select as many URLs as you like (by number),
26844e27 827put them on one line, separated by blanks, hyphenated ranges allowed
828 e.g. '1 4 5' or '7 1-4 8'";
f610777f 829 if (@previous_urls) {
8962fc49 830 $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) ..
831 (scalar @urls));
832 $prompt .= "\n(or just hit RETURN to keep your previous picks)";
f610777f 833 }
834
835 @urls = picklist (\@urls, $prompt, $default);
836 foreach (@urls) { s/ \(.*\)//; }
8962fc49 837 push @$urllist, @urls;
de34a54b 838}
f610777f 839
de34a54b 840sub bring_your_own {
8962fc49 841 my %seen = map (($_ => 1), @$urllist);
de34a54b 842 my($ans,@urls);
f610777f 843 do {
de34a54b 844 my $prompt = "Enter another URL or RETURN to quit:";
845 unless (%seen) {
846 $prompt = qq{CPAN.pm needs at least one URL where it can fetch CPAN files from.
847
848Please enter your CPAN site:};
849 }
850 $ans = prompt ($prompt, "");
f610777f 851
852 if ($ans) {
de34a54b 853 $ans =~ s|/?\z|/|; # has to end with one slash
f610777f 854 $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
855 if ($ans =~ /^\w+:\/./) {
8d97e4a1 856 push @urls, $ans unless $seen{$ans}++;
de34a54b 857 } else {
8962fc49 858 $CPAN::Frontend->
859 myprint(sprintf(qq{"%s" doesn\'t look like an URL at first sight.
8d97e4a1 860I\'ll ignore it for now.
861You can add it to your %s
862later if you\'re sure it\'s right.\n},
8962fc49 863 $ans,
864 $INC{'CPAN/MyConfig.pm'}
865 || $INC{'CPAN/Config.pm'}
866 || "configuration file",
867 ));
f610777f 868 }
869 }
de34a54b 870 } while $ans || !%seen;
f610777f 871
8962fc49 872 push @$urllist, @urls;
f610777f 873 # xxx delete or comment these out when you're happy that it works
8962fc49 874 $CPAN::Frontend->myprint("New set of picks:\n");
875 map { $CPAN::Frontend->myprint(" $_\n") } @$urllist;
5f05dabc 876}
877
f915a99a 878
879sub _strip_spaces {
880 $_[0] =~ s/^\s+//; # no leading spaces
881 $_[0] =~ s/\s+\z//; # no trailing spaces
882}
883
f915a99a 884sub prompt ($;$) {
7fefbd44 885 unless (defined &_real_prompt) {
886 *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt;
887 }
f915a99a 888 my $ans = _real_prompt(@_);
889
890 _strip_spaces($ans);
891
892 return $ans;
893}
894
895
896sub prompt_no_strip ($;$) {
897 return _real_prompt(@_);
898}
899
900
9ddc4ed0 901BEGIN {
902
903my @prompts = (
904
905manual_config => qq[
906
907CPAN is the world-wide archive of perl resources. It consists of about
8962fc49 908300 sites that all replicate the same contents around the globe. Many
909countries have at least one CPAN site already. The resources found on
910CPAN are easily accessible with the CPAN.pm module. If you want to use
911CPAN.pm, lots of things have to be configured. Fortunately, most of
912them can be determined automatically. If you prefer the automatic
913configuration, answer 'yes' below.
914
915If you prefer to enter a dialog instead, you can answer 'no' to this
916question and I'll let you configure in small steps one thing after the
917other. (Note: you can revisit this dialog anytime later by typing 'o
918conf init' at the cpan prompt.)
9ddc4ed0 919
920],
921
922config_intro => qq{
923
924The following questions are intended to help you with the
925configuration. The CPAN module needs a directory of its own to cache
926important index files and maybe keep a temporary mirror of CPAN files.
927This may be a site-wide directory or a personal directory.
928
929},
930
931# cpan_home => qq{ },
932
933cpan_home_where => qq{
934
935First of all, I\'d like to create this directory. Where?
936
937},
938
939keep_source_where => qq{
940
8962fc49 941Unless you are accessing the CPAN via the filesystem directly CPAN.pm
942needs to keep the source files it downloads somewhere. Please supply a
943directory where the downloaded files are to be kept.},
9ddc4ed0 944
945build_cache_intro => qq{
946
947How big should the disk cache be for keeping the build directories
948with all the intermediate files\?
949
950},
951
952build_cache =>
953"Cache size for build directory (in MB)?",
954
8962fc49 955build_dir =>
956
957"Directory where the build process takes place?",
9ddc4ed0 958
959scan_cache_intro => qq{
960
961By default, each time the CPAN module is started, cache scanning is
962performed to keep the cache size in sync. To prevent this, answer
963'never'.
964
965},
966
967scan_cache => "Perform cache scanning (atstart or never)?",
968
8962fc49 969cache_metadata_intro => qq{
9ddc4ed0 970
971To considerably speed up the initial CPAN shell startup, it is
972possible to use Storable to create a cache of metadata. If Storable
973is not available, the normal index mechanism will be used.
974
975},
976
8962fc49 977cache_metadata => qq{Cache metadata (yes/no)?},
978
979term_is_latin_intro => qq{
9ddc4ed0 980
981The next option deals with the charset (aka character set) your
982terminal supports. In general, CPAN is English speaking territory, so
983the charset does not matter much, but some of the aliens out there who
984upload their software to CPAN bear names that are outside the ASCII
985range. If your terminal supports UTF-8, you should say no to the next
986question. If it supports ISO-8859-1 (also known as LATIN1) then you
987should say yes. If it supports neither, your answer does not matter
988because you will not be able to read the names of some authors
989anyway. If you answer no, names will be output in UTF-8.
990
991},
992
8962fc49 993term_is_latin => qq{Your terminal expects ISO-8859-1 (yes/no)?},
994
c9869e1c 995histfile_intro => qq{
9ddc4ed0 996
997If you have one of the readline packages (Term::ReadLine::Perl,
998Term::ReadLine::Gnu, possibly others) installed, the interactive CPAN
999shell will have history support. The next two questions deal with the
1000filename of the history file and with its size. If you do not want to
1001set this variable, please hit SPACE RETURN to the following question.
1002
1003},
1004
c9869e1c 1005histfile => qq{File to save your history?},
1006
9ddc4ed0 1007show_upload_date_intro => qq{
1008
1009The 'd' and the 'm' command normally only show you information they
1010have in their in-memory database and thus will never connect to the
1011internet. If you set the 'show_upload_date' variable to true, 'm' and
1012'd' will additionally show you the upload date of the module or
1013distribution. Per default this feature is off because it may require a
1014net connection to get at the upload date.
1015
1016},
1017
1018show_upload_date =>
1019"Always try to show upload date with 'd' and 'm' command (yes/no)?",
1020
1021prerequisites_policy_intro => qq{
1022
1023The CPAN module can detect when a module which you are trying to build
1024depends on prerequisites. If this happens, it can build the
1025prerequisites for you automatically ('follow'), ask you for
1026confirmation ('ask'), or just ignore them ('ignore'). Please set your
1027policy to one of the three values.
1028
1029},
1030
1031prerequisites_policy =>
c9869e1c 1032"Policy on building prerequisites (follow, ask or ignore)?",
9ddc4ed0 1033
ed84aac9 1034check_sigs_intro => qq{
1035
1036CPAN packages can be digitally signed by authors and thus verified
1037with the security provided by strong cryptography. The exact mechanism
1038is defined in the Module::Signature module. While this is generally
1039considered a good thing, it is not always convenient to the end user
1040to install modules that are signed incorrectly or where the key of the
1041author is not available or where some prerequisite for
1042Module::Signature has a bug and so on.
1043
1044With the check_sigs parameter you can turn signature checking on and
1045off. The default is off for now because the whole tool chain for the
1046functionality is not yet considered mature by some. The author of
1047CPAN.pm would recommend setting it to true most of the time and
1048turning it off only if it turns out to be annoying.
1049
1050Note that if you do not have Module::Signature installed, no signature
1051checks will be performed at all.
1052
1053},
1054
1055check_sigs =>
1056qq{Always try to check and verify signatures if a SIGNATURE file is in the package
1057and Module::Signature is installed (yes/no)?},
1058
8962fc49 1059test_report_intro =>
1060qq{
1061
1062The goal of the CPAN Testers project (http://testers.cpan.org/) is to
1063test as many CPAN packages as possible on as many platforms as
1064possible. This provides valuable feedback to module authors and
1065potential users to identify bugs or platform compatibility issues and
1066improves the overall quality and value of CPAN.
1067
1068One way you can contribute is to send test results for each module
1069that you install. If you install the CPAN::Reporter module, you have
1070the option to automatically generate and email test reports to CPAN
1071Testers whenever you run tests on a CPAN package.
1072
1073See the CPAN::Reporter documentation for additional details and
1074configuration settings. If your firewall blocks outgoing email,
1075you will need to configure CPAN::Reporter before sending reports.
1076
1077},
1078
1079test_report =>
1080qq{Email test reports if CPAN::Reporter is installed (yes/no)?},
1081
9ddc4ed0 1082external_progs => qq{
1083
1084The CPAN module will need a few external programs to work properly.
1085Please correct me, if I guess the wrong path for a program. Don\'t
1086panic if you do not have some of them, just press ENTER for those. To
8962fc49 1087disable the use of a program, you can type a space followed by ENTER.
9ddc4ed0 1088
1089},
1090
1091prefer_installer_intro => qq{
1092
1093When you have Module::Build installed and a module comes with both a
1094Makefile.PL and a Build.PL, which shall have precedence? The two
1095installer modules we have are the old and well established
8962fc49 1096ExtUtils::MakeMaker (for short: EUMM) which uses the Makefile.PL and
9ddc4ed0 1097the next generation installer Module::Build (MB) works with the
1098Build.PL.
1099
1100},
1101
1102prefer_installer =>
1103qq{In case you could choose, which installer would you prefer (EUMM or MB)?},
1104
1105makepl_arg_intro => qq{
1106
1107Every Makefile.PL is run by perl in a separate process. Likewise we
1108run \'make\' and \'make install\' in separate processes. If you have
1109any parameters \(e.g. PREFIX, LIB, UNINST or the like\) you want to
1110pass to the calls, please specify them here.
1111
1112If you don\'t understand this question, just press ENTER.
1113},
1114
1115makepl_arg => qq{
1116Parameters for the 'perl Makefile.PL' command?
1117Typical frequently used settings:
1118
1119 PREFIX=~/perl # non-root users (please see manual for more hints)
1120
1121Your choice: },
1122
1123make_arg => qq{Parameters for the 'make' command?
1124Typical frequently used setting:
1125
1126 -j3 # dual processor system
1127
1128Your choice: },
1129
1130
1131make_install_make_command => qq{Do you want to use a different make command for 'make install'?
1132Cautious people will probably prefer:
1133
1134 su root -c make
1135or
1136 sudo make
1137or
1138 /path1/to/sudo -u admin_account /path2/to/make
1139
1140or some such. Your choice: },
1141
1142
1143make_install_arg => qq{Parameters for the 'make install' command?
1144Typical frequently used setting:
1145
1146 UNINST=1 # to always uninstall potentially conflicting files
1147
1148Your choice: },
1149
1150
1151mbuildpl_arg_intro => qq{
1152
1153The next questions deal with Module::Build support.
1154
1155A Build.PL is run by perl in a separate process. Likewise we run
1156'./Build' and './Build install' in separate processes. If you have any
1157parameters you want to pass to the calls, please specify them here.
1158
1159},
1160
1161mbuildpl_arg => qq{Parameters for the 'perl Build.PL' command?
1162Typical frequently used settings:
1163
1164 --install_base /home/xxx # different installation directory
1165
1166Your choice: },
1167
1168mbuild_arg => qq{Parameters for the './Build' command?
1169Setting might be:
1170
1171 --extra_linker_flags -L/usr/foo/lib # non-standard library location
1172
1173Your choice: },
1174
1175
1176mbuild_install_build_command => qq{Do you want to use a different command for './Build install'?
1177Sudo users will probably prefer:
1178
1179 su root -c ./Build
1180or
1181 sudo ./Build
1182or
1183 /path1/to/sudo -u admin_account ./Build
1184
1185or some such. Your choice: },
1186
1187
1188mbuild_install_arg => qq{Parameters for the './Build install' command?
1189Typical frequently used setting:
1190
1191 --uninst 1 # uninstall conflicting files
1192
1193Your choice: },
1194
1195
1196
1197inactivity_timeout_intro => qq{
1198
1199Sometimes you may wish to leave the processes run by CPAN alone
8962fc49 1200without caring about them. Because the Makefile.PL or the Build.PL
1201sometimes contains question you\'re expected to answer, you can set a
1202timer that will kill a 'perl Makefile.PL' process after the specified
1203time in seconds.
9ddc4ed0 1204
1205If you set this value to 0, these processes will wait forever. This is
1206the default and recommended setting.
1207
1208},
1209
1210inactivity_timeout =>
1211qq{Timeout for inactivity during {Makefile,Build}.PL? },
1212
1213
c9869e1c 1214proxy_intro => qq{
9ddc4ed0 1215
1216If you\'re accessing the net via proxies, you can specify them in the
1217CPAN configuration or via environment variables. The variable in
1218the \$CPAN::Config takes precedence.
1219
1220},
1221
1222proxy_user => qq{
1223
1224If your proxy is an authenticating proxy, you can store your username
1225permanently. If you do not want that, just press RETURN. You will then
1226be asked for your username in every future session.
1227
1228},
1229
1230proxy_pass => qq{
1231
1232Your password for the authenticating proxy can also be stored
1233permanently on disk. If this violates your security policy, just press
1234RETURN. You will then be asked for the password in every future
1235session.
1236
1237},
1238
1239urls_intro => qq{
1240
1241Now we need to know where your favorite CPAN sites are located. Push
1242a few sites onto the array (just in case the first on the array won\'t
1243work). If you are mirroring CPAN to your local workstation, specify a
1244file: URL.
1245
8962fc49 1246First, pick a nearby continent and country by typing in the number(s)
1247in front of the item(s) you want to select. You can pick several of
1248each, separated by spaces. Then, you will be presented with a list of
1249URLs of CPAN mirrors in the countries you selected, along with
1250previously selected URLs. Select some of those URLs, or just keep the
1251old list. Finally, you will be prompted for any extra URLs -- file:,
1252ftp:, or http: -- that host a CPAN mirror.
9ddc4ed0 1253
1254},
1255
1256password_warn => qq{
1257
1258Warning: Term::ReadKey seems not to be available, your password will
1259be echoed to the terminal!
1260
1261},
1262
8962fc49 1263commandnumber_in_prompt => qq{
1264
1265The prompt of the cpan shell can contain the current command number
1266for easier tracking of the session or be a plain string. Do you want
1267the command number in the prompt (yes/no)?},
1268
1269ftp_passive => qq{
1270
1271Shall we always set FTP_PASSIVE envariable when dealing with ftp
1272download (yes/no)?},
1273
1274# taken from the manpage:
1275getcwd_intro => qq{
1276
1277CPAN.pm changes the current working directory often and needs to
1278determine its own current working directory. Per default it uses
1279Cwd::cwd but if this doesn't work on your system for some reason,
1280alternatives can be configured according to the following table:
1281
1282 cwd Cwd::cwd
1283 getcwd Cwd::getcwd
1284 fastcwd Cwd::fastcwd
1285 backtickcwd external command cwd
1286
1287},
1288
1289getcwd => qq{Preferred method for determining the current working directory?},
1290
1291index_expire_intro => qq{
1292
1293The CPAN indexes are usually rebuilt once or twice per hour, but the
1294typical CPAN mirror mirrors only once or twice per day. Depending on
1295the quality of your mirror and your desire to be on the bleeding edge,
1296you may want to set the following value to more or less than one day
1297(which is the default). It determines after how many days CPAN.pm
1298downloads new indexes.
1299
1300},
1301
1302index_expire => qq{Let the index expire after how many days?},
1303
1304term_ornaments => qq{
1305
1306When using Term::ReadLine, you can turn ornaments on so that your
1307input stands out against the output from CPAN.pm. Do you want to turn
1308ornaments on?},
1309
1310colorize_output => qq{
1311
1312When you have Term::ANSIColor installed, you can turn on colorized
1313output to have some visual differences between normal CPAN.pm output,
1314warnings, and the output of the modules being installed. Set your
1315favorite colors after some experimenting with the Term::ANSIColor
1316module. Do you want to turn on colored output?},
1317
1318colorize_print => qq{Color for normal output?},
1319
1320colorize_warn => qq{Color for warnings?},
1321
9ddc4ed0 1322);
1323
1324die "Coding error in \@prompts declaration. Odd number of elements, above"
1325 if (@prompts % 2);
1326
1327%prompts = @prompts;
1328
1329if (scalar(keys %prompts) != scalar(@prompts)/2) {
9ddc4ed0 1330 my %already;
9ddc4ed0 1331 for my $item (0..$#prompts) {
1332 next if $item % 2;
8962fc49 1333 die "$prompts[$item] is duplicated\n" if $already{$prompts[$item]}++;
9ddc4ed0 1334 }
9ddc4ed0 1335}
1336
8962fc49 1337} # EOBEGIN
9ddc4ed0 1338
5f05dabc 13391;