This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Updated CPAN.pm to CPAN version 1.94_64
[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.5302";
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_sqlite
542
543 CPAN::SQLite is a layer between the index files that are downloaded
544 from the CPAN and CPAN.pm that speeds up metadata queries and reduces
545 memory consumption of CPAN.pm considerably.
546
547 Use CPAN::SQLite if available? (yes/no)?
548
549 =item version_timeout
550
551 This timeout prevents CPAN from hanging when trying to parse a
552 pathologically coded $VERSION from a module.
553
554 The default is 15 seconds.  If you set this value to 0, no timeout
555 will occur, but this is not recommended.
556
557 Timeout for parsing module versions?
558
559 =item yaml_load_code
560
561 Both YAML.pm and YAML::Syck are capable of deserialising code. As this
562 requires a string eval, which might be a security risk, you can use
563 this option to enable or disable the deserialisation of code via
564 CPAN::DeferredCode. (Note: This does not work under perl 5.6)
565
566 Do you want to enable code deserialisation (yes/no)?
567
568 =item yaml_module
569
570 At the time of this writing (2009-03) there are three YAML
571 implementations working: YAML, YAML::Syck, and YAML::XS. The latter
572 two are faster but need a C compiler installed on your system. There
573 may be more alternative YAML conforming modules. When I tried two
574 other players, YAML::Tiny and YAML::Perl, they seemed not powerful
575 enough to work with CPAN.pm. This may have changed in the meantime.
576
577 Which YAML implementation would you prefer?
578
579 =back
580
581 =head1 LICENSE
582
583 This program is free software; you can redistribute it and/or
584 modify it under the same terms as Perl itself.
585
586 =cut
587
588 use vars qw( %prompts );
589
590 {
591
592     my @prompts = (
593
594 auto_config => qq{
595 CPAN.pm requires configuration, but most of it can be done automatically.
596 If you answer 'no' below, you will enter an interactive dialog for each
597 configuration option instead.
598
599 Would you like to configure as much as possible automatically?},
600
601 auto_pick => qq{
602 Would you like me to automatically choose some CPAN mirror
603 sites for you? (This means connecting to the Internet)},
604
605 config_intro => qq{
606
607 The following questions are intended to help you with the
608 configuration. The CPAN module needs a directory of its own to cache
609 important index files and maybe keep a temporary mirror of CPAN files.
610 This may be a site-wide or a personal directory.
611
612 },
613
614 # cpan_home => qq{ },
615
616 cpan_home_where => qq{
617
618 First of all, I'd like to create this directory. Where?
619
620 },
621
622 external_progs => qq{
623
624 The CPAN module will need a few external programs to work properly.
625 Please correct me, if I guess the wrong path for a program. Don't
626 panic if you do not have some of them, just press ENTER for those. To
627 disable the use of a program, you can type a space followed by ENTER.
628
629 },
630
631 proxy_intro => qq{
632
633 If you're accessing the net via proxies, you can specify them in the
634 CPAN configuration or via environment variables. The variable in
635 the \$CPAN::Config takes precedence.
636
637 },
638
639 proxy_user => qq{
640
641 If your proxy is an authenticating proxy, you can store your username
642 permanently. If you do not want that, just press ENTER. You will then
643 be asked for your username in every future session.
644
645 },
646
647 proxy_pass => qq{
648
649 Your password for the authenticating proxy can also be stored
650 permanently on disk. If this violates your security policy, just press
651 ENTER. You will then be asked for the password in every future
652 session.
653
654 },
655
656 urls_intro => qq{
657 Now you need to choose your CPAN mirror sites.  You can let me
658 pick mirrors for you, you can select them from a list or you
659 can enter them by hand.
660 },
661
662 urls_picker_intro => qq{First, pick a nearby continent and country by typing in the number(s)
663 in front of the item(s) you want to select. You can pick several of
664 each, separated by spaces. Then, you will be presented with a list of
665 URLs of CPAN mirrors in the countries you selected, along with
666 previously selected URLs. Select some of those URLs, or just keep the
667 old list. Finally, you will be prompted for any extra URLs -- file:,
668 ftp:, or http: -- that host a CPAN mirror.
669
670 You should select more than one (just in case the first isn't available).
671
672 },
673
674 password_warn => qq{
675
676 Warning: Term::ReadKey seems not to be available, your password will
677 be echoed to the terminal!
678
679 },
680
681 install_help => qq{
682 Warning: You do not have write permission for Perl library directories.
683
684 To install modules, you need to configure a local Perl library directory or
685 escalate your privileges.  CPAN can help you by bootstrapping the local::lib
686 module or by configuring itself to use 'sudo' (if available).  You may also
687 resolve this problem manually if you need to customize your setup.
688
689 What approach do you want?  (Choose 'local::lib', 'sudo' or 'manual')
690 },
691
692 local_lib_installed => qq{
693 local::lib is installed. You must now add the following environment variables
694 to your shell configuration files (or registry, if you are on Windows) and
695 then restart your command line shell and CPAN before installing modules:
696
697 },
698
699               );
700
701     die "Coding error in \@prompts declaration.  Odd number of elements, above"
702         if (@prompts % 2);
703
704     %prompts = @prompts;
705
706     if (scalar(keys %prompts) != scalar(@prompts)/2) {
707         my %already;
708         for my $item (0..$#prompts) {
709             next if $item % 2;
710             die "$prompts[$item] is duplicated\n" if $already{$prompts[$item]}++;
711         }
712     }
713
714     shift @podpara;
715     while (@podpara) {
716         warn "Alert: cannot parse my own manpage for init dialog" unless $podpara[0] =~ s/^=item\s+//;
717         my $name = shift @podpara;
718         my @para;
719         while (@podpara && $podpara[0] !~ /^=item/) {
720             push @para, shift @podpara;
721         }
722         $prompts{$name} = pop @para;
723         if (@para) {
724             $prompts{$name . "_intro"} = join "", map { "$_\n\n" } @para;
725         }
726     }
727
728 }
729
730 sub init {
731     my($configpm, %args) = @_;
732     use Config;
733     # extra args after 'o conf init'
734     my $matcher = $args{args} && @{$args{args}} ? $args{args}[0] : '';
735     if ($matcher =~ /^\/(.*)\/$/) {
736         # case /regex/ => take the first, ignore the rest
737         $matcher = $1;
738         shift @{$args{args}};
739         if (@{$args{args}}) {
740             local $" = " ";
741             $CPAN::Frontend->mywarn("Ignoring excessive arguments '@{$args{args}}'");
742             $CPAN::Frontend->mysleep(2);
743         }
744     } elsif (0 == length $matcher) {
745     } elsif (0 && $matcher eq "~") { # extremely buggy, but a nice idea
746         my @unconfigured = grep { not exists $CPAN::Config->{$_}
747                                       or not defined $CPAN::Config->{$_}
748                                           or not length $CPAN::Config->{$_}
749                                   } keys %$CPAN::Config;
750         $matcher = "\\b(".join("|", @unconfigured).")\\b";
751         $CPAN::Frontend->mywarn("matcher[$matcher]");
752     } else {
753         # case WORD... => all arguments must be valid
754         for my $arg (@{$args{args}}) {
755             unless (exists $CPAN::HandleConfig::keys{$arg}) {
756                 $CPAN::Frontend->mywarn("'$arg' is not a valid configuration variable\n");
757                 return;
758             }
759         }
760         $matcher = "\\b(".join("|",@{$args{args}}).")\\b";
761     }
762     CPAN->debug("matcher[$matcher]") if $CPAN::DEBUG;
763
764     unless ($CPAN::VERSION) {
765         require CPAN::Nox;
766     }
767     require CPAN::HandleConfig;
768     CPAN::HandleConfig::require_myconfig_or_config();
769     $CPAN::Config ||= {};
770     local($/) = "\n";
771     local($\) = "";
772     local($|) = 1;
773
774     my($ans,$default); # why so half global?
775
776     #
777     #= Files, directories
778     #
779
780     local *_real_prompt;
781     if ( $args{autoconfig} ) {
782         $auto_config = 1;
783     } elsif ($matcher) {
784             $auto_config = 0;
785         } else {
786         my $_conf = prompt($prompts{auto_config}, "yes");
787         $auto_config = ($_conf and $_conf =~ /^y/i) ? 1 : 0;
788     }
789     CPAN->debug("auto_config[$auto_config]") if $CPAN::DEBUG;
790     if ( $auto_config ) {
791             local $^W = 0;
792             # prototype should match that of &MakeMaker::prompt
793             my $current_second = time;
794             my $current_second_count = 0;
795             my $i_am_mad = 0;
796             # silent prompting -- just quietly use default
797             *_real_prompt = sub { return $_[1] };
798         }
799
800     #
801     # bootstrap local::lib or sudo
802     #
803     unless ( $matcher
804         || _can_write_to_libdirs() || _using_installbase() || _using_sudo()
805     ) {
806         local $auto_config = 0; # We *must* ask, even under autoconfig
807         local *_real_prompt;    # We *must* show prompt
808         my_prompt_loop(install_help => 'local::lib', $matcher,
809                    'local::lib|sudo|manual');
810     }
811     $CPAN::Config->{install_help} ||= ''; # Temporary to suppress warnings
812
813     if (!$matcher or q{
814                        build_dir
815                        build_dir_reuse
816                        cpan_home
817                        keep_source_where
818                        prefs_dir
819                       } =~ /$matcher/) {
820         $CPAN::Frontend->myprint($prompts{config_intro}) unless $auto_config;
821
822         init_cpan_home($matcher);
823
824         my_dflt_prompt("keep_source_where",
825                        File::Spec->catdir($CPAN::Config->{cpan_home},"sources"),
826                        $matcher,
827                       );
828         my_dflt_prompt("build_dir",
829                        File::Spec->catdir($CPAN::Config->{cpan_home},"build"),
830                        $matcher
831                       );
832         my_yn_prompt(build_dir_reuse => 0, $matcher);
833         my_dflt_prompt("prefs_dir",
834                        File::Spec->catdir($CPAN::Config->{cpan_home},"prefs"),
835                        $matcher
836                       );
837     }
838
839     #
840     #= Config: auto_commit
841     #
842
843     my_yn_prompt(auto_commit => 0, $matcher);
844
845     #
846     #= Cache size, Index expire
847     #
848     my_dflt_prompt(build_cache => 100, $matcher);
849
850     my_dflt_prompt(index_expire => 1, $matcher);
851     my_prompt_loop(scan_cache => 'atstart', $matcher, 'atstart|atexit|never');
852
853     #
854     #= cache_metadata
855     #
856
857     my_yn_prompt(cache_metadata => 1, $matcher);
858     my_yn_prompt(use_sqlite => 0, $matcher);
859
860     #
861     #= Do we follow PREREQ_PM?
862     #
863
864     my_prompt_loop(prerequisites_policy => 'follow', $matcher,
865                    'follow|ask|ignore');
866     my_prompt_loop(build_requires_install_policy => 'yes', $matcher,
867                    'yes|no|ask/yes|ask/no');
868
869     #
870     #= Module::Signature
871     #
872     my_yn_prompt(check_sigs => 0, $matcher);
873
874     #
875     #= CPAN::Reporter
876     #
877     if (!$matcher or 'test_report' =~ /$matcher/) {
878         my_yn_prompt(test_report => 0, $matcher);
879         if (
880             $matcher &&
881             $CPAN::Config->{test_report} &&
882             $CPAN::META->has_inst("CPAN::Reporter") &&
883             CPAN::Reporter->can('configure')
884            ) {
885             my $_conf = prompt("Would you like me configure CPAN::Reporter now?", "yes");
886             if ($_conf =~ /^y/i) {
887               $CPAN::Frontend->myprint("\nProceeding to configure CPAN::Reporter.\n");
888               CPAN::Reporter::configure();
889               $CPAN::Frontend->myprint("\nReturning to CPAN configuration.\n");
890             }
891         }
892     }
893
894     my_yn_prompt(trust_test_report_history => 0, $matcher);
895
896     #
897     #= YAML vs. YAML::Syck
898     #
899     if (!$matcher or "yaml_module" =~ /$matcher/) {
900         my_dflt_prompt(yaml_module => "YAML", $matcher);
901         my $old_v = $CPAN::Config->{load_module_verbosity};
902         $CPAN::Config->{load_module_verbosity} = q[none];
903         if (!$auto_config && !$CPAN::META->has_inst($CPAN::Config->{yaml_module})) {
904             $CPAN::Frontend->mywarn
905                 ("Warning (maybe harmless): '$CPAN::Config->{yaml_module}' not installed.\n");
906             $CPAN::Frontend->mysleep(3);
907         }
908         $CPAN::Config->{load_module_verbosity} = $old_v;
909     }
910
911     #
912     #= YAML code deserialisation
913     #
914     my_yn_prompt(yaml_load_code => 0, $matcher);
915
916     #
917     #= External programs
918     #
919     my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'};
920     $CPAN::Frontend->myprint($prompts{external_progs})
921         if !$matcher && !$auto_config;
922     _init_external_progs($matcher, {
923         path => \@path,
924         progs => [ qw/make bzip2 gzip tar unzip gpg patch applypatch/ ],
925         shortcut => 0
926       });
927     _init_external_progs($matcher, {
928         path => \@path,
929         progs => [ qw/wget curl lynx ncftpget ncftp ftp/ ],
930         shortcut => 1
931       });
932
933     {
934         my $path = $CPAN::Config->{'pager'} ||
935             $ENV{PAGER} || find_exe("less",\@path) ||
936                 find_exe("more",\@path) || ($^O eq 'MacOS' ? $ENV{EDITOR} : 0 )
937                     || "more";
938         my_dflt_prompt(pager => $path, $matcher);
939     }
940
941     {
942         my $path = $CPAN::Config->{'shell'};
943         if ($path && File::Spec->file_name_is_absolute($path)) {
944             $CPAN::Frontend->mywarn("Warning: configured $path does not exist\n")
945                 unless -e $path;
946             $path = "";
947         }
948         $path ||= $ENV{SHELL};
949         $path ||= $ENV{COMSPEC} if $^O eq "MSWin32";
950         if ($^O eq 'MacOS') {
951             $CPAN::Config->{'shell'} = 'not_here';
952         } else {
953             $path ||= 'sh', $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only
954             my_dflt_prompt(shell => $path, $matcher);
955         }
956     }
957
958     {
959         my $tar = $CPAN::Config->{tar};
960         my $prefer_external_tar = $CPAN::Config->{prefer_external_tar}; # XXX not yet supported
961         unless (defined $prefer_external_tar) {
962             if ($^O =~ /(MSWin32|solaris)/) {
963                 # both have a record of broken tars
964                 $prefer_external_tar = 0;
965             } elsif ($tar) {
966                 $prefer_external_tar = 1;
967             } else {
968                 $prefer_external_tar = 0;
969             }
970         }
971         my_yn_prompt(prefer_external_tar => $prefer_external_tar, $matcher);
972     }
973
974     #
975     # verbosity
976     #
977
978     my_prompt_loop(tar_verbosity => 'none', $matcher,
979                    'none|v|vv');
980     my_prompt_loop(load_module_verbosity => 'none', $matcher,
981                    'none|v');
982     my_prompt_loop(perl5lib_verbosity => 'none', $matcher,
983                    'none|v');
984     my_yn_prompt(inhibit_startup_message => 0, $matcher);
985
986     #
987     #= Installer, arguments to make etc.
988     #
989
990     my_prompt_loop(prefer_installer => 'MB', $matcher, 'MB|EUMM|RAND');
991
992     if (!$matcher or 'makepl_arg make_arg' =~ /$matcher/) {
993         my_dflt_prompt(makepl_arg => "", $matcher);
994         my_dflt_prompt(make_arg => "", $matcher);
995         if ( $CPAN::Config->{makepl_arg} =~ /LIBS=|INC=/ ) {
996             $CPAN::Frontend->mywarn( 
997                 "Warning: Using LIBS or INC in makepl_arg will likely break distributions\n" . 
998                 "that specify their own LIBS or INC options in Makefile.PL.\n"
999             );
1000         }
1001
1002     }
1003
1004     require CPAN::HandleConfig;
1005     if (exists $CPAN::HandleConfig::keys{make_install_make_command}) {
1006         # as long as Windows needs $self->_build_command, we cannot
1007         # support sudo on windows :-)
1008         my $default = $CPAN::Config->{make} || "";
1009         if ( $default && $CPAN::Config->{install_help} eq 'sudo' ) {
1010             if ( find_exe('sudo') ) {
1011                 $default = "sudo $default";
1012                 delete $CPAN::Config->{make_install_make_command}
1013                     unless $CPAN::Config->{make_install_make_command} =~ /sudo/;
1014             }
1015             else {
1016                 $CPAN::Frontend->mywarnonce("Could not find 'sudo' in PATH\n");
1017             }
1018         }
1019         my_dflt_prompt(make_install_make_command => $default, $matcher);
1020     }
1021
1022     my_dflt_prompt(make_install_arg => $CPAN::Config->{make_arg} || "",
1023                    $matcher);
1024
1025     my_dflt_prompt(mbuildpl_arg => "", $matcher);
1026     my_dflt_prompt(mbuild_arg => "", $matcher);
1027
1028     if (exists $CPAN::HandleConfig::keys{mbuild_install_build_command}
1029         and $^O ne "MSWin32") {
1030         # as long as Windows needs $self->_build_command, we cannot
1031         # support sudo on windows :-)
1032         my $default = "./Build";
1033         if ( $CPAN::Config->{install_help} eq 'sudo' ) {
1034             if ( find_exe('sudo') ) {
1035                 $default = "sudo $default";
1036                 delete $CPAN::Config->{mbuild_install_build_command}
1037                     unless $CPAN::Config->{mbuild_install_build_command} =~ /sudo/;
1038             }
1039             else {
1040                 $CPAN::Frontend->mywarnonce("Could not find 'sudo' in PATH\n");
1041             }
1042         }
1043         my_dflt_prompt(mbuild_install_build_command => $default, $matcher);
1044     }
1045
1046     my_dflt_prompt(mbuild_install_arg => "", $matcher);
1047
1048     #
1049     #= Alarm period
1050     #
1051
1052     my_dflt_prompt(inactivity_timeout => 0, $matcher);
1053     my_dflt_prompt(version_timeout => 15, $matcher);
1054
1055     #
1056     #== halt_on_failure
1057     #
1058     my_yn_prompt(halt_on_failure => 0, $matcher);
1059
1060     #
1061     #= Proxies
1062     #
1063
1064     my @proxy_vars = qw/ftp_proxy http_proxy no_proxy/;
1065     my @proxy_user_vars = qw/proxy_user proxy_pass/;
1066     if (!$matcher or "@proxy_vars @proxy_user_vars" =~ /$matcher/) {
1067         $CPAN::Frontend->myprint($prompts{proxy_intro}) unless $auto_config;
1068
1069         for (@proxy_vars) {
1070             $prompts{$_} = "Your $_?";
1071             my_dflt_prompt($_ => $ENV{$_}||"", $matcher);
1072         }
1073
1074         if ($CPAN::Config->{ftp_proxy} ||
1075             $CPAN::Config->{http_proxy}) {
1076
1077             $default = $CPAN::Config->{proxy_user} || $CPAN::LWP::UserAgent::USER || "";
1078
1079             $CPAN::Frontend->myprint($prompts{proxy_user}) unless $auto_config;
1080
1081             if ($CPAN::Config->{proxy_user} = prompt("Your proxy user id?",$default)) {
1082                 $CPAN::Frontend->myprint($prompts{proxy_pass}) unless $auto_config;
1083
1084                 if ($CPAN::META->has_inst("Term::ReadKey")) {
1085                     Term::ReadKey::ReadMode("noecho");
1086                 } else {
1087                     $CPAN::Frontend->myprint($prompts{password_warn}) unless $auto_config;
1088                 }
1089                 $CPAN::Config->{proxy_pass} = prompt_no_strip("Your proxy password?");
1090                 if ($CPAN::META->has_inst("Term::ReadKey")) {
1091                     Term::ReadKey::ReadMode("restore");
1092                 }
1093                 $CPAN::Frontend->myprint("\n\n") unless $auto_config;
1094             }
1095         }
1096     }
1097
1098     #
1099     #= how FTP works
1100     #
1101
1102     my_yn_prompt(ftp_passive => 1, $matcher);
1103
1104     #
1105     #= how cwd works
1106     #
1107
1108     my_prompt_loop(getcwd => 'cwd', $matcher,
1109                    'cwd|getcwd|fastcwd|backtickcwd');
1110
1111     #
1112     #= the CPAN shell itself (prompt, color)
1113     #
1114
1115     my_yn_prompt(commandnumber_in_prompt => 1, $matcher);
1116     my_yn_prompt(term_ornaments => 1, $matcher);
1117     if ("colorize_output colorize_print colorize_warn colorize_debug" =~ $matcher) {
1118         my_yn_prompt(colorize_output => 0, $matcher);
1119         if ($CPAN::Config->{colorize_output}) {
1120             if ($CPAN::META->has_inst("Term::ANSIColor")) {
1121                 my $T="gYw";
1122                 $CPAN::Frontend->myprint( "                                      on_  on_y ".
1123                     "        on_ma           on_\n") unless $auto_config;
1124                 $CPAN::Frontend->myprint( "                   on_black on_red  green ellow ".
1125                     "on_blue genta on_cyan white\n") unless $auto_config;
1126
1127                 for my $FG ("", "bold",
1128                             map {$_,"bold $_"} "black","red","green",
1129                             "yellow","blue",
1130                             "magenta",
1131                             "cyan","white") {
1132                     $CPAN::Frontend->myprint(sprintf( "%12s ", $FG)) unless $auto_config;
1133                     for my $BG ("",map {"on_$_"} qw(black red green yellow
1134                                                     blue magenta cyan white)) {
1135                             $CPAN::Frontend->myprint( $FG||$BG ?
1136                             Term::ANSIColor::colored("  $T  ","$FG $BG") : "  $T  ") unless $auto_config;
1137                     }
1138                     $CPAN::Frontend->myprint( "\n" ) unless $auto_config;
1139                 }
1140                 $CPAN::Frontend->myprint( "\n" ) unless $auto_config;
1141             }
1142             for my $tuple (
1143                            ["colorize_print", "bold blue on_white"],
1144                            ["colorize_warn", "bold red on_white"],
1145                            ["colorize_debug", "black on_cyan"],
1146                           ) {
1147                 my_dflt_prompt($tuple->[0] => $tuple->[1], $matcher);
1148                 if ($CPAN::META->has_inst("Term::ANSIColor")) {
1149                     eval { Term::ANSIColor::color($CPAN::Config->{$tuple->[0]})};
1150                     if ($@) {
1151                         $CPAN::Config->{$tuple->[0]} = $tuple->[1];
1152                         $CPAN::Frontend->mywarn($@."setting to default '$tuple->[1]'\n");
1153                     }
1154                 }
1155             }
1156         }
1157     }
1158
1159     #
1160     #== term_is_latin
1161     #
1162
1163     my_yn_prompt(term_is_latin => 1, $matcher);
1164
1165     #
1166     #== save history in file 'histfile'
1167     #
1168
1169     if (!$matcher or 'histfile histsize' =~ /$matcher/) {
1170         $CPAN::Frontend->myprint($prompts{histfile_intro}) unless $auto_config;
1171         defined($default = $CPAN::Config->{histfile}) or
1172             $default = File::Spec->catfile($CPAN::Config->{cpan_home},"histfile");
1173         my_dflt_prompt(histfile => $default, $matcher);
1174
1175         if ($CPAN::Config->{histfile}) {
1176             defined($default = $CPAN::Config->{histsize}) or $default = 100;
1177             my_dflt_prompt(histsize => $default, $matcher);
1178         }
1179     }
1180
1181     #
1182     #== do an ls on the m or the d command
1183     #
1184     my_yn_prompt(show_upload_date => 0, $matcher);
1185
1186     #
1187     #== verbosity at the end of the r command
1188     #
1189     if (!$matcher
1190         or 'show_unparsable_versions' =~ /$matcher/
1191         or 'show_zero_versions' =~ /$matcher/
1192        ) {
1193         my_yn_prompt(show_unparsable_versions => 0, $matcher);
1194         my_yn_prompt(show_zero_versions => 0, $matcher);
1195     }
1196
1197     #
1198     #= MIRRORED.BY and conf_sites()
1199     #
1200
1201     # Let's assume they want to use the internet and make them turn it
1202     # off if they really don't.
1203     my_yn_prompt("connect_to_internet_ok" => 1, $matcher);
1204
1205     # Allow matching but don't show during manual config
1206     if ($matcher) {
1207         if ("randomize_urllist" =~ $matcher) {
1208             my_dflt_prompt(randomize_urllist => 0, $matcher);
1209         }
1210         if ("ftpstats_size" =~ $matcher) {
1211             my_dflt_prompt(ftpstats_size => 99, $matcher);
1212         }
1213         if ("ftpstats_period" =~ $matcher) {
1214             my_dflt_prompt(ftpstats_period => 14, $matcher);
1215         }
1216     }
1217
1218     $CPAN::Config->{urllist} ||= [];
1219
1220     if ($auto_config) {
1221         if(@{ $CPAN::Config->{urllist} }) {
1222             $CPAN::Frontend->myprint(
1223                 "Your 'urllist' is already configured. Type 'o conf init urllist' to change it.\n"
1224             );
1225         }
1226         else {
1227           $CPAN::Frontend->myprint(
1228             "Autoconfigured everything but 'urllist'.\n"
1229           );
1230             _do_pick_mirrors();
1231         }
1232     }
1233     elsif (!$matcher || "urllist" =~ $matcher) {
1234         _do_pick_mirrors();
1235     }
1236
1237     if ($auto_config) {
1238         $CPAN::Frontend->myprint(
1239             "\nAutoconfiguration complete.\n"
1240         );
1241         $auto_config = 0; # reset
1242     }
1243
1244     # bootstrap local::lib now if requested
1245     if ( $CPAN::Config->{install_help} eq 'local::lib' ) {
1246         if ( ! @{ $CPAN::Config->{urllist} } ) {
1247             $CPAN::Frontend->myprint(
1248                 "Skipping local::lib bootstrap because 'urllist' is not configured.\n"
1249             );
1250           }
1251           else {
1252             $CPAN::Frontend->myprint("\nAttempting to bootstrap local::lib...\n");
1253             $CPAN::Frontend->myprint("\nWriting $configpm for bootstrap...\n");
1254             delete $CPAN::Config->{install_help}; # temporary only
1255             CPAN::HandleConfig->commit;
1256             my $dist;
1257             if ( $dist = CPAN::Shell->expand('Module', 'local::lib')->distribution ) {
1258                 # this is a hack to force bootstrapping
1259                 $dist->{prefs}{pl}{commandline} = "$^X Makefile.PL --bootstrap";
1260                 # Set @INC for this process so we find things as they bootstrap
1261                 require lib;
1262                 lib->import(_local_lib_inc_path());
1263                 eval { $dist->install };
1264             }
1265             if ( ! $dist || (my $err = $@) ) {
1266                 $err ||= 'Could not locate local::lib in the CPAN index';
1267                 $CPAN::Frontend->mywarn("Error bootstrapping local::lib: $@\n");
1268                 $CPAN::Frontend->myprint("From the CPAN Shell, you might try 'look local::lib' and \n"
1269                     . "run 'perl Makefile --bootstrap' and see if that is successful.  Then\n"
1270                     . "restart your CPAN client\n"
1271             );
1272             }
1273             else {
1274                 _local_lib_config();
1275           }
1276         }
1277     }
1278
1279     # install_help is temporary for configuration and not saved
1280     delete $CPAN::Config->{install_help};
1281
1282     $CPAN::Frontend->myprint("\n");
1283     if ($matcher && !$CPAN::Config->{auto_commit}) {
1284         $CPAN::Frontend->myprint("Please remember to call 'o conf commit' to ".
1285                                  "make the config permanent!\n");
1286     } else {
1287         CPAN::HandleConfig->commit;
1288     }
1289
1290     if (! $matcher) {
1291         $CPAN::Frontend->myprint(
1292             "\nYou can re-run configuration any time with 'o conf init' in the CPAN shell\n"
1293         );
1294     }
1295
1296 }
1297
1298 sub _local_lib_config {
1299     # Set environment stuff for this process
1300     require local::lib;
1301     my %env = local::lib->build_environment_vars_for(_local_lib_path(), 1);
1302     while ( my ($k, $v) = each %env ) {
1303         $ENV{$k} = $v;
1304     }
1305
1306     # Tell user about environment vars to set
1307     $CPAN::Frontend->myprint($prompts{local_lib_installed});
1308     local $ENV{SHELL} = $CPAN::Config->{shell} || $ENV{SHELL};
1309     my $shellvars = local::lib->environment_vars_string_for(_local_lib_path());
1310     $CPAN::Frontend->myprint($shellvars);
1311
1312     # Offer to mangle the shell config
1313     my $munged_rc;
1314     if ( my $rc = _find_shell_config() ) {
1315         local $auto_config = 0; # We *must* ask, even under autoconfig
1316         local *_real_prompt;    # We *must* show prompt
1317         my $_conf = prompt(
1318             "\nWould you like me to append that to $rc now?", "yes"
1319         );
1320         if ($_conf =~ /^y/i) {
1321             open my $fh, ">>", $rc;
1322             print {$fh} "\n$shellvars";
1323             close $fh;
1324             $munged_rc++;
1325         }
1326     }
1327
1328     # Warn at exit time
1329     if ($munged_rc) {
1330         push @{$CPAN::META->_exit_messages}, << "HERE";
1331
1332 *** Remember to restart your shell before running cpan again ***
1333 HERE
1334     }
1335     else {
1336         push @{$CPAN::META->_exit_messages}, << "HERE";
1337
1338 *** Remember to add these environment variables to your shell config
1339     and restart your shell before running cpan again ***
1340
1341 $shellvars
1342 HERE
1343     }
1344 }
1345
1346 {
1347     my %shell_rc_map = (
1348         map { $_ => ".${_}rc" } qw/ bash tcsh csh /,
1349         map { $_ => ".profile" } qw/dash ash sh/,
1350         zsh  => ".zshenv",
1351     );
1352
1353     sub _find_shell_config {
1354         my $shell = File::Basename::basename($CPAN::Config->{shell});
1355         if ( my $rc = $shell_rc_map{$shell} ) {
1356             my $path = File::Spec->catfile($ENV{HOME}, $rc);
1357             return $path if -w $path;
1358         }
1359     }
1360 }
1361
1362
1363 sub _local_lib_inc_path {
1364     return File::Spec->catdir(_local_lib_path(), qw/lib perl5/);
1365 }
1366
1367 sub _local_lib_path {
1368     return File::Spec->catdir(_local_lib_home(), 'perl5');
1369 }
1370
1371 # Adapted from resolve_home_path() in local::lib -- this is where
1372 # local::lib thinks the user's home is
1373 {
1374     my $local_lib_home;
1375     sub _local_lib_home {
1376         $local_lib_home ||= File::Spec->rel2abs( do {
1377             if ($CPAN::META->has_usable("File::HomeDir") && File::HomeDir->VERSION >= 0.65) {
1378                 File::HomeDir->my_home;
1379             } elsif (defined $ENV{HOME}) {
1380                 $ENV{HOME};
1381             } else {
1382                 (getpwuid $<)[7] || "~";
1383             }
1384         });
1385     }
1386 }
1387
1388 sub _do_pick_mirrors {
1389     local *_real_prompt;
1390     *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt;
1391     $CPAN::Frontend->myprint($prompts{urls_intro});
1392     # Only prompt for auto-pick if Net::Ping is new enough to do timings
1393     my $_conf = 'n';
1394     if ( $CPAN::META->has_usable("Net::Ping") && Net::Ping->VERSION gt '2.13') {
1395         $_conf = prompt($prompts{auto_pick}, "yes");
1396     }
1397     my @old_list = @{ $CPAN::Config->{urllist} };
1398     if ( $_conf =~ /^y/i ) {
1399         conf_sites( auto_pick => 1 ) or bring_your_own();
1400     }
1401     else {
1402         _print_urllist('Current') if @old_list;
1403         my $msg = scalar @old_list
1404             ? "\nWould you like to edit the urllist or pick new mirrors from a list?"
1405             : "\nWould you like to pick from the CPAN mirror list?" ;
1406         my $_conf = prompt($msg, "yes");
1407         if ( $_conf =~ /^y/i ) {
1408             conf_sites();
1409         }
1410         bring_your_own();
1411     }
1412     _print_urllist('New');
1413 }
1414
1415 sub _init_external_progs {
1416     my($matcher,$args) = @_;
1417     my $PATH = $args->{path};
1418     my @external_progs = @{ $args->{progs} };
1419     my $shortcut = $args->{shortcut};
1420     my $showed_make_warning;
1421
1422     if (!$matcher or "@external_progs" =~ /$matcher/) {
1423         my $old_warn = $^W;
1424         local $^W if $^O eq 'MacOS';
1425         local $^W = $old_warn;
1426         my $progname;
1427         for $progname (@external_progs) {
1428             next if $matcher && $progname !~ /$matcher/;
1429             if ($^O eq 'MacOS') {
1430                 $CPAN::Config->{$progname} = 'not_here';
1431                 next;
1432             }
1433
1434             my $progcall = $progname;
1435             unless ($matcher) {
1436                 # we really don't need ncftp if we have ncftpget, but
1437                 # if they chose this dialog via matcher, they shall have it
1438                 next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " ";
1439             }
1440             my $path = $CPAN::Config->{$progname}
1441                 || $Config::Config{$progname}
1442                     || "";
1443             if (File::Spec->file_name_is_absolute($path)) {
1444                 # testing existence is not good enough, some have these exe
1445                 # extensions
1446
1447                 # warn "Warning: configured $path does not exist\n" unless -e $path;
1448                 # $path = "";
1449             } elsif ($path =~ /^\s+$/) {
1450                 # preserve disabled programs
1451             } else {
1452                 $path = '';
1453             }
1454             unless ($path) {
1455                 # e.g. make -> nmake
1456                 $progcall = $Config::Config{$progname} if $Config::Config{$progname};
1457             }
1458
1459             $path ||= find_exe($progcall,$PATH);
1460             unless ($path) { # not -e $path, because find_exe already checked that
1461                 local $"=";";
1462                 $CPAN::Frontend->mywarn("Warning: $progcall not found in PATH[@$PATH]\n") unless $auto_config;
1463                 _beg_for_make(), $showed_make_warning++ if $progname eq "make";
1464             }
1465             $prompts{$progname} = "Where is your $progname program?";
1466             $path = my_dflt_prompt($progname,$path,$matcher,1); # 1 => no strip spaces
1467             my $disabling = $path =~ m/^\s*$/;
1468
1469             # don't let them disable or misconfigure make without warning
1470             if ( $progname eq "make" && ( $disabling || ! _check_found($path) ) ) {
1471               if ( $disabling && $showed_make_warning ) {
1472                 next;
1473               }
1474               else {
1475                 _beg_for_make() unless $showed_make_warning++;
1476                 undef $CPAN::Config->{$progname};
1477                 $CPAN::Frontend->mywarn("Press SPACE and ENTER to disable make (NOT RECOMMENDED)\n");
1478                 redo;
1479               }
1480             }
1481             elsif ( $disabling ) {
1482               next;
1483             }
1484             elsif ( _check_found( $CPAN::Config->{$progname} ) ) {
1485               last if $shortcut && !$matcher;
1486             }
1487             else {
1488               undef $CPAN::Config->{$progname};
1489               $CPAN::Frontend->mywarn("Press SPACE and ENTER to disable $progname\n");
1490               redo;
1491             }
1492         }
1493     }
1494 }
1495
1496 sub _check_found {
1497   my ($prog) = @_;
1498   if ( ! -f $prog ) {
1499     $CPAN::Frontend->mywarn("Warning: '$prog' does not exist\n")
1500       unless $auto_config;
1501     return;
1502   }
1503   elsif ( ! -x $prog ) {
1504     $CPAN::Frontend->mywarn("Warning: '$prog' is not executable\n")
1505       unless $auto_config;
1506     return;
1507   }
1508   return 1;
1509 }
1510
1511 sub _beg_for_make {
1512   $CPAN::Frontend->mywarn(<<"HERE");
1513
1514 ALERT: 'make' is an essential tool for building perl Modules.
1515 Please make sure you have 'make' (or some equivalent) working.
1516
1517 HERE
1518                     if ($^O eq "MSWin32") {
1519     $CPAN::Frontend->mywarn(<<"HERE");
1520 Windows users may want to follow this procedure when back in the CPAN shell:
1521
1522     look YVES/scripts/alien_nmake.pl
1523     perl alien_nmake.pl
1524
1525 This will install nmake on your system which can be used as a 'make'
1526 substitute. You can then revisit this dialog with
1527
1528     o conf init make
1529
1530 HERE
1531     }
1532 }
1533
1534 sub init_cpan_home {
1535     my($matcher) = @_;
1536     if (!$matcher or 'cpan_home' =~ /$matcher/) {
1537         my $cpan_home =
1538             $CPAN::Config->{cpan_home} || CPAN::HandleConfig::cpan_home();
1539         if (-d $cpan_home) {
1540             $CPAN::Frontend->myprint(
1541                 "\nI see you already have a directory\n" .
1542                 "\n$cpan_home\n" .
1543                 "Shall we use it as the general CPAN build and cache directory?\n\n"
1544             ) unless $auto_config;
1545         } else {
1546             # no cpan-home, must prompt and get one
1547             $CPAN::Frontend->myprint($prompts{cpan_home_where}) unless $auto_config;
1548         }
1549
1550         my $default = $cpan_home;
1551         my $loop = 0;
1552         my($last_ans,$ans);
1553         $CPAN::Frontend->myprint(" <cpan_home>\n") unless $auto_config;
1554     PROMPT: while ($ans = prompt("CPAN build and cache directory?",$default)) {
1555             if (File::Spec->file_name_is_absolute($ans)) {
1556                 my @cpan_home = split /[\/\\]/, $ans;
1557             DIR: for my $dir (@cpan_home) {
1558                     if ($dir =~ /^~/ and (!$last_ans or $ans ne $last_ans)) {
1559                         $CPAN::Frontend
1560                             ->mywarn("Warning: a tilde in the path will be ".
1561                                      "taken as a literal tilde. Please ".
1562                                      "confirm again if you want to keep it\n");
1563                         $last_ans = $default = $ans;
1564                         next PROMPT;
1565                     }
1566                 }
1567             } else {
1568                 require Cwd;
1569                 my $cwd = Cwd::cwd();
1570                 my $absans = File::Spec->catdir($cwd,$ans);
1571                 $CPAN::Frontend->mywarn("The path '$ans' is not an ".
1572                                         "absolute path. Please specify ".
1573                                         "an absolute path\n");
1574                 $default = $absans;
1575                 next PROMPT;
1576             }
1577             eval { File::Path::mkpath($ans); }; # dies if it can't
1578             if ($@) {
1579                 $CPAN::Frontend->mywarn("Couldn't create directory $ans.\n".
1580                                         "Please retry.\n");
1581                 next PROMPT;
1582             }
1583             if (-d $ans && -w _) {
1584                 last PROMPT;
1585             } else {
1586                 $CPAN::Frontend->mywarn("Couldn't find directory $ans\n".
1587                                         "or directory is not writable. Please retry.\n");
1588                 if (++$loop > 5) {
1589                     $CPAN::Frontend->mydie("Giving up");
1590                 }
1591             }
1592         }
1593         $CPAN::Config->{cpan_home} = $ans;
1594     }
1595 }
1596
1597 sub my_dflt_prompt {
1598     my ($item, $dflt, $m, $no_strip) = @_;
1599     my $default = $CPAN::Config->{$item} || $dflt;
1600
1601     if (!$auto_config && (!$m || $item =~ /$m/)) {
1602         if (my $intro = $prompts{$item . "_intro"}) {
1603             $CPAN::Frontend->myprint($intro);
1604         }
1605         $CPAN::Frontend->myprint(" <$item>\n");
1606         $CPAN::Config->{$item} =
1607           $no_strip ? prompt_no_strip($prompts{$item}, $default)
1608                     : prompt(         $prompts{$item}, $default);
1609     } else {
1610         $CPAN::Config->{$item} = $default;
1611     }
1612     return $CPAN::Config->{$item};
1613 }
1614
1615 sub my_yn_prompt {
1616     my ($item, $dflt, $m) = @_;
1617     my $default;
1618     defined($default = $CPAN::Config->{$item}) or $default = $dflt;
1619
1620     # $DB::single = 1;
1621     if (!$auto_config && (!$m || $item =~ /$m/)) {
1622         if (my $intro = $prompts{$item . "_intro"}) {
1623             $CPAN::Frontend->myprint($intro);
1624         }
1625         $CPAN::Frontend->myprint(" <$item>\n");
1626         my $ans = prompt($prompts{$item}, $default ? 'yes' : 'no');
1627         $CPAN::Config->{$item} = ($ans =~ /^[y1]/i ? 1 : 0);
1628     } else {
1629         $CPAN::Config->{$item} = $default;
1630     }
1631 }
1632
1633 sub my_prompt_loop {
1634     my ($item, $dflt, $m, $ok) = @_;
1635     my $default = $CPAN::Config->{$item} || $dflt;
1636     my $ans;
1637
1638     if (!$auto_config && (!$m || $item =~ /$m/)) {
1639         $CPAN::Frontend->myprint($prompts{$item . "_intro"});
1640         $CPAN::Frontend->myprint(" <$item>\n");
1641         do { $ans = prompt($prompts{$item}, $default);
1642         } until $ans =~ /$ok/;
1643         $CPAN::Config->{$item} = $ans;
1644     } else {
1645         $CPAN::Config->{$item} = $default;
1646     }
1647 }
1648
1649
1650 # Here's the logic about the MIRRORED.BY file.  There are a number of scenarios:
1651 # (1) We have a cached MIRRORED.BY file
1652 #   (1a) We're auto-picking
1653 #       - Refresh it automatically if it's old
1654 #   (1b) Otherwise, ask if using cached is ok.  If old, default to no.
1655 #       - If cached is not ok, get it from the Internet. If it succeeds we use
1656 #         the new file.  Otherwise, we use the old file.
1657 # (2) We don't have a copy at all
1658 #   (2a) If we are allowed to connect, we try to get a new copy.  If it succeeds,
1659 #        we use it, otherwise, we warn about failure
1660 #   (2b) If we aren't allowed to connect, 
1661
1662 sub conf_sites {
1663     my %args = @_;
1664     # auto pick implies using the internet
1665     $CPAN::Config->{connect_to_internet_ok} = 1 if $args{auto_pick};
1666
1667     my $m = 'MIRRORED.BY';
1668     my $mby = File::Spec->catfile($CPAN::Config->{keep_source_where},$m);
1669     File::Path::mkpath(File::Basename::dirname($mby));
1670     # Why are we using MIRRORED.BY from the current directory?
1671     # Is this for testing? -- dagolden, 2009-11-05
1672     if (-f $mby && -f $m && -M $m < -M $mby) {
1673         require File::Copy;
1674         File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
1675     }
1676     local $^T = time;
1677     # if we have a cached copy is not older than 60 days, we either
1678     # use it or refresh it or fall back to it if the refresh failed.
1679     if ($mby && -f $mby && -s _ > 0 ) {
1680       my $very_old = (-M $mby > 60);
1681       my $mtime = localtime((stat _)[9]);
1682       # if auto_pick, refresh anything old automatically
1683       if ( $args{auto_pick} ) {
1684         if ( $very_old ) {
1685           $CPAN::Frontend->myprint(qq{Trying to refresh your mirror list\n});
1686           eval { CPAN::FTP->localize($m,$mby,3,1) }
1687             or $CPAN::Frontend->myprint(qq{Refresh failed.  Using the old cached copy instead.\n});
1688           $CPAN::Frontend->myprint("\n");
1689         }
1690       }
1691       else {
1692         my $prompt = qq{Found a cached mirror list as of $mtime
1693
1694 If you'd like to just use the cached copy, answer 'yes', below.
1695 If you'd like an updated copy of the mirror list, answer 'no' and
1696 I'll get a fresh one from the Internet.
1697
1698 Shall I use the cached mirror list?};
1699         my $ans = prompt($prompt, $very_old ? "no" : "yes");
1700         if ($ans =~ /^n/i) {
1701           $CPAN::Frontend->myprint(qq{Trying to refresh your mirror list\n});
1702           # you asked for it from the Internet
1703           $CPAN::Config->{connect_to_internet_ok} = 1;
1704           eval { CPAN::FTP->localize($m,$mby,3,1) }
1705             or $CPAN::Frontend->myprint(qq{Refresh failed.  Using the old cached copy instead.\n});
1706           $CPAN::Frontend->myprint("\n");
1707         }
1708       }
1709     }
1710     # else there is no cached copy and we must fetch or fail
1711     else {
1712       # If they haven't agree to connect to the internet, ask again
1713       if ( ! $CPAN::Config->{connect_to_internet_ok} ) {
1714         my $prompt = q{You are missing a copy of the CPAN mirror list.
1715
1716 May I connect to the Internet to get it?};
1717         my $ans = prompt($prompt, "yes");
1718         if ($ans =~ /^y/i) {
1719           $CPAN::Config->{connect_to_internet_ok} = 1;
1720         }
1721       }
1722
1723       # Now get it from the Internet or complain
1724       if ( $CPAN::Config->{connect_to_internet_ok} ) {
1725         $CPAN::Frontend->myprint(qq{Trying to fetch a mirror list from the Internet\n});
1726         eval { CPAN::FTP->localize($m,$mby,3,1) }
1727           or $CPAN::Frontend->mywarn(<<'HERE');
1728 We failed to get a copy of the mirror list from the Internet.
1729 You will need to provide CPAN mirror URLs yourself.
1730 HERE
1731         $CPAN::Frontend->myprint("\n");
1732       }
1733       else {
1734         $CPAN::Frontend->mywarn(<<'HERE');
1735 You will need to provide CPAN mirror URLs yourself or set 
1736 'o conf connect_to_internet_ok 1' and try again.
1737 HERE
1738       }
1739     }
1740
1741     # if we finally have a good local MIRRORED.BY, get on with picking
1742     if (-f $mby && -s _ > 0){
1743         $CPAN::Config->{urllist} =
1744           $args{auto_pick} ? auto_mirrored_by($mby) : choose_mirrored_by($mby);
1745         return 1;
1746     }
1747
1748     return;
1749 }
1750
1751 sub find_exe {
1752     my($exe,$path) = @_;
1753     $path ||= [split /$Config{'path_sep'}/, $ENV{'PATH'}];
1754     my($dir);
1755     #warn "in find_exe exe[$exe] path[@$path]";
1756     for $dir (@$path) {
1757         my $abs = File::Spec->catfile($dir,$exe);
1758         if (($abs = MM->maybe_command($abs))) {
1759             return $abs;
1760         }
1761     }
1762 }
1763
1764 sub picklist {
1765     my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_;
1766     CPAN->debug("picklist('$items','$prompt','$default','$require_nonempty',".
1767                 "'$empty_warning')") if $CPAN::DEBUG;
1768     $default ||= '';
1769
1770     my $pos = 0;
1771
1772     my @nums;
1773   SELECTION: while (1) {
1774
1775         # display, at most, 15 items at a time
1776         my $limit = $#{ $items } - $pos;
1777         $limit = 15 if $limit > 15;
1778
1779         # show the next $limit items, get the new position
1780         $pos = display_some($items, $limit, $pos, $default);
1781         $pos = 0 if $pos >= @$items;
1782
1783         my $num = prompt($prompt,$default);
1784
1785         @nums = split (' ', $num);
1786         {
1787             my %seen;
1788             @nums = grep { !$seen{$_}++ } @nums;
1789         }
1790         my $i = scalar @$items;
1791         unrangify(\@nums);
1792         if (0 == @nums) {
1793             # cannot allow nothing because nothing means paging!
1794             # return;
1795         } elsif (grep (/\D/ || $_ < 1 || $_ > $i, @nums)) {
1796             $CPAN::Frontend->mywarn("invalid items entered, try again\n");
1797             if ("@nums" =~ /\D/) {
1798                 $CPAN::Frontend->mywarn("(we are expecting only numbers between 1 and $i)\n");
1799             }
1800             next SELECTION;
1801         }
1802         if ($require_nonempty && !@nums) {
1803             $CPAN::Frontend->mywarn("$empty_warning\n");
1804         }
1805
1806         # a blank line continues...
1807         unless (@nums){
1808             $CPAN::Frontend->mysleep(0.1); # prevent hot spinning process on the next bug
1809             next SELECTION;
1810         }
1811         last;
1812     }
1813     for (@nums) { $_-- }
1814     @{$items}[@nums];
1815 }
1816
1817 sub unrangify ($) {
1818     my($nums) = $_[0];
1819     my @nums2 = ();
1820     while (@{$nums||[]}) {
1821         my $n = shift @$nums;
1822         if ($n =~ /^(\d+)-(\d+)$/) {
1823             my @range = $1 .. $2;
1824             # warn "range[@range]";
1825             push @nums2, @range;
1826         } else {
1827             push @nums2, $n;
1828         }
1829     }
1830     push @$nums, @nums2;
1831 }
1832
1833 sub display_some {
1834     my ($items, $limit, $pos, $default) = @_;
1835     $pos ||= 0;
1836
1837     my @displayable = @$items[$pos .. ($pos + $limit)];
1838     for my $item (@displayable) {
1839         $CPAN::Frontend->myprint(sprintf "(%d) %s\n", ++$pos, $item);
1840     }
1841     my $hit_what = $default ? "SPACE ENTER" : "ENTER";
1842     $CPAN::Frontend->myprint(sprintf("%d more items, hit %s to show them\n",
1843                                      (@$items - $pos),
1844                                      $hit_what,
1845                                     ))
1846         if $pos < @$items;
1847     return $pos;
1848 }
1849
1850 sub auto_mirrored_by {
1851     my $local = shift or return;
1852     local $|=1;
1853     $CPAN::Frontend->myprint("Looking for CPAN mirrors near you (please be patient)\n");
1854     my $mirrors = CPAN::Mirrors->new($local);
1855     my $cnt = 0;
1856     my @best = $mirrors->best_mirrors(
1857       how_many => 3,
1858       callback => sub {
1859           $CPAN::Frontend->myprint(".");
1860           if ($cnt++>60) { $cnt=0; $CPAN::Frontend->myprint("\n"); }
1861       },
1862     );
1863     my $urllist = [ map { $_->http } @best ];
1864     push @$urllist, grep { /^file:/ } @{$CPAN::Config->{urllist}};
1865     $CPAN::Frontend->myprint(" done!\n\n");
1866     return $urllist
1867 }
1868
1869 sub choose_mirrored_by {
1870     my $local = shift or return;
1871     my ($default);
1872     my $mirrors = CPAN::Mirrors->new($local);
1873     my @previous_urls = @{$CPAN::Config->{urllist}};
1874
1875     $CPAN::Frontend->myprint($prompts{urls_picker_intro});
1876
1877     my (@cont, $cont, %cont, @countries, @urls, %seen);
1878     my $no_previous_warn =
1879         "Sorry! since you don't have any existing picks, you must make a\n" .
1880             "geographic selection.";
1881     my $offer_cont = [sort $mirrors->continents];
1882     if (@previous_urls) {
1883         push @$offer_cont, "(edit previous picks)";
1884         $default = @$offer_cont;
1885     } else {
1886         # cannot allow nothing because nothing means paging!
1887         # push @$offer_cont, "(none of the above)";
1888     }
1889     @cont = picklist($offer_cont,
1890                      "Select your continent (or several nearby continents)",
1891                      $default,
1892                      ! @previous_urls,
1893                      $no_previous_warn);
1894     # cannot allow nothing because nothing means paging!
1895     # return unless @cont;
1896
1897     foreach $cont (@cont) {
1898         my @c = sort $mirrors->countries($cont);
1899         @cont{@c} = map ($cont, 0..$#c);
1900         @c = map ("$_ ($cont)", @c) if @cont > 1;
1901         push (@countries, @c);
1902     }
1903     if (@previous_urls && @countries) {
1904         push @countries, "(edit previous picks)";
1905         $default = @countries;
1906     }
1907
1908     if (@countries) {
1909         @countries = picklist (\@countries,
1910                                "Select your country (or several nearby countries)",
1911                                $default,
1912                                ! @previous_urls,
1913                                $no_previous_warn);
1914         %seen = map (($_ => 1), @previous_urls);
1915         # hmmm, should take list of defaults from CPAN::Config->{'urllist'}...
1916         foreach my $country (@countries) {
1917             next if $country =~ /edit previous picks/;
1918             (my $bare_country = $country) =~ s/ \(.*\)//;
1919             my @u;
1920             for my $m ( $mirrors->mirrors($bare_country) ) {
1921               push @u, $m->ftp if $m->ftp;
1922               push @u, $m->http if $m->http;
1923             }
1924             @u = grep (! $seen{$_}, @u);
1925             @u = map ("$_ ($bare_country)", @u)
1926                 if @countries > 1;
1927             push (@urls, sort @u);
1928         }
1929     }
1930     push (@urls, map ("$_ (previous pick)", @previous_urls));
1931     my $prompt = "Select as many URLs as you like (by number),
1932 put them on one line, separated by blanks, hyphenated ranges allowed
1933  e.g. '1 4 5' or '7 1-4 8'";
1934     if (@previous_urls) {
1935         $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) ..
1936                          (scalar @urls));
1937         $prompt .= "\n(or just hit ENTER to keep your previous picks)";
1938     }
1939
1940     @urls = picklist (\@urls, $prompt, $default);
1941     foreach (@urls) { s/ \(.*\)//; }
1942     return [ @urls ];
1943 }
1944
1945 sub bring_your_own {
1946     my $urllist = [ @{$CPAN::Config->{urllist}} ];
1947     my %seen = map (($_ => 1), @$urllist);
1948     my($ans,@urls);
1949     my $eacnt = 0; # empty answers
1950     $CPAN::Frontend->myprint(<<'HERE');
1951 Now you can enter your own CPAN URLs by hand. A local CPAN mirror can be
1952 listed using a 'file:' URL like 'file:///path/to/cpan/'
1953
1954 HERE
1955     do {
1956         my $prompt = "Enter another URL or ENTER to quit:";
1957         unless (%seen) {
1958             $prompt = qq{CPAN.pm needs at least one URL where it can fetch CPAN files from.
1959
1960 Please enter your CPAN site:};
1961         }
1962         $ans = prompt ($prompt, "");
1963
1964         if ($ans) {
1965             $ans =~ s|/?\z|/|; # has to end with one slash
1966             # XXX This manipulation is odd.  Shouldn't we check that $ans is
1967             # a directory before converting to file:///?  And we need /// below,
1968             # too, don't we?  -- dagolden, 2009-11-05
1969             $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file:
1970             if ($ans =~ /^\w+:\/./) {
1971                 push @urls, $ans unless $seen{$ans}++;
1972             } else {
1973                 $CPAN::Frontend->
1974                     myprint(sprintf(qq{"%s" doesn\'t look like an URL at first sight.
1975 I\'ll ignore it for now.
1976 You can add it to your %s
1977 later if you\'re sure it\'s right.\n},
1978                                    $ans,
1979                                    $INC{'CPAN/MyConfig.pm'}
1980                                    || $INC{'CPAN/Config.pm'}
1981                                    || "configuration file",
1982                                   ));
1983             }
1984         } else {
1985             if (++$eacnt >= 5) {
1986                 $CPAN::Frontend->
1987                     mywarn("Giving up.\n");
1988                 $CPAN::Frontend->mysleep(5);
1989                 return;
1990             }
1991         }
1992     } while $ans || !%seen;
1993
1994     @$urllist = CPAN::_uniq(@$urllist, @urls);
1995     $CPAN::Config->{urllist} = $urllist;
1996 }
1997
1998 sub _print_urllist {
1999     my ($which) = @_;
2000     $CPAN::Frontend->myprint("$which urllist\n");
2001     for ( @{$CPAN::Config->{urllist} || []} ) { 
2002       $CPAN::Frontend->myprint("  $_\n") 
2003     };
2004 }
2005
2006 sub _can_write_to_libdirs {
2007     return -w $Config{installprivlib}
2008         && -w $Config{installarchlib}
2009         && -w $Config{installsitelib}
2010         && -w $Config{installsitearch}
2011 }
2012
2013 sub _using_installbase {
2014     return 1 if $ENV{PERL_MM_OPT} && $ENV{PERL_MM_OPT} =~ /install_base/i;
2015     return 1 if grep { ($CPAN::Config->{$_}||q{}) =~ /install_base/i }
2016         qw(makepl_arg make_install_arg mbuildpl_arg mbuild_install_arg);
2017     return;
2018 }
2019
2020 sub _using_sudo {
2021     return 1 if grep { ($CPAN::Config->{$_}||q{}) =~ /sudo/ }
2022         qw(make_install_make_command mbuild_install_build_command);
2023     return;
2024 }
2025
2026 sub _strip_spaces {
2027     $_[0] =~ s/^\s+//;  # no leading spaces
2028     $_[0] =~ s/\s+\z//; # no trailing spaces
2029 }
2030
2031 sub prompt ($;$) {
2032     unless (defined &_real_prompt) {
2033         *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt;
2034     }
2035     my $ans = _real_prompt(@_);
2036
2037     _strip_spaces($ans);
2038     $CPAN::Frontend->myprint("\n") unless $auto_config;
2039
2040     return $ans;
2041 }
2042
2043
2044 sub prompt_no_strip ($;$) {
2045     unless (defined &_real_prompt) {
2046         *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt;
2047     }
2048     return _real_prompt(@_);
2049 }
2050
2051
2052
2053 1;