This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to CPAN-1.88_62
[perl5.git] / lib / CPAN / HandleConfig.pm
index b6af22b..4f4b5a3 100644 (file)
@@ -2,7 +2,7 @@ package CPAN::HandleConfig;
 use strict;
 use vars qw(%can %keys $VERSION);
 
-$VERSION = sprintf "%.6f", substr(q$Rev: 987 $,4)/1000000 + 5.4;
+$VERSION = sprintf "%.6f", substr(q$Rev: 1264 $,4)/1000000 + 5.4;
 
 %can = (
         commit   => "Commit changes to disk",
@@ -14,70 +14,83 @@ $VERSION = sprintf "%.6f", substr(q$Rev: 987 $,4)/1000000 + 5.4;
 # Q: where is the "How do I add a new config option" HOWTO?
 # A1: svn diff -r 757:758 # where dagolden added test_report
 # A2: svn diff -r 985:986 # where andk added yaml_module
-%keys = map { $_ => undef } (
-                             #  allow_unauthenticated ?? some day...
-                             "build_cache",
-                             "build_dir",
-                             "build_requires_install_policy",
-                             "bzip2",
-                             "cache_metadata",
-                             "check_sigs",
-                             "colorize_output",
-                             "colorize_print",
-                             "colorize_warn",
-                             "commandnumber_in_prompt",
-                             "commands_quote",
-                             "cpan_home",
-                             "curl",
-                             "dontload_hash", # deprecated after 1.83_68 (rev. 581)
-                             "dontload_list",
-                             "ftp",
-                             "ftp_passive",
-                             "ftp_proxy",
-                             "getcwd",
-                             "gpg",
-                             "gzip",
-                             "histfile",
-                             "histsize",
-                             "http_proxy",
-                             "inactivity_timeout",
-                             "index_expire",
-                             "inhibit_startup_message",
-                             "keep_source_where",
-                             "lynx",
-                             "make",
-                             "make_arg",
-                             "make_install_arg",
-                             "make_install_make_command",
-                             "makepl_arg",
-                             "mbuild_arg",
-                             "mbuild_install_arg",
-                             "mbuild_install_build_command",
-                             "mbuildpl_arg",
-                             "ncftp",
-                             "ncftpget",
-                             "no_proxy",
-                             "pager",
-                             "password",
-                             "prefer_installer",
-                             "prerequisites_policy",
-                             "prefs_dir",
-                             "proxy_pass",
-                             "proxy_user",
-                             "scan_cache",
-                             "shell",
-                             "show_upload_date",
-                             "tar",
-                             "term_is_latin",
-                             "term_ornaments",
-                             "test_report",
-                             "unzip",
-                             "urllist",
-                             "username",
-                             "wait_list",
-                             "wget",
-                             "yaml_module",
-                            );
+%keys = map { $_ => undef }
+    (
+     "build_cache",
+     "build_dir",
+     "build_dir_reuse",
+     "build_requires_install_policy",
+     "bzip2",
+     "cache_metadata",
+     "check_sigs",
+     "colorize_output",
+     "colorize_print",
+     "colorize_warn",
+     "commandnumber_in_prompt",
+     "commands_quote",
+     "cpan_home",
+     "curl",
+     "dontload_hash", # deprecated after 1.83_68 (rev. 581)
+     "dontload_list",
+     "ftp",
+     "ftp_passive",
+     "ftp_proxy",
+     "getcwd",
+     "gpg",
+     "gzip",
+     "histfile",
+     "histsize",
+     "http_proxy",
+     "inactivity_timeout",
+     "index_expire",
+     "inhibit_startup_message",
+     "keep_source_where",
+     "lynx",
+     "make",
+     "make_arg",
+     "make_install_arg",
+     "make_install_make_command",
+     "makepl_arg",
+     "mbuild_arg",
+     "mbuild_install_arg",
+     "mbuild_install_build_command",
+     "mbuildpl_arg",
+     "ncftp",
+     "ncftpget",
+     "no_proxy",
+     "pager",
+     "password",
+     "patch",
+     "prefer_installer",
+     "prerequisites_policy",
+     "prefs_dir",
+     "proxy_pass",
+     "proxy_user",
+     "randomize_urllist",
+     "scan_cache",
+     "shell",
+     "show_upload_date",
+     "tar",
+     "term_is_latin",
+     "term_ornaments",
+     "test_report",
+     "unzip",
+     "urllist",
+     "username",
+     "wait_list",
+     "wget",
+     "yaml_module",
+    );
+
+my %prefssupport = map { $_ => 1 }
+    (
+     "build_requires_install_policy",
+     "make",
+     "make_install_make_command",
+     "prefer_installer",
+     "test_report",
+    );
+
 if ($^O eq "MSWin32") {
     for my $k (qw(
                   mbuild_install_build_command
@@ -109,10 +122,12 @@ sub edit {
         unless (exists $keys{$o}) {
             $CPAN::Frontend->mywarn("Warning: unknown configuration variable '$o'\n");
         }
-       if ($o =~ /list$/) {
+        # one day I used randomize_urllist for a boolean, so we must
+        # list them explicitly --ak
+       if ($o =~ /^(wait_list|urllist|dontload_list)$/) {
            $func = shift @args;
            $func ||= "";
-            CPAN->debug("func[$func]") if $CPAN::DEBUG;
+            CPAN->debug("func[$func]args[@args]") if $CPAN::DEBUG;
             my $changed;
            # Let's avoid eval, it's easier to comprehend without.
            if ($func eq "push") {
@@ -128,15 +143,18 @@ sub edit {
                unshift @{$CPAN::Config->{$o}}, @args;
                 $changed = 1;
            } elsif ($func eq "splice") {
-               splice @{$CPAN::Config->{$o}}, @args;
+                my $offset = shift @args || 0;
+                my $length = shift @args || 0;
+               splice @{$CPAN::Config->{$o}}, $offset, $length, @args; # may warn
                 $changed = 1;
-           } elsif (@args) {
-               $CPAN::Config->{$o} = [@args];
+           } elsif ($func) {
+               $CPAN::Config->{$o} = [$func, @args];
                 $changed = 1;
            } else {
                 $self->prettyprint($o);
            }
             if ($changed) {
+                $CPAN::CONFIG_DIRTY = 1;
                 if ($o eq "urllist") {
                     # reset the cached values
                     undef $CPAN::FTP::Thesite;
@@ -148,11 +166,18 @@ sub edit {
             }
             return $changed;
         } elsif ($o =~ /_hash$/) {
-            @args = () if @args==1 && $args[0] eq "";
-            push @args, "" if @args % 2;
+            if (@args==1 && $args[0] eq ""){
+                @args = ();
+            } elsif (@args % 2) {
+                push @args, "";
+            }
             $CPAN::Config->{$o} = { @args };
+            $CPAN::CONFIG_DIRTY = 1;
         } else {
-           $CPAN::Config->{$o} = $args[0] if defined $args[0];
+            if (defined $args[0]){
+                $CPAN::CONFIG_DIRTY = 1;
+                $CPAN::Config->{$o} = $args[0];
+            }
            $self->prettyprint($o)
                 if exists $keys{$o} or defined $CPAN::Config->{$o};
             return 1;
@@ -166,7 +191,7 @@ sub prettyprint {
   if (ref $v) {
     my(@report);
     if (ref $v eq "ARRAY") {
-      @report = map {"\t[$_]\n"} @$v;
+      @report = map {"\t$_ \[$v->[$_]]\n"} 0..$#$v;
     } else {
       @report = map { sprintf("\t%-18s => %s\n",
                               map { "[$_]" } $_,
@@ -192,6 +217,14 @@ sub prettyprint {
 
 sub commit {
     my($self,@args) = @_;
+    CPAN->debug("args[@args]") if $CPAN::DEBUG;
+    if ($CPAN::RUN_DEGRADED) {
+                             $CPAN::Frontend->mydie(
+                                                    "'o conf commit' disabled in ".
+                                                    "degraded mode. Maybe try\n".
+                                                    " !undef \$CPAN::RUN_DEGRADED\n"
+                                                   );
+    }
     my $configpm;
     if (@args) {
       if ($args[0] eq "args") {
@@ -252,6 +285,7 @@ EOF
     #chmod $mode, $configpm;
 ###why was that so?    $self->defaults;
     $CPAN::Frontend->myprint("commit: wrote '$configpm'\n");
+    $CPAN::CONFIG_DIRTY = 0;
     1;
 }
 
@@ -262,7 +296,10 @@ sub neatvalue {
     my($self, $v) = @_;
     return "undef" unless defined $v;
     my($t) = ref $v;
-    return "q[$v]" unless $t;
+    unless ($t){
+        $v =~ s/\\/\\\\/g;
+        return "q[$v]";
+    }
     if ($t eq 'ARRAY') {
         my(@m, @neat);
         push @m, "[";
@@ -284,14 +321,23 @@ sub neatvalue {
 
 sub defaults {
     my($self) = @_;
+    if ($CPAN::RUN_DEGRADED) {
+                             $CPAN::Frontend->mydie(
+                                                    "'o conf defaults' disabled in ".
+                                                    "degraded mode. Maybe try\n".
+                                                    " !undef \$CPAN::RUN_DEGRADED\n"
+                                                   );
+    }
     my $done;
     for my $config (qw(CPAN/MyConfig.pm CPAN/Config.pm)) {
         if ($INC{$config}) {
+            CPAN->debug("INC{'$config'}[$INC{$config}]") if $CPAN::DEBUG;
             CPAN::Shell->reload_this($config,{force => 1});
             $CPAN::Frontend->myprint("'$INC{$config}' reread\n");
             last;
         }
     }
+    $CPAN::CONFIG_DIRTY = 0;
     1;
 }
 
@@ -340,6 +386,7 @@ else: quote it with the correct quote type for the box we're on
         my $quote = $CPAN::Config->{commands_quote} || $quotes;
 
         if ($quote ne ' '
+            and defined($command )
             and $command =~ /\s/
             and $command !~ /[$quote]/) {
             return qq<$use_quote$command$use_quote>
@@ -573,27 +620,39 @@ sub cpl {
     return grep /^\Q$word\E/, @o_conf;
 }
 
+sub prefs_lookup {
+    my($self,$distro,$what) = @_;
+    if ($prefssupport{$what}) {
+        return $distro->prefs->{cpanconfig}{$what} || $CPAN::Config->{$what};
+    } else {
+        warn "Warning: $what no yet officially supported for distroprefs, doing a normal lookup";
+        return $CPAN::Config->{$what};
+    }
+}
 
-package
-    CPAN::Config; ####::###### #hide from indexer
-# note: J. Nick Koston wrote me that they are using
-# CPAN::Config->commit although undocumented. I suggested
-# CPAN::Shell->o("conf","commit") even when ugly it is at least
-# documented
-
-# that's why I added the CPAN::Config class with autoload and
-# deprecated warning
 
-use strict;
-use vars qw($AUTOLOAD $VERSION);
-$VERSION = sprintf "%.2f", substr(q$Rev: 987 $,4)/100;
-
-# formerly CPAN::HandleConfig was known as CPAN::Config
-sub AUTOLOAD {
-  my($l) = $AUTOLOAD;
-  $CPAN::Frontend->mywarn("Dispatching deprecated method '$l' to CPAN::HandleConfig\n");
-  $l =~ s/.*:://;
-  CPAN::HandleConfig->$l(@_);
+{
+    package
+        CPAN::Config; ####::###### #hide from indexer
+    # note: J. Nick Koston wrote me that they are using
+    # CPAN::Config->commit although undocumented. I suggested
+    # CPAN::Shell->o("conf","commit") even when ugly it is at least
+    # documented
+
+    # that's why I added the CPAN::Config class with autoload and
+    # deprecated warning
+
+    use strict;
+    use vars qw($AUTOLOAD $VERSION);
+    $VERSION = sprintf "%.2f", substr(q$Rev: 1264 $,4)/100;
+
+    # formerly CPAN::HandleConfig was known as CPAN::Config
+    sub AUTOLOAD {
+        my($l) = $AUTOLOAD;
+        $CPAN::Frontend->mywarn("Dispatching deprecated method '$l' to CPAN::HandleConfig\n");
+        $l =~ s/.*:://;
+        CPAN::HandleConfig->$l(@_);
+    }
 }
 
 1;