Moved Log::Message::Simple from lib/ to ext/
[p5sagit/p5-mst-13.2.git] / lib / CPANPLUS / Config.pm
index 2644efb..28f4fb6 100644 (file)
@@ -26,6 +26,23 @@ use Module::Load::Conditional   qw[check_install];
 
 CPANPLUS::Config
 
+=head1 SYNOPSIS
+
+    ### conf object via CPANPLUS::Backend;
+    $cb   = CPANPLUS::Backend->new;
+    $conf = $cb->configure_object;
+    
+    ### or as a standalone object
+    $conf = CPANPLUS::Configure->new;
+
+    ### values in 'conf' section
+    $verbose = $conf->get_conf( 'verbose' );    
+    $conf->set_conf( verbose => 1 );
+
+    ### values in 'program' section
+    $editor = $conf->get_program( 'editor' );
+    $conf->set_program( editor => '/bin/vi' );
+
 =head1 DESCRIPTION
 
 This module contains defaults and heuristics for configuration 
@@ -54,7 +71,8 @@ my $Conf = {
         'stored'            => 'sourcefiles',
         'dslip'             => '03modlist.data.gz',
         'update'            => '86400',
-        'mod'               => '02packages.details.txt.gz'
+        'mod'               => '02packages.details.txt.gz',
+        'custom_index'      => 'packages.txt',
     },
     '_build' => {
         'plugins'           => 'plugins',
@@ -65,6 +83,7 @@ my $Conf = {
         'autobundle_prefix' => 'Snapshot',
         'autdir'            => 'authors',
         'install_log_dir'   => 'install-logs',
+        'custom_sources'    => 'custom-sources',
         'sanity_check'      => 1,
     },
     '_mirror' => {
@@ -132,7 +151,7 @@ are run interactively or not. Defaults to 'true'.
 
 =item base
 
-The directory CPANPLUS keeps all it's build and state information in.
+The directory CPANPLUS keeps all its build and state information in.
 Defaults to ~/.cpanplus.
 
 =cut
@@ -195,6 +214,20 @@ when sending emails. Defaults to an C<example.com> address.
 =cut
 
         $Conf->{'conf'}->{'email'} = DEFAULT_EMAIL;
+        
+=item enable_custom_sources
+
+Boolean flag indicating whether custom sources should be enabled or
+not. See the C<CUSTOM MODULE SOURCES> in C<CPANPLUS::Backend> for
+details on how to use them.
+
+Defaults to C<true>
+
+=cut
+
+        ### this addresses #32248 which requests a possibillity to
+        ### turn off custom sources
+        $Conf->{'conf'}->{'enable_custom_sources'} = 1;
 
 =item extractdir
 
@@ -358,7 +391,11 @@ installed, 'false' otherwise.
 =cut
 
         $Conf->{'conf'}->{'signature'} = do {
-          (can_run('gpg') || check_install(module => 'Crypt::OpenPGP')) ?1:0 };
+            check_install( module => 'Module::Signature', version => '0.06' )
+            and ( can_run('gpg') || 
+                  check_install(module => 'Crypt::OpenPGP')
+            );
+        } ? 1 : 0;
 
 =item skiptest
 
@@ -413,6 +450,29 @@ a module using the interactive shell. Defaults to 'true'.
 
         $Conf->{'conf'}->{'write_install_logs'} = 1;
 
+=item source_engine
+
+Class to use as the source engine, which is generally a subclass of
+C<CPANPLUS::Internals::Source>. Default to C<CPANPLUS::Internals::Source::Memory>.
+
+=cut
+
+        $Conf->{'conf'}->{'source_engine'} = DEFAULT_SOURCE_ENGINE; 
+
+=item cpantest_reporter_args
+
+A hashref of key => value pairs that are passed to the constructor
+of C<Test::Reporter>. If you'd want to enable TLS for example, you'd
+set it to:
+
+  { transport       => 'Net::SMTP::TLS',
+    transport_args  => [ User => 'Joe', Password => '123' ],
+  }  
+
+=cut
+
+        $Conf->{'conf'}->{'cpantest_reporter_args'} = {};
+
 =back
     
 =head2 Section 'program'
@@ -427,7 +487,7 @@ a module using the interactive shell. Defaults to 'true'.
 =item editor
 
 A string holding the path to your editor of choice. Defaults to your
-$ENV{EDITOR}, $ENV{VISIUAL}, 'vi' or 'pico' programs, in that order.
+$ENV{EDITOR}, $ENV{VISUAL}, 'vi' or 'pico' programs, in that order.
 
 =cut
 
@@ -480,18 +540,44 @@ remains empty if you do not require super user permissiosn to install.
 =cut
 
         $Conf->{'program'}->{'sudo'} = do {
-            $>  # check for all install dirs!
-                # installsiteman3dir is a 5.8'ism.. don't check
-                # it on 5.6.x...
-                ? ( -w $Config{'installsitelib'} &&
-                    ( defined $Config{'installsiteman3dir'} &&
-                           -w $Config{'installsiteman3dir'}
-                    ) &&
-                    -w $Config{'installsitebin'} 
-                        ? undef
-                        : can_run('sudo') 
-                  )
-                : can_run('sudo')
+            ### let's assume you dont need sudo,
+            ### unless one of the below criteria tells us otherwise
+            my $sudo = undef;
+            
+            ### you're a normal user, you might need sudo
+            if( $> ) {
+    
+                ### check for all install dirs!
+                ### you have write permissions to the installdir,
+                ### you don't need sudo
+                if( -w $Config{'installsitelib'} && -w $Config{'installsitebin'} ) {                    
+                    
+                    ### installsiteman3dir is a 5.8'ism.. don't check
+                    ### it on 5.6.x...            
+                    if( defined $Config{'installsiteman3dir'} ) {
+                        $sudo = -w $Config{'installsiteman3dir'} 
+                            ? undef
+                            : can_run('sudo');
+                    } else {
+                        $sudo = undef;
+                    }
+
+                ### you have PERL_MM_OPT set to some alternate
+                ### install place. You probably have write permissions
+                ### to that
+                } elsif ( $ENV{'PERL_MM_OPT'} and 
+                          $ENV{'PERL_MM_OPT'} =~ /INSTALL|LIB|PREFIX/
+                ) {
+                    $sudo = undef;
+
+                ### you probably don't have write permissions
+                } else {                
+                    $sudo = can_run('sudo');
+                }
+            }  
+            
+            ### and return the value
+            $sudo;
         };
 
 =item perlwrapper
@@ -517,20 +603,25 @@ with CPANPLUS, which is used to enable autoflushing in spawned processes.
                         ? ($name.$ver, $name)
                         : ($name, $name.$ver);
             };
