handleconfig.pm

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PM 代码 · 共 720 行 · 第 1/2 页

PM
720
字号
package CPAN::HandleConfig;use strict;use vars qw(%can %keys $loading $VERSION);$VERSION = sprintf "%.6f", substr(q$Rev: 2212 $,4)/1000000 + 5.4;%can = (        commit   => "Commit changes to disk",        defaults => "Reload defaults from disk",        help     => "Short help about 'o conf' usage",        init     => "Interactive setting of all options",);# 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 }    (     "applypatch",     "auto_commit",     "build_cache",     "build_dir",     "build_dir_reuse",     "build_requires_install_policy",     "bzip2",     "cache_metadata",     "check_sigs",     "colorize_debug",     "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",     "load_module_verbosity",     "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",     "prefs_dir",     "prerequisites_policy",     "proxy_pass",     "proxy_user",     "randomize_urllist",     "scan_cache",     "shell",     "show_unparsable_versions",     "show_upload_date",     "show_zero_versions",     "tar",     "tar_verbosity",     "term_is_latin",     "term_ornaments",     "test_report",     "unzip",     "urllist",     "use_sqlite",     "username",     "wait_list",     "wget",     "yaml_load_code",     "yaml_module",    );my %prefssupport = map { $_ => 1 }    (     "build_requires_install_policy",     "check_sigs",     "make",     "make_install_make_command",     "prefer_installer",     "test_report",    );if ($^O eq "MSWin32") {    for my $k (qw(                  mbuild_install_build_command                  make_install_make_command                 )) {        delete $keys{$k};        if (exists $CPAN::Config->{$k}) {            for ("deleting previously set config variable '$k' => '$CPAN::Config->{$k}'") {                $CPAN::Frontend ? $CPAN::Frontend->mywarn($_) : warn $_;            }            delete $CPAN::Config->{$k};        }    }}# returns true on successful actionsub edit {    my($self,@args) = @_;    return unless @args;    CPAN->debug("self[$self]args[".join(" | ",@args)."]");    my($o,$str,$func,$args,$key_exists);    $o = shift @args;    $DB::single = 1;    if($can{$o}) {        $self->$o(args => \@args); # o conf init => sub init => sub load        return 1;    } else {        CPAN->debug("o[$o]") if $CPAN::DEBUG;        unless (exists $keys{$o}) {            $CPAN::Frontend->mywarn("Warning: unknown configuration variable '$o'\n");        }        my $changed;        # one day I used randomize_urllist for a boolean, so we must        # list them explicitly --ak        if (0) {        } elsif ($o =~ /^(wait_list|urllist|dontload_list)$/) {            #            # ARRAYS            #            $func = shift @args;            $func ||= "";            CPAN->debug("func[$func]args[@args]") if $CPAN::DEBUG;            # Let's avoid eval, it's easier to comprehend without.            if ($func eq "push") {                push @{$CPAN::Config->{$o}}, @args;                $changed = 1;            } elsif ($func eq "pop") {                pop @{$CPAN::Config->{$o}};                $changed = 1;            } elsif ($func eq "shift") {                shift @{$CPAN::Config->{$o}};                $changed = 1;            } elsif ($func eq "unshift") {                unshift @{$CPAN::Config->{$o}}, @args;                $changed = 1;            } elsif ($func eq "splice") {                my $offset = shift @args || 0;                my $length = shift @args || 0;                splice @{$CPAN::Config->{$o}}, $offset, $length, @args; # may warn                $changed = 1;            } elsif ($func) {                $CPAN::Config->{$o} = [$func, @args];                $changed = 1;            } else {                $self->prettyprint($o);            }            if ($changed) {                if ($o eq "urllist") {                    # reset the cached values                    undef $CPAN::FTP::Thesite;                    undef $CPAN::FTP::Themethod;                    $CPAN::Index::LAST_TIME = 0;                } elsif ($o eq "dontload_list") {                    # empty it, it will be built up again                    $CPAN::META->{dontload_hash} = {};                }            }        } elsif ($o =~ /_hash$/) {            #            # HASHES            #            if (@args==1 && $args[0] eq "") {                @args = ();            } elsif (@args % 2) {                push @args, "";            }            $CPAN::Config->{$o} = { @args };            $changed = 1;        } else {            #            # SCALARS            #            if (defined $args[0]) {                $CPAN::CONFIG_DIRTY = 1;                $CPAN::Config->{$o} = $args[0];                $changed = 1;            }            $self->prettyprint($o)                if exists $keys{$o} or defined $CPAN::Config->{$o};        }        if ($changed) {            if ($CPAN::Config->{auto_commit}) {                $self->commit;            } else {                $CPAN::CONFIG_DIRTY = 1;                $CPAN::Frontend->myprint("Please use 'o conf commit' to ".                                         "make the config permanent!\n\n");            }        }    }}sub prettyprint {    my($self,$k) = @_;    my $v = $CPAN::Config->{$k};    if (ref $v) {        my(@report);        if (ref $v eq "ARRAY") {            @report = map {"\t$_ \[$v->[$_]]\n"} 0..$#$v;        } else {            @report = map                {                    sprintf "\t%-18s => %s\n",                               "[$_]",                                        defined $v->{$_} ? "[$v->{$_}]" : "undef"                } keys %$v;        }        $CPAN::Frontend->myprint(                                 join(                                      "",                                      sprintf(                                              "    %-18s\n",                                              $k                                             ),                                      @report                                     )                                );    } elsif (defined $v) {        $CPAN::Frontend->myprint(sprintf "    %-18s [%s]\n", $k, $v);    } else {        $CPAN::Frontend->myprint(sprintf "    %-18s undef\n", $k);    }}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") {        # we have not signed that contract      } else {        $configpm = $args[0];      }    }    unless (defined $configpm) {        $configpm ||= $INC{"CPAN/MyConfig.pm"};        $configpm ||= $INC{"CPAN/Config.pm"};        $configpm || Carp::confess(q{CPAN::Config::commit called without an argument.Please specify a filename where to save the configuration or try"o conf init" to have an interactive course through configing.});    }    my($mode);    if (-f $configpm) {        $mode = (stat $configpm)[2];        if ($mode && ! -w _) {            Carp::confess("$configpm is not writable");        }    }    my $msg;    $msg = <<EOF unless $configpm =~ /MyConfig/;# This is CPAN.pm's systemwide configuration file. This file provides# defaults for users, and the values can be changed in a per-user# configuration file. The user-config file is being looked for as# ~/.cpan/CPAN/MyConfig.pm.EOF    $msg ||= "\n";    my($fh) = FileHandle->new;    rename $configpm, "$configpm~" if -f $configpm;    open $fh, ">$configpm" or        $CPAN::Frontend->mydie("Couldn't open >$configpm: $!");    $fh->print(qq[$msg\$CPAN::Config = \{\n]);    foreach (sort keys %$CPAN::Config) {        unless (exists $keys{$_}) {            # do not drop them: forward compatibility!            $CPAN::Frontend->mywarn("Unknown config variable '$_'\n");            next;        }        $fh->print(            "  '$_' => ",            $self->neatvalue($CPAN::Config->{$_}),            ",\n"        );    }    $fh->print("};\n1;\n__END__\n");    close $fh;    #$mode = 0444 | ( $mode & 0111 ? 0111 : 0 );    #chmod $mode, $configpm;###why was that so?    $self->defaults;    $CPAN::Frontend->myprint("commit: wrote '$configpm'\n");    $CPAN::CONFIG_DIRTY = 0;    1;}# stolen from MakeMaker; not taking the original because it is buggy;# bugreport will have to say: keys of hashes remain unquoted and can# produce syntax errorssub neatvalue {    my($self, $v) = @_;    return "undef" unless defined $v;    my($t) = ref $v;    unless ($t) {        $v =~ s/\\/\\\\/g;        return "q[$v]";    }    if ($t eq 'ARRAY') {        my(@m, @neat);        push @m, "[";        foreach my $elem (@$v) {            push @neat, "q[$elem]";        }        push @m, join ", ", @neat;        push @m, "]";        return join "", @m;    }    return "$v" unless $t eq 'HASH';    my(@m, $key, $val);    while (($key,$val) = each %$v) {        last unless defined $key; # cautious programming in case (undef,undef) is true        push(@m,"q[$key]=>".$self->neatvalue($val)) ;    }    return "{ ".join(', ',@m)." }";}sub defaults {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?