After a bit of poking around in the source of CPAN.pm, the shortest
bootstrap of a user's home directory that ignores the system-wide CPAN
config I found was:

perl -MFile::Path -MCPAN::Config -MCPAN::FirstTime -e '
        $CPAN::Config = {}; mkpath("$ENV{HOME}/.cpan/CPAN");
        CPAN::FirstTime::init("$ENV{HOME}/.cpan/CPAN/MyConfig.pm",
        autoconfig => "yes")
'

I've attached a patch that makes it so that CPAN.pm has a new function,
"userconfig", and when the current user does not have permission to create
their lockfile, *and* they don't have a MyConfig.pm yet, they are given the
opportunity to create their own CPAN config, using all of the system-wide
defaults *except* paths where CPAN does it's work. Let me know what you
think.

        Cheers,
                Tyler

diff -dur CPAN-1.83_59.orig/lib/CPAN.pm CPAN-1.83_59/lib/CPAN.pm
--- CPAN-1.83_59.orig/lib/CPAN.pm       2006-01-29 13:46:58.000000000 -0800
+++ CPAN-1.83_59/lib/CPAN.pm    2006-01-29 14:10:04.000000000 -0800
@@ -54,7 +54,7 @@
 @EXPORT = qw(
             autobundle bundle expand force notest get cvs_import
             install make readme recompile shell test clean
-             perldoc recent
+             perldoc recent userconfig
            );
 
 sub soft_chdir_with_alternatives ($);
@@ -238,6 +238,27 @@
         }
     }
 }
+
+#-> sub CPAN::userconfig ;
+sub userconfig {
+    my($cpanpm, %args) = @_;
+    require CPAN::FirstTime;
+    $cpanpm = $INC{'CPAN/MyConfig.pm'} || "$ENV{HOME}/.cpan/CPAN/MyConfig.pm";
+    File::Path::mkpath(File::Basename::dirname($cpanpm)) unless -e $cpanpm;
+    if(!$INC{'CPAN/Config.pm'}) {
+        eval { require CPAN::Config; };
+    }
+    $CPAN::Config ||= {};
+    $CPAN::Config = {
+        %$CPAN::Config,
+        build_dir           =>  undef,
+        cpan_home           =>  undef,
+        keep_source_where   =>  undef,
+        histfile            =>  undef,
+    };
+    CPAN::FirstTime::init($cpanpm, %args);
+}
+
 package CPAN::CacheMgr;
 use strict;
 @CPAN::CacheMgr::ISA = qw(CPAN::InfoObj CPAN);
@@ -675,8 +696,15 @@
     $incc
 or
     $myincc
-
 });
+        if(!$INC{'CPAN/MyConfig.pm'}) {
+            $CPAN::Frontend->myprint("You don't seem to have a user 
configuration (MyConfig.pm) yet.\n");
+            my $new = ExtUtils::MakeMaker::prompt("Do you want to create a 
user configuration now?", "yes");
+            if($new =~ m{^y}i) {
+                CPAN::userconfig();
+                return &checklock;
+            }
+        }
        }
        $CPAN::Frontend->mydie("Could not open >$lockfile: $!");
     }

Reply via email to