Shortest path to a MyConfig

[email protected] (Tyler MacDonald)
Newsgroups perl.cpan.discuss
Message-ID <[email protected]>
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
myconfig.patch (text/plain, 1.7 KB)
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: $!");
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.