-                                
+
+            ### patch from Steve Hay Fri 29 Jun 2007 14:26:02 GMT+02:00
+            ### Msg-Id: <4684FA5A.7030506@uk.radan.com>
+            ### look for files with a ".bat" extension as well on Win32
+            @bins = map { $_, "$_.bat" } @bins if $^O eq 'MSWin32';
+
             my $path;
             BIN: for my $bin (@bins) {
                 
                 ### parallel to your cpanp/cpanp-boxed
                 my $maybe = File::Spec->rel2abs(
-                                File::Spec->catdir( dirname($0), $bin )
+                                File::Spec->catfile( dirname($0), $bin )
                             );        
                 $path = $maybe and last BIN if -f $maybe;
         
                 ### parallel to your CPANPLUS.pm:
                 ### $INC{cpanplus}/../bin/cpanp-run-perl
                 $maybe = File::Spec->rel2abs(
-                            File::Spec->catdir( 
+                            File::Spec->catfile( 
                                 dirname($INC{'CPANPLUS.pm'}),
                                 '..',   # lib dir
                                 'bin',  # bin dir
@@ -545,7 +636,7 @@ with CPANPLUS, which is used to enable autoflushing in spawned processes.
                 ### CPANPLUS.pm in
                 ### /tmp/cp/lib/perl5/site_perl/5.8.8
                 $maybe = File::Spec->rel2abs(
-                            File::Spec->catdir( 
+                            File::Spec->catfile( 
                                 dirname( $INC{'CPANPLUS.pm'} ),
                                 '..', '..', '..', '..', # 4x updir
                                 'bin',                  # bin dir
@@ -559,9 +650,16 @@ with CPANPLUS, which is used to enable autoflushing in spawned processes.
                 ### or user installs
                 ### note that we don't use 'can_run' as it's
                 ### not an executable, just a wrapper...
-                for my $dir (split(/\Q$Config::Config{path_sep}\E/, $ENV{PATH}),
-                             File::Spec->curdir
+                ### prefer anything that's found in the path paralel to your $^X
+                for my $dir (File::Spec->rel2abs( dirname($^X) ),
+                             split(/\Q$Config::Config{path_sep}\E/, $ENV{PATH}),
+                             File::Spec->curdir, 
                 ) {             
+
+                    ### On VMS the path could be in UNIX format, and we
+                    ### currently need it to be in VMS format
+                    $dir = VMS::Filespec::vmspath($dir) if ON_VMS;
+
                     $maybe = File::Spec->catfile( $dir, $bin );
                     $path = $maybe and last BIN if -f $maybe;
                 }
@@ -575,12 +673,19 @@ with CPANPLUS, which is used to enable autoflushing in spawned processes.
             ### cross your fingers...
             ### pass '-P' to perl: "run program through C 
             ### preprocessor before compilation"
+            ### XXX using -P actually changes the way some Makefile.PLs
+            ### are executed, so don't do that... --kane
             error(loc(
-                "Could not find the '%1' in your path".
+                "Could not find the '%1' binary in your path".
                 "--this may be a problem.\n".
                 "Please locate this program and set ".
-                "your '%2' config entry to its path.\n",                
-                $name, 'perlwrapper'
+                "your '%2' config entry to its path.\n".
+                "From the default shell, you can do this by typing:\n\n".
+                "  %3\n".
+                "  %4\n",
+                $name, 'perlwrapper', 
+                's program perlwrapper FULL_PATH_TO_CPANP_RUN_PERL',
+                's save'
              ));                                        
              return '';
         }->();
@@ -622,9 +727,30 @@ sub _clean_up_paths {
     ### clean up paths if we are on win32
     if( $^O eq 'MSWin32' ) {
         for my $pgm ( $self->program->ls_accessors ) {
-            $self->program->$pgm(
-                Win32::GetShortPathName( $self->program->$pgm )
-            ) if $self->program->$pgm and $self->program->$pgm =~ /\s+/;      
+            my $path = $self->program->$pgm;
+
+            ### paths with whitespace needs to be shortened
+            ### for shell outs.
+            if ($path and $path =~ /\s+/) {
+                my($prog, $args);
+
+                ### patch from Steve Hay, 13nd of June 2007
+                ### msg-id: <467012A4.6060705@uk.radan.com>
+                ### windows directories are not allowed to end with 
+                ### a space, so any occurrence of '\w\s+/\w+' means
+                ### we're dealing with arguments, not directory
+                ### names.
+                if ($path =~ /^(.*?)(\s+\/.*$)/) {
+                    ($prog, $args) = ($1, $2);
+                
+                ### otherwise, there are no arguments
+                } else {
+                    ($prog, $args) = ($path, '');
+                }
+                
+                $prog = Win32::GetShortPathName( $prog );
+                $self->program->$pgm( $prog . $args );
+            }
         }
     }