This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
4339b739af13de732a64fa9ac5977d00beec847e
[perl5.git] / cpan / CPAN / lib / CPAN / FirstTime.pm
1 # -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
2 # vim: ts=4 sts=4 sw=4:
3 package CPAN::FirstTime;
4 use strict;
5
6 use ExtUtils::MakeMaker ();
7 use FileHandle ();
8 use File::Basename ();
9 use File::Path ();
10 use File::Spec ();
11 use CPAN::Mirrors ();
12 use vars qw($VERSION $auto_config);
13 $VERSION = "5.5301";
14
15 =head1 NAME
16
17 CPAN::FirstTime - Utility for CPAN::Config file Initialization
18
19 =head1 SYNOPSIS
20
21 CPAN::FirstTime::init()
22
23 =head1 DESCRIPTION
24
25 The init routine asks a few questions and writes a CPAN/Config.pm or
26 CPAN/MyConfig.pm file (depending on what it is currently using).
27
28 In the following all questions and explanations regarding config
29 variables are collected.
30
31 =cut
32
33 # down until the next =back the manpage must be parsed by the program
34 # because the text is used in the init dialogues.
35
36 my @podpara = split /\n\n/, <<'=back';
37
38 =over 2
39
40 =item auto_commit
41
42 Normally CPAN.pm keeps config variables in memory and changes need to
43 be saved in a separate 'o conf commit' command to make them permanent
44 between sessions. If you set the 'auto_commit' option to true, changes
45 to a config variable are always automatically committed to disk.
46
47 Always commit changes to config variables to disk?
48
49 =item build_cache
50
51 CPAN.pm can limit the size of the disk area for keeping the build
52 directories with all the intermediate files.
53
54 Cache size for build directory (in MB)?
55
56 =item build_dir
57
58 Directory where the build process takes place?
59
60 =item build_dir_reuse
61
62 Until version 1.88 CPAN.pm never trusted the contents of the build_dir
63 directory between sessions. Since 1.88_58 CPAN.pm has a YAML-based
64 mechanism that makes it possible to share the contents of the
65 build_dir/ directory between different sessions with the same version
66 of perl. People who prefer to test things several days before
67 installing will like this feature because it safes a lot of time.
68
69 If you say yes to the following question, CPAN will try to store
70 enough information about the build process so that it can pick up in
71 future sessions at the same state of affairs as it left a previous
72 session.
73
74 Store and re-use state information about distributions between
75 CPAN.pm sessions?
76
77 =item build_requires_install_policy
78
79 When a module declares another one as a 'build_requires' prerequisite
80 this means that the other module is only needed for building or
81 testing the module but need not be installed permanently. In this case
82 you may wish to install that other module nonetheless or just keep it
83 in the 'build_dir' directory to have it available only temporarily.
84 Installing saves time on future installations but makes the perl
85 installation bigger.
86
87 You can choose if you want to always install (yes), never install (no)
88 or be always asked. In the latter case you can set the default answer
89 for the question to yes (ask/yes) or no (ask/no).
90
91 Policy on installing 'build_requires' modules (yes, no, ask/yes,
92 ask/no)?
93
94 =item cache_metadata
95
96 To considerably speed up the initial CPAN shell startup, it is
97 possible to use Storable to create a cache of metadata. If Storable is
98 not available, the normal index mechanism will be used.
99
100 Note: this mechanism is not used when use_sqlite is on and SQLLite is
101 running.
102
103 Cache metadata (yes/no)?
104
105 =item check_sigs
106
107 CPAN packages can be digitally signed by authors and thus verified
108 with the security provided by strong cryptography. The exact mechanism
109 is defined in the Module::Signature module. While this is generally
110 considered a good thing, it is not always convenient to the end user
111 to install modules that are signed incorrectly or where the key of the
112 author is not available or where some prerequisite for
113 Module::Signature has a bug and so on.
114
115 With the check_sigs parameter you can turn signature checking on and
116 off. The default is off for now because the whole tool chain for the
117 functionality is not yet considered mature by some. The author of
118 CPAN.pm would recommend setting it to true most of the time and
119 turning it off only if it turns out to be annoying.
120
121 Note that if you do not have Module::Signature installed, no signature
122 checks will be performed at all.
123
124 Always try to check and verify signatures if a SIGNATURE file is in
125 the package and Module::Signature is installed (yes/no)?
126
127 =item colorize_output
128
129 When you have Term::ANSIColor installed, you can turn on colorized
130 output to have some visual differences between normal CPAN.pm output,
131 warnings, debugging output, and the output of the modules being
132 installed. Set your favorite colors after some experimenting with the
133 Term::ANSIColor module.
134
135 Do you want to turn on colored output?
136
137 =item colorize_print
138
139 Color for normal output?
140
141 =item colorize_warn
142
143 Color for warnings?
144
145 =item colorize_debug
146
147 Color for debugging messages?
148
149 =item commandnumber_in_prompt
150
151 The prompt of the cpan shell can contain the current command number
152 for easier tracking of the session or be a plain string.
153
154 Do you want the command number in the prompt (yes/no)?
155
156 =item connect_to_internet_ok
157
158 If you have never defined your own C<urllist> in your configuration
159 then C<CPAN.pm> will be hesitant to use the built in default sites for
160 downloading. It will ask you once per session if a connection to the
161 internet is OK and only if you say yes, it will try to connect. But to
162 avoid this question, you can choose your favorite download sites once
163 and get away with it. Or, if you have no favorite download sites
164 answer yes to the following question.
165
166 If no urllist has been chosen yet, would you prefer CPAN.pm to connect
167 to the built-in default sites without asking? (yes/no)?
168
169 =item ftp_passive
170
171 Shall we always set the FTP_PASSIVE environment variable when dealing
172 with ftp download (yes/no)?
173
174 =item ftpstats_period
175
176 Statistics about downloads are truncated by size and period
177 simultaneously.
178
179 How many days shall we keep statistics about downloads?
180
181 =item ftpstats_size
182
183 Statistics about downloads are truncated by size and period
184 simultaneously.
185
186 How many items shall we keep in the statistics about downloads?
187
188 =item getcwd
189
190 CPAN.pm changes the current working directory often and needs to
191 determine its own current working directory. Per default it uses
192 Cwd::cwd but if this doesn't work on your system for some reason,
193 alternatives can be configured according to the following table:
194
195     cwd         Cwd::cwd
196     getcwd      Cwd::getcwd
197     fastcwd     Cwd::fastcwd
198     backtickcwd external command cwd
199
200 Preferred method for determining the current working directory?
201
202 =item halt_on_failure
203
204 Normaly, CPAN.pm continues processing the full list of targets and
205 dependencies, even if one of them fails.  However, you can specify 
206 that CPAN should halt after the first failure. 
207
208 Do you want to halt on failure (yes/no)?
209
210 =item histfile
211
212 If you have one of the readline packages (Term::ReadLine::Perl,
213 Term::ReadLine::Gnu, possibly others) installed, the interactive CPAN
214 shell will have history support. The next two questions deal with the
215 filename of the history file and with its size. If you do not want to
216 set this variable, please hit SPACE ENTER to the following question.
217
218 File to save your history?
219
220 =item histsize
221
222 Number of lines to save?
223
224 =item inactivity_timeout
225
226 Sometimes you may wish to leave the processes run by CPAN alone
227 without caring about them. Because the Makefile.PL or the Build.PL
228 sometimes contains question you're expected to answer, you can set a
229 timer that will kill a 'perl Makefile.PL' process after the specified
230 time in seconds.
231
232 If you set this value to 0, these processes will wait forever. This is
233 the default and recommended setting.
234
235 Timeout for inactivity during {Makefile,Build}.PL?
236
237 =item index_expire
238
239 The CPAN indexes are usually rebuilt once or twice per hour, but the
240 typical CPAN mirror mirrors only once or twice per day. Depending on
241 the quality of your mirror and your desire to be on the bleeding edge,
242 you may want to set the following value to more or less than one day
243 (which is the default). It determines after how many days CPAN.pm
244 downloads new indexes.
245
246 Let the index expire after how many days?
247
248 =item inhibit_startup_message
249
250 When the CPAN shell is started it normally displays a greeting message
251 that contains the running version and the status of readline support.
252
253 Do you want to turn this message off?
254
255 =item keep_source_where
256
257 Unless you are accessing the CPAN on your filesystem via a file: URL,
258 CPAN.pm needs to keep the source files it downloads somewhere. Please
259 supply a directory where the downloaded files are to be kept.
260
261 Download target directory?
262
263 =item load_module_verbosity
264
265 When CPAN.pm loads a module it needs for some optional feature, it
266 usually reports about module name and version. Choose 'v' to get this
267 message, 'none' to suppress it.
268
269 Verbosity level for loading modules (none or v)?
270
271 =item makepl_arg
272
273 Every Makefile.PL is run by perl in a separate process. Likewise we
274 run 'make' and 'make install' in separate processes. If you have
275 any parameters (e.g. PREFIX, UNINST or the like) you want to
276 pass to the calls, please specify them here.
277
278 If you don't understand this question, just press ENTER.
279
280 Typical frequently used settings:
281
282     PREFIX=~/perl    # non-root users (please see manual for more hints)
283
284 Parameters for the 'perl Makefile.PL' command?
285
286 =item make_arg
287
288 Parameters for the 'make' command? Typical frequently used setting:
289
290     -j3              # dual processor system (on GNU make)
291
292 Your choice:
293
294 =item make_install_arg
295
296 Parameters for the 'make install' command?
297 Typical frequently used setting:
298
299     UNINST=1         # to always uninstall potentially conflicting files
300                      # (but do NOT use with local::lib or INSTALL_BASE)
301
302 Your choice:
303
304 =item make_install_make_command
305
306 Do you want to use a different make command for 'make install'?
307 Cautious people will probably prefer:
308
309     su root -c make
310  or
311     sudo make
312  or
313     /path1/to/sudo -u admin_account /path2/to/make
314
315 or some such. Your choice:
316
317 =item mbuildpl_arg
318
319 A Build.PL is run by perl in a separate process. Likewise we run
320 './Build' and './Build install' in separate processes. If you have any
321 parameters you want to pass to the calls, please specify them here.
322
323 Typical frequently used settings:
324
325     --install_base /home/xxx             # different installation directory
326
327 Parameters for the 'perl Build.PL' command?
328
329 =item mbuild_arg
330
331 Parameters for the './Build' command? Setting might be:
332
333     --extra_linker_flags -L/usr/foo/lib  # non-standard library location
334
335 Your choice:
336
337 =item mbuild_install_arg
338
339 Parameters for the './Build install' command? Typical frequently used
340 setting:
341
342     --uninst 1                           # uninstall conflicting files
343                      # (but do NOT use with local::lib or INSTALL_BASE)
344
345 Your choice:
346
347 =item mbuild_install_build_command
348
349 Do you want to use a different command for './Build install'? Sudo
350 users will probably prefer:
351
352     su root -c ./Build
353  or
354     sudo ./Build
355  or
356     /path1/to/sudo -u admin_account ./Build
357
358 or some such. Your choice:
359
360 =item pager
361
362 What is your favorite pager program?
363
364 =item prefer_installer
365
366 When you have Module::Build installed and a module comes with both a
367 Makefile.PL and a Build.PL, which shall have precedence?
368
369 The main two standard installer modules are the old and well
370 established ExtUtils::MakeMaker (for short: EUMM) which uses the
371 Makefile.PL. And the next generation installer Module::Build (MB)
372 which works with the Build.PL (and often comes with a Makefile.PL
373 too). If a module comes only with one of the two we will use that one
374 but if both are supplied then a decision must be made between EUMM and
375 MB. See also http://rt.cpan.org/Ticket/Display.html?id=29235 for a
376 discussion about the right default.
377
378 Or, as a third option you can choose RAND which will make a random
379 decision (something regular CPAN testers will enjoy).
380
381 In case you can choose between running a Makefile.PL or a Build.PL,
382 which installer would you prefer (EUMM or MB or RAND)?
383
384 =item prefs_dir
385
386 CPAN.pm can store customized build environments based on regular
387 expressions for distribution names. These are YAML files where the
388 default options for CPAN.pm and the environment can be overridden and
389 dialog sequences can be stored that can later be executed by an
390 Expect.pm object. The CPAN.pm distribution comes with some prefab YAML
391 files that cover sample distributions that can be used as blueprints
392 to store one own prefs. Please check out the distroprefs/ directory of
393 the CPAN.pm distribution to get a quick start into the prefs system.
394
395 Directory where to store default options/environment/dialogs for
396 building modules that need some customization?
397
398 =item prerequisites_policy
399
400 The CPAN module can detect when a module which you are trying to build
401 depends on prerequisites. If this happens, it can build the
402 prerequisites for you automatically ('follow'), ask you for
403 confirmation ('ask'), or just ignore them ('ignore').  Choosing
404 'follow' also sets PERL_AUTOINSTALL and PERL_EXTUTILS_AUTOINSTALL for
405 "--defaultdeps" if not already set.
406
407 Please set your policy to one of the three values.
408
409 Policy on building prerequisites (follow, ask or ignore)?
410
411 =item randomize_urllist
412
413 CPAN.pm can introduce some randomness when using hosts for download
414 that are configured in the urllist parameter. Enter a numeric value
415 between 0 and 1 to indicate how often you want to let CPAN.pm try a
416 random host from the urllist. A value of one specifies to always use a
417 random host as the first try. A value of zero means no randomness at
418 all. Anything in between specifies how often, on average, a random
419 host should be tried first.
420
421 Randomize parameter
422
423 =item scan_cache
424
425 By default, each time the CPAN module is started, cache scanning is
426 performed to keep the cache size in sync ('atstart'). Alternatively,
427 scanning and cleanup can happen when CPAN exits ('atexit'). To prevent
428 any cache cleanup, answer 'never'.
429
430 Perform cache scanning ('atstart', 'atexit' or 'never')?
431
432 =item shell
433
434 What is your favorite shell?
435
436 =item show_unparsable_versions
437
438 During the 'r' command CPAN.pm finds modules without version number.
439 When the command finishes, it prints a report about this. If you
440 want this report to be very verbose, say yes to the following
441 variable.
442
443 Show all individual modules that have no $VERSION?
444
445 =item show_upload_date
446
447 The 'd' and the 'm' command normally only show you information they
448 have in their in-memory database and thus will never connect to the
449 internet. If you set the 'show_upload_date' variable to true, 'm' and
450 'd' will additionally show you the upload date of the module or
451 distribution. Per default this feature is off because it may require a
452 net connection to get at the upload date.
453
454 Always try to show upload date with 'd' and 'm' command (yes/no)?
455
456 =item show_zero_versions
457
458 During the 'r' command CPAN.pm finds modules with a version number of
459 zero. When the command finishes, it prints a report about this. If you
460 want this report to be very verbose, say yes to the following
461 variable.
462
463 Show all individual modules that have a $VERSION of zero?
464
465 =item tar_verbosity
466
467 When CPAN.pm uses the tar command, which switch for the verbosity
468 shall be used? Choose 'none' for quiet operation, 'v' for file
469 name listing, 'vv' for full listing.
470
471 Tar command verbosity level (none or v or vv)?
472
473 =item term_is_latin
474
475 The next option deals with the charset (aka character set) your
476 terminal supports. In general, CPAN is English speaking territory, so
477 the charset does not matter much but some CPAN have names that are
478 outside the ASCII range. If your terminal supports UTF-8, you should
479 say no to the next question. If it expects ISO-8859-1 (also known as
480 LATIN1) then you should say yes. If it supports neither, your answer
481 does not matter because you will not be able to read the names of some
482 authors anyway. If you answer no, names will be output in UTF-8.
483
484 Your terminal expects ISO-8859-1 (yes/no)?
485
486 =item term_ornaments
487
488 When using Term::ReadLine, you can turn ornaments on so that your
489 input stands out against the output from CPAN.pm.
490
491 Do you want to turn ornaments on?
492
493 =item test_report
494
495 The goal of the CPAN Testers project (http://testers.cpan.org/) is to
496 test as many CPAN packages as possible on as many platforms as
497 possible.  This provides valuable feedback to module authors and
498 potential users to identify bugs or platform compatibility issues and
499 improves the overall quality and value of CPAN.
500
501 One way you can contribute is to send test results for each module
502 that you install.  If you install the CPAN::Reporter module, you have
503 the option to automatically generate and deliver test reports to CPAN
504 Testers whenever you run tests on a CPAN package.
505
506 See the CPAN::Reporter documentation for additional details and
507 configuration settings.  If your firewall blocks outgoing traffic,
508 you may need to configure CPAN::Reporter before sending reports.
509
510 Generate test reports if CPAN::Reporter is installed (yes/no)?
511
512 =item perl5lib_verbosity
513
514 When CPAN.pm extends @INC via PERL5LIB, it prints a list of
515 directories added (or a summary of how many directories are
516 added).  Choose 'v' to get this message, 'none' to suppress it.
517
518 Verbosity level for PERL5LIB changes (none or v)?
519
520 =item prefer_external_tar
521
522 Per default all untar operations are done with the perl module
523 Archive::Tar; by setting this variable to true the external tar
524 command is used if available; on Unix this is usually preferred
525 because they have a reliable and fast gnutar implementation.
526
527 Use the external tar program instead of Archive::Tar?
528
529 =item trust_test_report_history
530
531 When a distribution has already been tested by CPAN::Reporter on
532 this machine, CPAN can skip the test phase and just rely on the
533 test report history instead.
534
535 Note that this will not apply to distributions that failed tests
536 because of missing dependencies.  Also, tests can be run
537 regardless of the history using "force".
538
539 Do you want to rely on the test report history (yes/no)?
540
541 =item use_file_homedir
542
543 Windows and Darwin have no tradition of providing a home directory for
544 their users, so it has been requested to support the use of
545 File::HomeDir. But after so many years of using File::HomeDir, this
546 module started to bother people because it didn't fulfil their
547 expectations. By setting this variable you can choose whether you want
548 to let File::HomeDir decide about your storage locations.
549
550 Use File::HomeDir to determine home directory and storage locations?
551
552 =item use_sqlite
553
554 CPAN::SQLite is a layer between the index files that are downloaded
555 from the CPAN and CPAN.pm that speeds up metadata queries and reduces
556 memory consumption of CPAN.pm considerably.
557
558 Use CPAN::SQLite if available? (yes/no)?
559
560 =item version_timeout
561
562 This timeout prevents CPAN from hanging when trying to parse a
563 pathologically coded $VERSION from a module.
564
565 The default is 15 seconds.  If you set this value to 0, no timeout
566 will occur, but this is not recommended.
567
568 Timeout for parsing module versions?
569
570 =item yaml_load_code
571
572 Both YAML.pm and YAML::Syck are capable of deserialising code. As this
573 requires a string eval, which might be a security risk, you can use
574 this option to enable or disable the deserialisation of code via
575 CPAN::DeferredCode. (Note: This does not work under perl 5.6)
576
577 Do you want to enable code deserialisation (yes/no)?
578
579 =item yaml_module
580
581 At the time of this writing (2009-03) there are three YAML
582 implementations working: YAML, YAML::Syck, and YAML::XS. The latter
583 two are faster but need a C compiler installed on your system. There
584 may be more alternative YAML conforming modules. When I tried two
585 other players, YAML::Tiny and YAML::Perl, they seemed not powerful
586 enough to work with CPAN.pm. This may have changed in the meantime.
587
588 Which YAML implementation would you prefer?
589
590 =back
591
592 =head1 LICENSE
593
594 This program is free software; you can redistribute it and/or
595 modify it under the same terms as Perl itself.
596
597 =cut
598
599 use vars qw( %prompts );
600
601 {
602
603     my @prompts = (
604
605 manual_config => qq[
606 CPAN is the world-wide archive of perl resources. It consists of about
607 300 sites that all replicate the same contents around the globe. Many
608 countries have at least one CPAN site already. The resources found on
609 CPAN are easily accessible with the CPAN.pm module. If you want to use
610 CPAN.pm, lots of things have to be configured. Fortunately, most of
611 them can be determined automatically. If you prefer the automatic
612 configuration, answer 'yes' below.
613
614 If you prefer to enter a dialog instead, you can answer 'no' to this
615 question and I'll let you configure in small steps one thing after the
616 other. (Note: you can revisit this dialog anytime later by typing 'o
617 conf init' at the cpan prompt.)
618
619 ],
620
621 auto_pick => qq{
622 Would you like me to automatically choose some CPAN mirror
623 sites for you? (This means connecting to the Internet)},
624
625 config_intro => qq{
626
627 The following questions are intended to help you with the
628 configuration. The CPAN module needs a directory of its own to cache
629 important index files and maybe keep a temporary mirror of CPAN files.
630 This may be a site-wide or a personal directory.
631
632 },
633
634 # cpan_home => qq{ },
635
636 cpan_home_where => qq{
637
638 First of all, I'd like to create this directory. Where?
639
640 },
641
642 external_progs => qq{
643
644 The CPAN module will need a few external programs to work properly.
645 Please correct me, if I guess the wrong path for a program. Don't
646 panic if you do not have some of them, just press ENTER for those. To
647 disable the use of a program, you can type a space followed by ENTER.
648
649 },
650
651 proxy_intro => qq{
652
653 If you're accessing the net via proxies, you can specify them in the
654 CPAN configuration or via environment variables. The variable in
655 the \$CPAN::Config takes precedence.
656
657 },
658
659 proxy_user => qq{
660
661 If your proxy is an authenticating proxy, you can store your username
662 permanently. If you do not want that, just press ENTER. You will then
663 be asked for your username in every future session.
664
665 },
666
667 proxy_pass => qq{
668
669 Your password for the authenticating proxy can also be stored
670 permanently on disk. If this violates your security policy, just press
671 ENTER. You will then be asked for the password in every future
672 session.
673
674 },
675
676 urls_intro => qq{
677 Now you need to choose your CPAN mirror sites.  You can let me
678 pick mirrors for you, you can select them from a list or you
679 can enter them by hand.
680 },
681
682 urls_picker_intro => qq{First, pick a nearby continent and country by typing in the number(s)
683 in front of the item(s) you want to select. You can pick several of
684 each, separated by spaces. Then, you will be presented with a list of
685 URLs of CPAN mirrors in the countries you selected, along with
686 previously selected URLs. Select some of those URLs, or just keep the
687 old list. Finally, you will be prompted for any extra URLs -- file:,
688 ftp:, or http: -- that host a CPAN mirror.
689
690 You should select more than one (just in case the first isn't available).
691
692 },
693
694 password_warn => qq{
695
696 Warning: Term::ReadKey seems not to be available, your password will
697 be echoed to the terminal!
698
699 },
700
701 install_help => qq{
702 Warning: You do not have write permission for Perl library directories.
703
704 To install modules, you need to configure a local Perl library directory or
705 escalate your privileges.  CPAN can help you by bootstrapping the local::lib
706 module or by configuring itself to use 'sudo' (if available).  You may also
707 resolve this problem manually if you need to customize your setup.
708
709 What approach do you want?  (Choose 'local::lib', 'sudo' or 'manual')
710 },
711
712 local_lib_installed => qq{
713 local::lib is installed. You must now add the following environment variables
714 to your shell configuration files (or registry, if you are on Windows) and
715 then restart your command line shell and CPAN before installing modules:
716
717 },
718
719               );
720
721     die "Coding error in \@prompts declaration.  Odd number of elements, above"
722         if (@prompts % 2);
723
724     %prompts = @prompts;
725
726     if (scalar(keys %prompts) != scalar(@prompts)/2) {
727         my %already;
728         for my $item (0..$#prompts) {
729             next if $item % 2;
730             die "$prompts[$item] is duplicated\n" if $already{$prompts[$item]}++;
731         }
732     }
733
734     shift @podpara;
735     while (@podpara) {
736         warn "Alert: cannot parse my own manpage for init dialog" unless $podpara[0] =~ s/^=item\s+//;
737         my $name = shift @podpara;
738         my @para;
739         while (@podpara && $podpara[0] !~ /^=item/) {
740             push @para, shift @podpara;
741         }
742         $prompts{$name} = pop @para;
743         if (@para) {
744             $prompts{$name . "_intro"} = join "", map { "$_\n\n" } @para;
745         }
746     }
747
748 }
749
750 sub init {
751     my($configpm, %args) = @_;
752     use Config;
753     # extra args after 'o conf init'
754     my $matcher = $args{args} && @{$args{args}} ? $args{args}[0] : '';
755     if ($matcher =~ /^\/(.*)\/$/) {
756         # case /regex/ => take the first, ignore the rest
757         $matcher = $1;
758         shift @{$args{args}};
759         if (@{$args{args}}) {
760             local $" = " ";
761             $CPAN::Frontend->mywarn("Ignoring excessive arguments '@{$args{args}}'");
762             $CPAN::Frontend->mysleep(2);
763         }
764     } elsif (0 == length $matcher) {
765     } elsif (0 && $matcher eq "~") { # extremely buggy, but a nice idea
766         my @unconfigured = grep { not exists $CPAN::Config->{$_}
767                                       or not defined $CPAN::Config->{$_}
768                                           or not length $CPAN::Config->{$_}
769                                   } keys %$CPAN::Config;
770         $matcher = "\\b(".join("|", @unconfigured).")\\b";
771         $CPAN::Frontend->mywarn("matcher[$matcher]");
772     } else {
773         # case WORD... => all arguments must be valid
774         for my $arg (@{$args{args}}) {
775             unless (exists $CPAN::HandleConfig::keys{$arg}) {
776                 $CPAN::Frontend->mywarn("'$arg' is not a valid configuration variable\n");
777                 return;
778             }
779         }
780         $matcher = "\\b(".join("|",@{$args{args}}).")\\b";
781     }
782     CPAN->debug("matcher[$matcher]") if $CPAN::DEBUG;
783
784     unless ($CPAN::VERSION) {
785         require CPAN::Nox;
786     }
787     require CPAN::HandleConfig;
788     CPAN::HandleConfig::require_myconfig_or_config();
789     $CPAN::Config ||= {};
790     local($/) = "\n";
791     local($\) = "";
792     local($|) = 1;
793
794     my($ans,$default); # why so half global?
795
796     #
797     #= Files, directories
798     #
799
800     unless ($matcher) {
801         $CPAN::Frontend->myprint($prompts{manual_config});
802     }
803
804     my $manual_conf;
805
806     local *_real_prompt;
807     if ( $args{autoconfig} ) {
808         $manual_conf = "no";
809     } elsif ($matcher) {
810         $manual_conf = "yes";
811     } else {
812         my $_conf = prompt("Would you like me to configure as much as possible ".
813                            "automatically?", "yes");
814         $manual_conf = ($_conf and $_conf =~ /^y/i) ? "no" : "yes";
815     }
816     CPAN->debug("manual_conf[$manual_conf]") if $CPAN::DEBUG;
817     $auto_config = 0;
818     {
819         if ($manual_conf =~ /^y/i) {
820             $auto_config = 0;
821         } else {
822             $auto_config = 1;
823             local $^W = 0;
824             # prototype should match that of &MakeMaker::prompt
825             my $current_second = time;
826             my $current_second_count = 0;
827             my $i_am_mad = 0;
828             # silent prompting -- just quietly use default
829             *_real_prompt = sub { return $_[1] };
830         }
831     }
832
833     #
834     # bootstrap local::lib or sudo
835     #
836     unless ( $matcher
837         || _can_write_to_libdirs() || _using_installbase() || _using_sudo()
838     ) {
839         local $auto_config = 0; # We *must* ask, even under autoconfig
840         local *_real_prompt;    # We *must* show prompt
841         my_prompt_loop(install_help => 'local::lib', $matcher,
842                    'local::lib|sudo|manual');
843     }
844     $CPAN::Config->{install_help} ||= ''; # Temporary to suppress warnings
845
846     if (!$matcher or q{
847                        build_dir
848                        build_dir_reuse
849                        cpan_home
850                        keep_source_where
851                        prefs_dir
852                       } =~ /$matcher/) {
853         $CPAN::Frontend->myprint($prompts{config_intro}) unless $auto_config;
854
855         init_cpan_home($matcher);
856
857         my_dflt_prompt("keep_source_where",
858                        File::Spec->catdir($CPAN::Config->{cpan_home},"sources"),
859                        $matcher,
860                       );
861         my_dflt_prompt("build_dir",
862                        File::Spec->catdir($CPAN::Config->{cpan_home},"build"),
863                        $matcher
864                       );
865         my_yn_prompt(build_dir_reuse => 0, $matcher);
866         my_dflt_prompt("prefs_dir",
867                        File::Spec->catdir($CPAN::Config->{cpan_home},"prefs"),
868                        $matcher
869                       );
870     }
871
872     #
873     #= Config: auto_commit
874     #
875
876     my_yn_prompt(auto_commit => 0, $matcher);
877
878     #
879     #= Cache size, Index expire
880     #
881     my_dflt_prompt(build_cache => 100, $matcher);
882
883     my_dflt_prompt(index_expire => 1, $matcher);
884     my_prompt_loop(scan_cache => 'atstart', $matcher, 'atstart|atexit|never');
885
886     #
887     #= cache_metadata
888     #
889
890     my_yn_prompt(cache_metadata => 1, $matcher);
891     my_yn_prompt(use_sqlite => 0, $matcher);
892
893     #
894     #= Do we follow PREREQ_PM?
895     #
896
897     my_prompt_loop(prerequisites_policy => 'follow', $matcher,
898                    'follow|ask|ignore');
899     my_prompt_loop(build_requires_install_policy => 'yes', $matcher,
900                    'yes|no|ask/yes|ask/no');
901
902     #
903     #= Module::Signature
904     #
905     my_yn_prompt(check_sigs => 0, $matcher);
906
907     #
908     #= CPAN::Reporter
909     #
910     if (!$matcher or 'test_report' =~ /$matcher/) {
911         my_yn_prompt(test_report => 0, $matcher);
912         if (
913             $CPAN::Config->{test_report} &&
914             $CPAN::META->has_inst("CPAN::Reporter") &&
915             CPAN::Reporter->can('configure')
916            ) {
917             local *_real_prompt;
918             *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt;
919             my $_conf = prompt("Would you like me configure CPAN::Reporter now?", $auto_config ? "no" : "yes");
920             if ($_conf =~ /^y/i) {
921               $CPAN::Frontend->myprint("\nProceeding to configure CPAN::Reporter.\n");
922               CPAN::Reporter::configure();
923               $CPAN::Frontend->myprint("\nReturning to CPAN configuration.\n");
924             }
925         }
926     }
927
928     my_yn_prompt(trust_test_report_history => 0, $matcher);
929
930     #
931     #= YAML vs. YAML::Syck
932     #
933     if (!$matcher or "yaml_module" =~ /$matcher/) {
934         my_dflt_prompt(yaml_module => "YAML", $matcher);
935         my $old_v = $CPAN::Config->{load_module_verbosity};
936         $CPAN::Config->{load_module_verbosity} = q[none];
937         if (!$auto_config && !$CPAN::META->has_inst($CPAN::Config->{yaml_module})) {
938             $CPAN::Frontend->mywarn
939                 ("Warning (maybe harmless): '$CPAN::Config->{yaml_module}' not installed.\n");
940             $CPAN::Frontend->mysleep(3);
941         }
942         $CPAN::Config->{load_module_verbosity} = $old_v;
943     }
944
945     #
946     #= YAML code deserialisation
947     #
948     my_yn_prompt(yaml_load_code => 0, $matcher);
949
950     #
951     #= External programs
952     #
953     my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
954     $CPAN::Frontend->myprint($prompts{external_progs})
955         if !$matcher && !$auto_config;
956     _init_external_progs($matcher, {
957         path => \@path,
958         progs => [ qw/make bzip2 gzip tar unzip gpg patch applypatch/ ],
959         shortcut => 0
960       });
961     _init_external_progs($matcher, {
962         path => \@path,
963         progs => [ qw/wget curl lynx ncftpget ncftp ftp/ ],
964         shortcut => 1
965       });
966
967     {
968         my $path = $CPAN::Config->{'pager'} ||
969             $ENV{PAGER} || find_exe("less",\@path) ||
970                 find_exe("more",\@path) || ($^O eq 'MacOS' ? $ENV{EDITOR} : 0 )
971                     || "more";
972         my_dflt_prompt(pager => $path, $matcher);
973     }
974
975     {
976         my $path = $CPAN::Config->{'shell'};
977         if ($path && File::Spec->file_name_is_absolute($path)) {
978             $CPAN::Frontend->mywarn("Warning: configured $path does not exist\n")
979                 unless -e $path;
980             $path = "";
981         }
982         $path ||= $ENV{SHELL};
983         $path ||= $ENV{COMSPEC} if $^O eq "MSWin32";
984         if ($^O eq 'MacOS') {
985             $CPAN::Config->{'shell'} = 'not_here';
986         } else {
987             $path ||= 'sh', $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only
988             my_dflt_prompt(shell => $path, $matcher);
989         }
990     }
991
992     {
993         my $tar = $CPAN::Config->{tar};
994         my $prefer_external_tar = $CPAN::Config->{prefer_external_tar}; # XXX not yet supported
995         unless (defined $prefer_external_tar) {
996             if ($^O =~ /(MSWin32|solaris)/) {
997                 # both have a record of broken tars
998                 $prefer_external_tar = 0;
999             } elsif ($tar) {
1000                 $prefer_external_tar = 1;
1001             } else {
1002                 $prefer_external_tar = 0;
1003             }
1004         }
1005         my_yn_prompt(prefer_external_tar => $prefer_external_tar, $matcher);
1006     }
1007
1008     #
1009     # verbosity
1010     #
1011
1012     my_prompt_loop(tar_verbosity => 'none', $matcher,
1013                    'none|v|vv');
1014     my_prompt_loop(load_module_verbosity => 'none', $matcher,
1015                    'none|v');
1016     my_prompt_loop(perl5lib_verbosity => 'none', $matcher,
1017                    'none|v');
1018     my_yn_prompt(inhibit_startup_message => 0, $matcher);
1019
1020     #
1021     #= Installer, arguments to make etc.
1022     #
1023
1024     my_prompt_loop(prefer_installer => 'MB', $matcher, 'MB|EUMM|RAND');
1025
1026     if (!$matcher or 'makepl_arg make_arg' =~ /$matcher/) {
1027         my_dflt_prompt(makepl_arg => "", $matcher);
1028         my_dflt_prompt(make_arg => "", $matcher);
1029         if ( $CPAN::Config->{makepl_arg} =~ /LIBS=|INC=/ ) {
1030             $CPAN::Frontend->mywarn( 
1031                 "Warning: Using LIBS or INC in makepl_arg will likely break distributions\n" . 
1032                 "that specify their own LIBS or INC options in Makefile.PL.\n"
1033             );
1034         }
1035
1036     }
1037
1038     require CPAN::HandleConfig;
1039     if (exists $CPAN::HandleConfig::keys{make_install_make_command}) {
1040         # as long as Windows needs $self->_build_command, we cannot
1041         # support sudo on windows :-)
1042         my $default = $CPAN::Config->{make} || "";
1043         if ( $default && $CPAN::Config->{install_help} eq 'sudo' ) {
1044             if ( find_exe('sudo') ) {
1045                 $default = "sudo $default";
1046                 delete $CPAN::Config->{make_install_make_command}
1047                     unless $CPAN::Config->{make_install_make_command} =~ /sudo/;
1048             }
1049             else {
1050                 $CPAN::Frontend->mywarnonce("Could not find 'sudo' in PATH\n");
1051             }
1052         }
1053         my_dflt_prompt(make_install_make_command => $default, $matcher);
1054     }
1055
1056     my_dflt_prompt(make_install_arg => $CPAN::Config->{make_arg} || "",
1057                    $matcher);
1058
1059     my_dflt_prompt(mbuildpl_arg => "", $matcher);
1060     my_dflt_prompt(mbuild_arg => "", $matcher);
1061
1062     if (exists $CPAN::HandleConfig::keys{mbuild_install_build_command}
1063         and $^O ne "MSWin32") {
1064         # as long as Windows needs $self->_build_command, we cannot
1065         # support sudo on windows :-)
1066         my $default = "./Build";
1067         if ( $CPAN::Config->{install_help} eq 'sudo' ) {
1068             if ( find_exe('sudo') ) {
1069                 $default = "sudo $default";
1070                 delete $CPAN::Config->{mbuild_install_build_command}
1071                     unless $CPAN::Config->{mbuild_install_build_command} =~ /sudo/;
1072             }
1073             else {
1074                 $CPAN::Frontend->mywarnonce("Could not find 'sudo' in PATH\n");
1075             }
1076         }
1077         my_dflt_prompt(mbuild_install_build_command => $default, $matcher);
1078     }
1079
1080     my_dflt_prompt(mbuild_install_arg => "", $matcher);
1081
1082     #
1083     #= Alarm period
1084     #
1085
1086     my_dflt_prompt(inactivity_timeout => 0, $matcher);
1087     my_dflt_prompt(version_timeout => 15, $matcher);
1088
1089     #
1090     #== halt_on_failure
1091     #
1092     my_yn_prompt(halt_on_failure => 0, $matcher);
1093
1094     #
1095     #= Proxies
1096     #
1097
1098     my @proxy_vars = qw/ftp_proxy http_proxy no_proxy/;
1099     my @proxy_user_vars = qw/proxy_user proxy_pass/;
1100     if (!$matcher or "@proxy_vars @proxy_user_vars" =~ /$matcher/) {
1101         $CPAN::Frontend->myprint($prompts{proxy_intro}) unless $auto_config;
1102
1103         for (@proxy_vars) {
1104             $prompts{$_} = "Your $_?";
1105             my_dflt_prompt($_ => $ENV{$_}||"", $matcher);
1106         }
1107
1108         if ($CPAN::Config->{ftp_proxy} ||
1109             $CPAN::Config->{http_proxy}) {
1110
1111             $default = $CPAN::Config->{proxy_user} || $CPAN::LWP::UserAgent::USER || "";
1112
1113             $CPAN::Frontend->myprint($prompts{proxy_user}) unless $auto_config;
1114
1115             if ($CPAN::Config->{proxy_user} = prompt("Your proxy user id?",$default)) {
1116                 $CPAN::Frontend->myprint($prompts{proxy_pass}) unless $auto_config;
1117
1118                 if ($CPAN::META->has_inst("Term::ReadKey")) {
1119                     Term::ReadKey::ReadMode("noecho");
1120                 } else {
1121                     $CPAN::Frontend->myprint($prompts{password_warn}) unless $auto_config;
1122                 }
1123                 $CPAN::Config->{proxy_pass} = prompt_no_strip("Your proxy password?");
1124                 if ($CPAN::META->has_inst("Term::ReadKey")) {
1125                     Term::ReadKey::ReadMode("restore");
1126                 }
1127                 $CPAN::Frontend->myprint("\n\n") unless $auto_config;
1128             }
1129         }
1130     }
1131
1132     #
1133     #= how FTP works
1134     #
1135
1136     my_yn_prompt(ftp_passive => 1, $matcher);
1137
1138     #
1139     #= how cwd works
1140     #
1141
1142     my_prompt_loop(getcwd => 'cwd', $matcher,
1143                    'cwd|getcwd|fastcwd|backtickcwd');
1144
1145     #
1146     #= the CPAN shell itself (prompt, color)
1147     #
1148
1149     my_yn_prompt(commandnumber_in_prompt => 1, $matcher);
1150     my_yn_prompt(term_ornaments => 1, $matcher);
1151     if ("colorize_output colorize_print colorize_warn colorize_debug" =~ $matcher) {
1152         my_yn_prompt(colorize_output => 0, $matcher);
1153         if ($CPAN::Config->{colorize_output}) {
1154             if ($CPAN::META->has_inst("Term::ANSIColor")) {
1155                 my $T="gYw";
1156                 $CPAN::Frontend->myprint( "                                      on_  on_y ".
1157                     "        on_ma           on_\n") unless $auto_config;
1158                 $CPAN::Frontend->myprint( "                   on_black on_red  green ellow ".
1159                     "on_blue genta on_cyan white\n") unless $auto_config;
1160
1161                 for my $FG ("", "bold",
1162                             map {$_,"bold $_"} "black","red","green",
1163                             "yellow","blue",
1164                             "magenta",
1165                             "cyan","white") {
1166                     $CPAN::Frontend->myprint(sprintf( "%12s ", $FG)) unless $auto_config;
1167                     for my $BG ("",map {"on_$_"} qw(black red green yellow
1168                                                     blue magenta cyan white)) {
1169                             $CPAN::Frontend->myprint( $FG||$BG ?
1170                             Term::ANSIColor::colored("  $T  ","$FG $BG") : "  $T  ") unless $auto_config;
1171                     }
1172                     $CPAN::Frontend->myprint( "\n" ) unless $auto_config;
1173                 }
1174                 $CPAN::Frontend->myprint( "\n" ) unless $auto_config;
1175             }
1176             for my $tuple (
1177                            ["colorize_print", "bold blue on_white"],
1178                            ["colorize_warn", "bold red on_white"],
1179                            ["colorize_debug", "black on_cyan"],
1180                           ) {
1181                 my_dflt_prompt($tuple->[0] => $tuple->[1], $matcher);
1182                 if ($CPAN::META->has_inst("Term::ANSIColor")) {
1183                     eval { Term::ANSIColor::color($CPAN::Config->{$tuple->[0]})};
1184                     if ($@) {
1185                         $CPAN::Config->{$tuple->[0]} = $tuple->[1];
1186                         $CPAN::Frontend->mywarn($@."setting to default '$tuple->[1]'\n");
1187                     }
1188                 }
1189             }
1190         }
1191     }
1192
1193     #
1194     #== term_is_latin
1195     #
1196
1197     my_yn_prompt(term_is_latin => 1, $matcher);
1198
1199     #
1200     #== save history in file 'histfile'
1201     #
1202
1203     if (!$matcher or 'histfile histsize' =~ /$matcher/) {
1204         $CPAN::Frontend->myprint($prompts{histfile_intro}) unless $auto_config;
1205         defined($default = $CPAN::Config->{histfile}) or
1206             $default = File::Spec->catfile($CPAN::Config->{cpan_home},"histfile");
1207         my_dflt_prompt(histfile => $default, $matcher);
1208
1209         if ($CPAN::Config->{histfile}) {
1210             defined($default = $CPAN::Config->{histsize}) or $default = 100;
1211             my_dflt_prompt(histsize => $default, $matcher);
1212         }
1213     }
1214
1215     #
1216     #== do an ls on the m or the d command
1217     #
1218     my_yn_prompt(show_upload_date => 0, $matcher);
1219
1220     #
1221     #== verbosity at the end of the r command
1222     #
1223     if (!$matcher
1224         or 'show_unparsable_versions' =~ /$matcher/
1225         or 'show_zero_versions' =~ /$matcher/
1226        ) {
1227         $CPAN::Frontend->myprint($prompts{show_unparsable_or_zero_versions_intro});
1228         my_yn_prompt(show_unparsable_versions => 0, $matcher);
1229         my_yn_prompt(show_zero_versions => 0, $matcher);
1230     }
1231
1232     #
1233     #= MIRRORED.BY and conf_sites()
1234     #
1235
1236     # Let's assume they want to use the internet and make them turn it
1237     # off if they really don't.
1238     my_yn_prompt("connect_to_internet_ok" => 1, $matcher);
1239
1240     # Allow matching but don't show during manual config
1241     if ($matcher) {
1242         if ("randomize_urllist" =~ $matcher) {
1243             my_dflt_prompt(randomize_urllist => 0, $matcher);
1244         }
1245         if ("ftpstats_size" =~ $matcher) {
1246             my_dflt_prompt(ftpstats_size => 99, $matcher);
1247         }
1248         if ("ftpstats_period" =~ $matcher) {
1249             my_dflt_prompt(ftpstats_period => 14, $matcher);
1250         }
1251     }
1252
1253     $CPAN::Config->{urllist} ||= [];
1254
1255     if ($auto_config) {
1256         if(@{ $CPAN::Config->{urllist} }) {
1257             $CPAN::Frontend->myprint(
1258                 "Your 'urllist' is already configured. Type 'o conf init urllist' to change it.\n"
1259             );
1260         }
1261         else {
1262           $CPAN::Frontend->myprint(
1263             "Autoconfigured everything but 'urllist'.\n"
1264           );
1265             _do_pick_mirrors();
1266         }
1267     }
1268     elsif (!$matcher || "urllist" =~ $matcher) {
1269         _do_pick_mirrors();
1270     }
1271
1272     if ($auto_config) {
1273         $CPAN::Frontend->myprint(
1274             "\nAutoconfiguration complete.\n"
1275         );
1276         $auto_config = 0; # reset
1277     }
1278
1279     if (!$matcher || "use_file_homedir" =~ $matcher) {
1280         my $use_file_homedir = CPAN::_use_file_homedir();
1281         my_yn_prompt("use_file_homedir" => $use_file_homedir, $matcher);
1282     }
1283
1284     # bootstrap local::lib now if requested
1285     if ( $CPAN::Config->{install_help} eq 'local::lib' ) {
1286         if ( ! @{ $CPAN::Config->{urllist} } ) {
1287             $CPAN::Frontend->myprint(
1288                 "Skipping local::lib bootstrap because 'urllist' is not configured.\n"
1289             );
1290           }
1291           else {
1292             $CPAN::Frontend->myprint("\nAttempting to boostrap local::lib...\n");
1293             $CPAN::Frontend->myprint("\nWriting $configpm for bootstrap...\n");
1294             delete $CPAN::Config->{install_help}; # temporary only
1295             CPAN::HandleConfig->commit($configpm);
1296             my $dist;
1297             if ( $dist = CPAN::Shell->expand('Module', 'local::lib')->distribution ) {
1298                 # this is a hack to force bootstrapping
1299                 $dist->{prefs}{pl}{commandline} = "$^X Makefile.PL --bootstrap";
1300                 # Set @INC for this process so we find things as they bootstrap
1301                 require lib;
1302                 lib->import(_local_lib_inc_path());
1303                 eval { $dist->install };
1304             }
1305             if ( ! $dist || (my $err = $@) ) {
1306                 $err ||= 'Could not locate local::lib in the CPAN index';
1307                 $CPAN::Frontend->mywarn("Error bootstrapping local::lib: $@\n");
1308                 $CPAN::Frontend->myprint("From the CPAN Shell, you might try 'look local::lib' and \n"
1309                     . "run 'perl Makefile --bootstrap' and see if that is successful.  Then\n"
1310                     . "restart your CPAN client\n"
1311             );
1312             }
1313             else {
1314                 _local_lib_config();
1315           }
1316         }
1317     }
1318
1319     # install_help is temporary for configuration and not saved
1320     delete $CPAN::Config->{install_help};
1321
1322     $CPAN::Frontend->myprint("\n");
1323     if ($matcher && !$CPAN::Config->{auto_commit}) {
1324         $CPAN::Frontend->myprint("Please remember to call 'o conf commit' to ".
1325                                  "make the config permanent!\n");
1326     } else {
1327         CPAN::HandleConfig->commit($configpm);
1328     }
1329 }
1330
1331 sub _local_lib_config {
1332     # Set environment stuff for this process
1333     require local::lib;
1334     my %env = local::lib->build_environment_vars_for(_local_lib_path(), 1);
1335     while ( my ($k, $v) = each %env ) {
1336         $ENV{$k} = $v;
1337     }
1338
1339     # Tell user about environment vars to set
1340     $CPAN::Frontend->myprint($prompts{local_lib_installed});
1341     local $ENV{SHELL} = $CPAN::Config->{shell} || $ENV{SHELL};
1342     my $shellvars = local::lib->environment_vars_string_for(_local_lib_path());
1343     $CPAN::Frontend->myprint($shellvars);
1344
1345     # Offer to mangle the shell config
1346     my $munged_rc;
1347     if ( my $rc = _find_shell_config() ) {
1348         local $auto_config = 0; # We *must* ask, even under autoconfig
1349         local *_real_prompt;    # We *must* show prompt
1350         my $_conf = prompt(
1351             "\nWould you like me to append that to $rc now?", "yes"
1352         );
1353         if ($_conf =~ /^y/i) {
1354             open my $fh, ">>", $rc;
1355             print {$fh} "\n$shellvars";
1356             close $fh;
1357             $munged_rc++;
1358         }
1359     }
1360
1361     # Warn at exit time
1362     if ($munged_rc) {
1363         push @{$CPAN::META->_exit_messages}, << "HERE";
1364
1365 *** Remember to restart your shell before running cpan again ***
1366 HERE
1367     }
1368     else {
1369         push @{$CPAN::META->_exit_messages}, << "HERE";
1370
1371 *** Remember to add these environment variables to your shell config
1372     and restart your shell before running cpan again ***
1373
1374 $shellvars
1375 HERE
1376     }
1377 }
1378
1379 {
1380     my %shell_rc_map = (
1381         map { $_ => ".${_}rc" } qw/ bash tcsh csh /,
1382         map { $_ => ".profile" } qw/dash ash sh/,
1383         zsh  => ".zshenv",
1384     );
1385
1386     sub _find_shell_config {
1387         my $shell = File::Basename::basename($CPAN::Config->{shell});
1388         if ( my $rc = $shell_rc_map{$shell} ) {
1389             my $path = File::Spec->catfile($ENV{HOME}, $rc);
1390             return $path if -w $path;
1391         }
1392     }
1393 }
1394
1395
1396 sub _local_lib_inc_path {
1397     return File::Spec->catdir(_local_lib_path(), qw/lib perl5/);
1398 }
1399
1400 sub _local_lib_path {
1401     return File::Spec->catdir(_local_lib_home(), 'perl5');
1402 }
1403
1404 # Adapted from resolve_home_path() in local::lib -- this is where
1405 # local::lib thinks the user's home is
1406 {
1407     my $local_lib_home;
1408     sub _local_lib_home {
1409         $local_lib_home ||= File::Spec->rel2abs( do {
1410             if (CPAN::_use_file_homedir()) {
1411                 File::HomeDir->my_home;
1412             } elsif (defined $ENV{HOME}) {
1413                 $ENV{HOME};
1414             } else {
1415                 (getpwuid $<)[7] || "~";
1416             }
1417         });
1418     }
1419 }
1420
1421 sub _do_pick_mirrors {
1422     local *_real_prompt;
1423     *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt;
1424     $CPAN::Frontend->myprint($prompts{urls_intro});
1425     # Only prompt for auto-pick if Net::Ping is new enough to do timings
1426     my $_conf = 'n';
1427     if ( $CPAN::META->has_usable("Net::Ping") && Net::Ping->VERSION gt '2.13') {
1428         $_conf = prompt($prompts{auto_pick}, "yes");
1429     }
1430     my @old_list = @{ $CPAN::Config->{urllist} };
1431     if ( $_conf =~ /^y/i ) {
1432         conf_sites( auto_pick => 1 ) or bring_your_own();
1433     }
1434     else {
1435         _print_urllist('Current') if @old_list;
1436         my $msg = scalar @old_list
1437             ? "Would you like to edit the urllist or pick new mirrors from a list?"
1438             : "Would you like to pick from the CPAN mirror list?" ;
1439         my $_conf = prompt($msg, "yes");
1440         if ( $_conf =~ /^y/i ) {
1441             conf_sites();
1442         }
1443         bring_your_own();
1444     }
1445     _print_urllist('New');
1446 }
1447
1448 sub _init_external_progs {
1449     my($matcher,$args) = @_;
1450     my $PATH = $args->{path};
1451     my @external_progs = @{ $args->{progs} };
1452     my $shortcut = $args->{shortcut};
1453     my $showed_make_warning;
1454
1455     if (!$matcher or "@external_progs" =~ /$matcher/) {
1456         my $old_warn = $^W;
1457         local $^W if $^O eq 'MacOS';
1458         local $^W = $old_warn;
1459         my $progname;
1460         for $progname (@external_progs) {
1461             next if $matcher && $progname !~ /$matcher/;
1462             if ($^O eq 'MacOS') {
1463                 $CPAN::Config->{$progname} = 'not_here';
1464                 next;
1465             }
1466
1467             my $progcall = $progname;
1468             unless ($matcher) {
1469                 # we really don't need ncftp if we have ncftpget, but
1470                 # if they chose this dialog via matcher, they shall have it
1471                 next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " ";
1472             }
1473             my $path = $CPAN::Config->{$progname}
1474                 || $Config::Config{$progname}
1475                     || "";
1476             if (File::Spec->file_name_is_absolute($path)) {
1477                 # testing existence is not good enough, some have these exe
1478                 # extensions
1479
1480                 # warn "Warning: configured $path does not exist\n" unless -e $path;
1481                 # $path = "";
1482             } elsif ($path =~ /^\s+$/) {
1483                 # preserve disabled programs
1484             } else {
1485                 $path = '';
1486             }
1487             unless ($path) {
1488                 # e.g. make -> nmake
1489                 $progcall = $Config::Config{$progname} if $Config::Config{$progname};
1490             }
1491
1492             $path ||= find_exe($progcall,$PATH);
1493             unless ($path) { # not -e $path, because find_exe already checked that
1494                 local $"=";";
1495                 $CPAN::Frontend->mywarn("Warning: $progcall not found in PATH[@$PATH]\n") unless $auto_config;
1496                 _beg_for_make(), $showed_make_warning++ if $progname eq "make";
1497             }
1498             $prompts{$progname} = "Where is your $progname program?";
1499             $path = my_dflt_prompt($progname,$path,$matcher,1); # 1 => no strip spaces
1500             my $disabling = $path =~ m/^\s*$/;
1501
1502             # don't let them disable or misconfigure make without warning
1503             if ( $progname eq "make" && ( $disabling || ! _check_found($path) ) ) {
1504               if ( $disabling && $showed_make_warning ) {
1505                 next;
1506               }
1507               else {
1508                 _beg_for_make() unless $showed_make_warning++;
1509                 undef $CPAN::Config->{$progname};
1510                 $CPAN::Frontend->mywarn("Press SPACE and ENTER to disable make (NOT RECOMMENDED)\n");
1511                 redo;
1512               }
1513             }
1514             elsif ( $disabling ) {
1515               next;
1516             }
1517             elsif ( _check_found( $CPAN::Config->{$progname} ) ) {
1518               last if $shortcut && !$matcher;
1519             }
1520             else {
1521               undef $CPAN::Config->{$progname};
1522               $CPAN::Frontend->mywarn("Press SPACE and ENTER to disable $progname\n");
1523               redo;
1524             }
1525         }
1526     }
1527 }
1528
1529 sub _check_found {
1530   my ($prog) = @_;
1531   if ( ! -f $prog ) {
1532     $CPAN::Frontend->mywarn("Warning: '$prog' does not exist\n")
1533       unless $auto_config;
1534     return;
1535   }
1536   elsif ( ! -x $prog ) {
1537     $CPAN::Frontend->mywarn("Warning: '$prog' is not executable\n")
1538       unless $auto_config;
1539     return;
1540   }
1541   return 1;
1542 }
1543
1544 sub _beg_for_make {
1545   $CPAN::Frontend->mywarn(<<"HERE");
1546
1547 ALERT: 'make' is an essential tool for building perl Modules.
1548 Please make sure you have 'make' (or some equivalent) working.
1549
1550 HERE
1551                     if ($^O eq "MSWin32") {
1552     $CPAN::Frontend->mywarn(<<"HERE");
1553 Windows users may want to follow this procedure when back in the CPAN shell:
1554
1555     look YVES/scripts/alien_nmake.pl
1556     perl alien_nmake.pl
1557
1558 This will install nmake on your system which can be used as a 'make'
1559 substitute. You can then revisit this dialog with
1560
1561     o conf init make
1562
1563 HERE
1564     }
1565 }
1566
1567 sub init_cpan_home {
1568     my($matcher) = @_;
1569     if (!$matcher or 'cpan_home' =~ /$matcher/) {
1570         my $cpan_home = $CPAN::Config->{cpan_home}
1571             || File::Spec->catdir(CPAN::HandleConfig::home(), ".cpan");
1572
1573         if (-d $cpan_home) {
1574             $CPAN::Frontend->myprint(qq{
1575
1576 I see you already have a  directory
1577     $cpan_home
1578 Shall we use it as the general CPAN build and cache directory?
1579
1580 }) unless $auto_config;
1581         } else {
1582             # no cpan-home, must prompt and get one
1583             $CPAN::Frontend->myprint($prompts{cpan_home_where}) unless $auto_config;
1584         }
1585
1586         my $default = $cpan_home;
1587         my $loop = 0;
1588         my($last_ans,$ans);
1589         $CPAN::Frontend->myprint(" <cpan_home>\n") unless $auto_config;
1590     PROMPT: while ($ans = prompt("CPAN build and cache directory?",$default)) {
1591             if (File::Spec->file_name_is_absolute($ans)) {
1592                 my @cpan_home = split /[\/\\]/, $ans;
1593             DIR: for my $dir (@cpan_home) {
1594                     if ($dir =~ /^~/ and (!$last_ans or $ans ne $last_ans)) {
1595                         $CPAN::Frontend
1596                             ->mywarn("Warning: a tilde in the path will be ".
1597                                      "taken as a literal tilde. Please ".
1598                                      "confirm again if you want to keep it\n");
1599                         $last_ans = $default = $ans;
1600                         next PROMPT;
1601                     }
1602                 }
1603             } else {
1604                 require Cwd;
1605                 my $cwd = Cwd::cwd();
1606                 my $absans = File::Spec->catdir($cwd,$ans);
1607                 $CPAN::Frontend->mywarn("The path '$ans' is not an ".
1608                                         "absolute path. Please specify ".
1609                                         "an absolute path\n");
1610                 $default = $absans;
1611                 next PROMPT;
1612             }
1613             eval { File::Path::mkpath($ans); }; # dies if it can't
1614             if ($@) {
1615                 $CPAN::Frontend->mywarn("Couldn't create directory $ans.\n".
1616                                         "Please retry.\n");
1617                 next PROMPT;
1618             }
1619             if (-d $ans && -w _) {
1620                 last PROMPT;
1621             } else {
1622                 $CPAN::Frontend->mywarn("Couldn't find directory $ans\n".
1623                                         "or directory is not writable. Please retry.\n");
1624                 if (++$loop > 5) {
1625                     $CPAN::Frontend->mydie("Giving up");
1626                 }
1627             }
1628         }
1629         $CPAN::Config->{cpan_home} = $ans;
1630     }
1631 }
1632
1633 sub my_dflt_prompt {
1634     my ($item, $dflt, $m, $no_strip) = @_;
1635     my $default = $CPAN::Config->{$item} || $dflt;
1636
1637     if (!$auto_config && (!$m || $item =~ /$m/)) {
1638         if (my $intro = $prompts{$item . "_intro"}) {
1639             $CPAN::Frontend->myprint($intro);
1640         }
1641         $CPAN::Frontend->myprint(" <$item>\n");
1642         $CPAN::Config->{$item} =
1643           $no_strip ? prompt_no_strip($prompts{$item}, $default)
1644                     : prompt(         $prompts{$item}, $default);
1645     } else {
1646         $CPAN::Config->{$item} = $default;
1647     }
1648     return $CPAN::Config->{$item};
1649 }
1650
1651 sub my_yn_prompt {
1652     my ($item, $dflt, $m) = @_;
1653     my $default;
1654     defined($default = $CPAN::Config->{$item}) or $default = $dflt;
1655
1656     # $DB::single = 1;
1657     if (!$auto_config && (!$m || $item =~ /$m/)) {
1658         if (my $intro = $prompts{$item . "_intro"}) {
1659             $CPAN::Frontend->myprint($intro);
1660         }
1661         $CPAN::Frontend->myprint(" <$item>\n");
1662         my $ans = prompt($prompts{$item}, $default ? 'yes' : 'no');
1663         $CPAN::Config->{$item} = ($ans =~ /^[y1]/i ? 1 : 0);
1664     } else {
1665         $CPAN::Config->{$item} = $default;
1666     }
1667 }
1668
1669 sub my_prompt_loop {
1670     my ($item, $dflt, $m, $ok) = @_;
1671     my $default = $CPAN::Config->{$item} || $dflt;
1672     my $ans;
1673
1674     if (!$auto_config && (!$m || $item =~ /$m/)) {
1675         $CPAN::Frontend->myprint($prompts{$item . "_intro"});
1676         $CPAN::Frontend->myprint(" <$item>\n");
1677         do { $ans = prompt($prompts{$item}, $default);
1678         } until $ans =~ /$ok/;
1679         $CPAN::Config->{$item} = $ans;
1680     } else {
1681         $CPAN::Config->{$item} = $default;
1682     }
1683 }
1684
1685
1686 # Here's the logic about the MIRRORED.BY file.  There are a number of scenarios:
1687 # (1) We have a cached MIRRORED.BY file
1688 #   (1a) We're auto-picking
1689 #       - Refresh it automatically if it's old
1690 #   (1b) Otherwise, ask if using cached is ok.  If old, default to no.
1691 #       - If cached is not ok, get it from the Internet. If it succeeds we use
1692 #         the new file.  Otherwise, we use the old file.
1693 # (2) We don't have a copy at all
1694 #   (2a) If we are allowed to connect, we try to get a new copy.  If it succeeds,
1695 #        we use it, otherwise, we warn about failure
1696 #   (2b) If we aren't allowed to connect, 
1697
1698 sub conf_sites {
1699     my %args = @_;
1700     # auto pick implies using the internet
1701     $CPAN::Config->{connect_to_internet_ok} = 1 if $args{auto_pick};
1702
1703     my $m = 'MIRRORED.BY';
1704     my $mby = File::Spec->catfile($CPAN::Config->{keep_source_where},$m);
1705     File::Path::mkpath(File::Basename::dirname($mby));
1706     # Why are we using MIRRORED.BY from the current directory?
1707     # Is this for testing? -- dagolden, 2009-11-05
1708     if (-f $mby && -f $m && -M $m < -M $mby) {
1709         require File::Copy;
1710         File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
1711     }
1712     local $^T = time;
1713     # if we have a cached copy is not older than 60 days, we either
1714     # use it or refresh it or fall back to it if the refresh failed.
1715     if ($mby && -f $mby && -s _ > 0 ) {
1716       my $very_old = (-M $mby > 60);
1717       my $mtime = localtime((stat _)[9]);
1718       # if auto_pick, refresh anything old automatically
1719       if ( $args{auto_pick} ) {
1720         if ( $very_old ) {
1721           $CPAN::Frontend->myprint(qq{Trying to refresh your mirror list\n});
1722           eval { CPAN::FTP->localize($m,$mby,3,1) }
1723             or $CPAN::Frontend->myprint(qq{Refresh failed.  Using the old cached copy instead.\n});
1724           $CPAN::Frontend->myprint("\n");
1725         }
1726       }
1727       else {
1728         my $prompt = qq{Found a cached mirror list as of $mtime
1729
1730 If you'd like to just use the cached copy, answer 'yes', below.
1731 If you'd like an updated copy of the mirror list, answer 'no' and
1732 I'll get a fresh one from the Internet.
1733
1734 Shall I use the cached mirror list?};
1735         my $ans = prompt($prompt, $very_old ? "no" : "yes");
1736         if ($ans =~ /^n/i) {
1737           $CPAN::Frontend->myprint(qq{Trying to refresh your mirror list\n});
1738           # you asked for it from the Internet
1739           $CPAN::Config->{connect_to_internet_ok} = 1;
1740           eval { CPAN::FTP->localize($m,$mby,3,1) }
1741             or $CPAN::Frontend->myprint(qq{Refresh failed.  Using the old cached copy instead.\n});
1742           $CPAN::Frontend->myprint("\n");
1743         }
1744       }
1745     }
1746     # else there is no cached copy and we must fetch or fail
1747     else {
1748       # If they haven't agree to connect to the internet, ask again
1749       if ( ! $CPAN::Config->{connect_to_internet_ok} ) {
1750         my $prompt = q{You are missing a copy of the CPAN mirror list.
1751
1752 May I connect to the Internet to get it?};
1753         my $ans = prompt($prompt, "yes");
1754         if ($ans =~ /^y/i) {
1755           $CPAN::Config->{connect_to_internet_ok} = 1;
1756         }
1757       }
1758
1759       # Now get it from the Internet or complain
1760       if ( $CPAN::Config->{connect_to_internet_ok} ) {
1761         $CPAN::Frontend->myprint(qq{Trying to fetch a mirror list from the Internet\n});
1762         eval { CPAN::FTP->localize($m,$mby,3,1) }
1763           or $CPAN::Frontend->mywarn(<<'HERE');
1764 We failed to get a copy of the mirror list from the Internet.
1765 You will need to provide CPAN mirror URLs yourself.
1766 HERE
1767         $CPAN::Frontend->myprint("\n");
1768       }
1769       else {
1770         $CPAN::Frontend->mywarn(<<'HERE');
1771 You will need to provide CPAN mirror URLs yourself or set 
1772 'o conf connect_to_internet_ok 1' and try again.
1773 HERE
1774       }
1775     }
1776
1777     # if we finally have a good local MIRRORED.BY, get on with picking
1778     if (-f $mby && -s _ > 0){
1779         $CPAN::Config->{urllist} =
1780           $args{auto_pick} ? auto_mirrored_by($mby) : choose_mirrored_by($mby);
1781         return 1;
1782     }
1783
1784     return;
1785 }
1786
1787 sub find_exe {
1788     my($exe,$path) = @_;
1789     $path ||= [split /$Config{'path_sep'}/, $ENV{'PATH'}];
1790     my($dir);
1791     #warn "in find_exe exe[$exe] path[@$path]";
1792     for $dir (@$path) {
1793         my $abs = File::Spec->catfile($dir,$exe);
1794         if (($abs = MM->maybe_command($abs))) {
1795             return $abs;
1796         }
1797     }
1798 }
1799
1800 sub picklist {
1801     my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_;
1802     CPAN->debug("picklist('$items','$prompt','$default','$require_nonempty',".
1803                 "'$empty_warning')") if $CPAN::DEBUG;
1804     $default ||= '';
1805
1806     my $pos = 0;
1807
1808     my @nums;
1809   SELECTION: while (1) {
1810
1811         # display, at most, 15 items at a time
1812         my $limit = $#{ $items } - $pos;
1813         $limit = 15 if $limit > 15;
1814
1815         # show the next $limit items, get the new position
1816         $pos = display_some($items, $limit, $pos, $default);
1817         $pos = 0 if $pos >= @$items;
1818
1819         my $num = prompt($prompt,$default);
1820
1821         @nums = split (' ', $num);
1822         {
1823             my %seen;
1824             @nums = grep { !$seen{$_}++ } @nums;
1825         }
1826         my $i = scalar @$items;
1827         unrangify(\@nums);
1828         if (0 == @nums) {
1829             # cannot allow nothing because nothing means paging!
1830             # return;
1831         } elsif (grep (/\D/ || $_ < 1 || $_ > $i, @nums)) {
1832             $CPAN::Frontend->mywarn("invalid items entered, try again\n");
1833             if ("@nums" =~ /\D/) {
1834                 $CPAN::Frontend->mywarn("(we are expecting only numbers between 1 and $i)\n");
1835             }
1836             next SELECTION;
1837         }
1838         if ($require_nonempty && !@nums) {
1839             $CPAN::Frontend->mywarn("$empty_warning\n");
1840         }
1841
1842         # a blank line continues...
1843         unless (@nums){
1844             $CPAN::Frontend->mysleep(0.1); # prevent hot spinning process on the next bug
1845             next SELECTION;
1846         }
1847         last;
1848     }
1849     for (@nums) { $_-- }
1850     @{$items}[@nums];
1851 }
1852
1853 sub unrangify ($) {
1854     my($nums) = $_[0];
1855     my @nums2 = ();
1856     while (@{$nums||[]}) {
1857         my $n = shift @$nums;
1858         if ($n =~ /^(\d+)-(\d+)$/) {
1859             my @range = $1 .. $2;
1860             # warn "range[@range]";
1861             push @nums2, @range;
1862         } else {
1863             push @nums2, $n;
1864         }
1865     }
1866     push @$nums, @nums2;
1867 }
1868
1869 sub display_some {
1870     my ($items, $limit, $pos, $default) = @_;
1871     $pos ||= 0;
1872
1873     my @displayable = @$items[$pos .. ($pos + $limit)];
1874     for my $item (@displayable) {
1875         $CPAN::Frontend->myprint(sprintf "(%d) %s\n", ++$pos, $item);
1876     }
1877     my $hit_what = $default ? "SPACE ENTER" : "ENTER";
1878     $CPAN::Frontend->myprint(sprintf("%d more items, hit %s to show them\n",
1879                                      (@$items - $pos),
1880                                      $hit_what,
1881                                     ))
1882         if $pos < @$items;
1883     return $pos;
1884 }
1885
1886 sub auto_mirrored_by {
1887     my $local = shift or return;
1888     local $|=1;
1889     $CPAN::Frontend->myprint("Looking for CPAN mirrors near you (please be patient)\n");
1890     my $mirrors = CPAN::Mirrors->new($local);
1891     my $cnt = 0;
1892     my @best = $mirrors->best_mirrors(
1893       how_many => 3,
1894       callback => sub {
1895           $CPAN::Frontend->myprint(".");
1896           if ($cnt++>60) { $cnt=0; $CPAN::Frontend->myprint("\n"); }
1897       },
1898     );
1899     my $urllist = [ map { $_->http } @best ];
1900     push @$urllist, grep { /^file:/ } @{$CPAN::Config->{urllist}};
1901     $CPAN::Frontend->myprint(" done!\n\n");
1902     return $urllist
1903 }
1904
1905 sub choose_mirrored_by {
1906     my $local = shift or return;
1907     my ($default);
1908     my $mirrors = CPAN::Mirrors->new($local);
1909     my @previous_urls = @{$CPAN::Config->{urllist}};
1910
1911     $CPAN::Frontend->myprint($prompts{urls_picker_intro});
1912
1913     my (@cont, $cont, %cont, @countries, @urls, %seen);
1914     my $no_previous_warn =
1915         "Sorry! since you don't have any existing picks, you must make a\n" .
1916             "geographic selection.";
1917     my $offer_cont = [sort $mirrors->continents];
1918     if (@previous_urls) {
1919         push @$offer_cont, "(edit previous picks)";
1920         $default = @$offer_cont;
1921     } else {
1922         # cannot allow nothing because nothing means paging!
1923         # push @$offer_cont, "(none of the above)";
1924     }
1925     @cont = picklist($offer_cont,
1926                      "Select your continent (or several nearby continents)",
1927                      $default,
1928                      ! @previous_urls,
1929                      $no_previous_warn);
1930     # cannot allow nothing because nothing means paging!
1931     # return unless @cont;
1932
1933     foreach $cont (@cont) {
1934         my @c = sort $mirrors->countries($cont);
1935         @cont{@c} = map ($cont, 0..$#c);
1936         @c = map ("$_ ($cont)", @c) if @cont > 1;
1937         push (@countries, @c);
1938     }
1939     if (@previous_urls && @countries) {
1940         push @countries, "(edit previous picks)";
1941         $default = @countries;
1942     }
1943
1944     if (@countries) {
1945         @countries = picklist (\@countries,
1946                                "Select your country (or several nearby countries)",
1947                                $default,
1948                                ! @previous_urls,
1949                                $no_previous_warn);
1950         %seen = map (($_ => 1), @previous_urls);
1951         # hmmm, should take list of defaults from CPAN::Config->{'urllist'}...
1952         foreach my $country (@countries) {
1953             next if $country =~ /edit previous picks/;
1954             (my $bare_country = $country) =~ s/ \(.*\)//;
1955             my @u;
1956             for my $m ( $mirrors->mirrors($bare_country) ) {
1957               push @u, $m->ftp if $m->ftp;
1958               push @u, $m->http if $m->http;
1959             }
1960             @u = grep (! $seen{$_}, @u);
1961             @u = map ("$_ ($bare_country)", @u)
1962                 if @countries > 1;
1963             push (@urls, sort @u);
1964         }
1965     }
1966     push (@urls, map ("$_ (previous pick)", @previous_urls));
1967     my $prompt = "Select as many URLs as you like (by number),
1968 put them on one line, separated by blanks, hyphenated ranges allowed
1969  e.g. '1 4 5' or '7 1-4 8'";
1970     if (@previous_urls) {
1971         $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) ..
1972                          (scalar @urls));
1973         $prompt .= "\n(or just hit ENTER to keep your previous picks)";
1974     }
1975
1976     @urls = picklist (\@urls, $prompt, $default);
1977     foreach (@urls) { s/ \(.*\)//; }
1978     return [ @urls ];
1979 }
1980
1981 sub bring_your_own {
1982     my $urllist = [ @{$CPAN::Config->{urllist}} ];
1983     my %seen = map (($_ => 1), @$urllist);
1984     my($ans,@urls);
1985     my $eacnt = 0; # empty answers
1986     $CPAN::Frontend->myprint(<<'HERE');
1987
1988 Now you can enter your own CPAN URLs by hand. A local CPAN mirror can be
1989 listed using a 'file:' URL like 'file:///path/to/cpan/'
1990
1991 HERE
1992     do {
1993         my $prompt = "Enter another URL or ENTER to quit:";
1994         unless (%seen) {
1995             $prompt = qq{CPAN.pm needs at least one URL where it can fetch CPAN files from.
1996
1997 Please enter your CPAN site:};
1998         }
1999         $ans = prompt ($prompt, "");
2000
2001         if ($ans) {
2002             $ans =~ s|/?\z|/|; # has to end with one slash
2003             # XXX This manipulation is odd.  Shouldn't we check that $ans is
2004             # a directory before converting to file:///?  And we need /// below,
2005             # too, don't we?  -- dagolden, 2009-11-05
2006             $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
2007             if ($ans =~ /^\w+:\/./) {
2008                 push @urls, $ans unless $seen{$ans}++;
2009             } else {
2010                 $CPAN::Frontend->
2011                     myprint(sprintf(qq{"%s" doesn\'t look like an URL at first sight.
2012 I\'ll ignore it for now.
2013 You can add it to your %s
2014 later if you\'re sure it\'s right.\n},
2015                                    $ans,
2016                                    $INC{'CPAN/MyConfig.pm'}
2017                                    || $INC{'CPAN/Config.pm'}
2018                                    || "configuration file",
2019                                   ));
2020             }
2021         } else {
2022             if (++$eacnt >= 5) {
2023                 $CPAN::Frontend->
2024                     mywarn("Giving up.\n");
2025                 $CPAN::Frontend->mysleep(5);
2026                 return;
2027             }
2028         }
2029     } while $ans || !%seen;
2030
2031     @$urllist = CPAN::_uniq(@$urllist, @urls);
2032     $CPAN::Config->{urllist} = $urllist;
2033 }
2034
2035 sub _print_urllist {
2036     my ($which) = @_;
2037     $CPAN::Frontend->myprint("$which urllist\n");
2038     for ( @{$CPAN::Config->{urllist} || []} ) { 
2039       $CPAN::Frontend->myprint("  $_\n") 
2040     };
2041     $CPAN::Frontend->myprint("\n");
2042 }
2043
2044 sub _can_write_to_libdirs {
2045     return -w $Config{installprivlib}
2046         && -w $Config{installarchlib}
2047         && -w $Config{installsitelib}
2048         && -w $Config{installsitearch}
2049 }
2050
2051 sub _using_installbase {
2052     return 1 if $ENV{PERL_MM_OPT} && $ENV{PERL_MM_OPT} =~ /install_base/i;
2053     return 1 if grep { ($CPAN::Config->{$_}||q{}) =~ /install_base/i }
2054         qw(makepl_arg make_install_arg mbuildpl_arg mbuild_install_arg);
2055     return;
2056 }
2057
2058 sub _using_sudo {
2059     return 1 if grep { ($CPAN::Config->{$_}||q{}) =~ /sudo/ }
2060         qw(make_install_make_command mbuild_install_build_command);
2061     return;
2062 }
2063
2064 sub _strip_spaces {
2065     $_[0] =~ s/^\s+//;  # no leading spaces
2066     $_[0] =~ s/\s+\z//; # no trailing spaces
2067 }
2068
2069 sub prompt ($;$) {
2070     unless (defined &_real_prompt) {
2071         *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt;
2072     }
2073     my $ans = _real_prompt(@_);
2074
2075     _strip_spaces($ans);
2076     $CPAN::Frontend->myprint("\n");
2077
2078     return $ans;
2079 }
2080
2081
2082 sub prompt_no_strip ($;$) {
2083     unless (defined &_real_prompt) {
2084         *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt;
2085     }
2086     return _real_prompt(@_);
2087 }
2088
2089
2090
2091 1;