1 package CPANPLUS::Module;
9 use CPANPLUS::Module::Signature;
10 use CPANPLUS::Module::Checksums;
11 use CPANPLUS::Internals::Constants;
15 use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
16 use IPC::Cmd qw[can_run run];
17 use File::Find qw[find];
18 use Params::Check qw[check];
19 use File::Basename qw[dirname];
20 use Module::Load::Conditional qw[can_load check_install];
22 $Params::Check::VERBOSE = 1;
24 @ISA = qw[ CPANPLUS::Module::Signature CPANPLUS::Module::Checksums];
34 ### get a module object from the CPANPLUS::Backend object
35 my $mod = $cb->module_tree('Some::Module');
49 C<CPANPLUS::Module> creates objects from the information in the
50 source files. These can then be used to query and perform actions
51 on, like fetching or installing.
53 These objects should only be created internally. For C<fake> objects,
54 there's the C<CPANPLUS::Module::Fake> class. To obtain a module object
55 consult the C<CPANPLUS::Backend> documentation.
60 module => { default => '', required => 1 }, # full module name
61 version => { default => '0.0' }, # version number
62 path => { default => '', required => 1 }, # extended path on the
64 # /author/id/K/KA/KANE
65 comment => { default => ''}, # comment on module
66 package => { default => '', required => 1 }, # package name, like
68 description => { default => '' }, # description of the
70 dslip => { default => EMPTY_DSLIP }, # dslip information
71 _id => { required => 1 }, # id of the Internals
73 _status => { no_override => 1 }, # stores status object
74 author => { default => '', required => 1,
75 allow => IS_AUTHOBJ }, # module author
76 mtime => { default => '' },
79 ### some of these will be resolved by wrapper functions that
80 ### do Clever Things to find the actual value, so don't create
81 ### an autogenerated sub for that just here, take an alternate
82 ### name to allow for a wrapper
87 ### autogenerate accessors ###
88 for my $key ( keys %$tmpl ) {
91 my $sub = $rename{$key} || $key;
93 *{__PACKAGE__."::$sub"} = sub {
94 $_[0]->{$key} = $_[1] if @_ > 1;
107 Returns a list of all accessor methods to the object
111 ### *name is an alias, include it explicitly
112 sub accessors { return ('name', keys %$tmpl) };
116 An objects of this class has the following accessors:
130 Version of the module. Defaults to '0.0' if none was provided.
134 Extended path on the mirror.
138 Any comment about the module -- largely unused.
142 The name of the package.
146 Description of the module -- only registered modules have this.
150 The five character dslip string, that represents meta-data of the
151 module -- again, only registered modules have this.
158 ### if this module has relevant dslip info, return it
159 return $self->_dslip if $self->_dslip ne EMPTY_DSLIP;
161 ### if not, look at other modules in the same package,
162 ### see if *they* have any dslip info
163 for my $mod ( $self->contains ) {
164 return $mod->_dslip if $mod->_dslip ne EMPTY_DSLIP;
167 ### ok, really no dslip info found, return the default
176 The C<CPANPLUS::Module::Status> object associated with this object.
181 The C<CPANPLUS::Module::Author> object associated with this object.
185 The C<CPANPLUS::Internals> object that spawned this module object.
191 ### Alias ->name to ->module, for human beings.
196 my $obj = CPANPLUS::Internals->_retrieve_id( $self->_id );
201 =head1 STATUS ACCESSORS
203 C<CPANPLUS> caches a lot of results from method calls and saves data
204 it collected along the road for later reuse.
206 C<CPANPLUS> uses this internally, but it is also available for the end
207 user. You can get a status object by calling:
211 You can then query the object as follows:
217 The installer type used for this distribution. Will be one of
218 'makemaker' or 'build'. This determines whether C<CPANPLUS::Dist::MM>
219 or C<CPANPLUS::Dist::Build> will be used to build this distribution.
223 The dist object used to do the CPAN-side of the installation. Either
224 a C<CPANPLUS::Dist::MM> or C<CPANPLUS::Dist::Build> object.
228 The custom dist object used to do the operating specific side of the
229 installation, if you've chosen to use this. For example, if you've
230 chosen to install using the C<ports> format, this may be a
231 C<CPANPLUS::Dist::Ports> object.
233 Undefined if you didn't specify a separate format to install through.
235 =item prereqs | requires
237 A hashref of prereqs this distribution was found to have. Will look
240 { Carp => 0.01, strict => 0 }
242 Might be undefined if the distribution didn't have any prerequisites.
244 =item configure_requires
246 Like prereqs, but these are necessary to be installed before the
247 build process can even begin.
251 Flag indicating, if a signature check was done, whether it was OK or
256 The directory this distribution was extracted to.
260 The location this distribution was fetched to.
264 The text of this distributions README file.
268 Flag indicating if an uninstall call was done successfully.
272 Flag indicating if the C<create> call to your dist object was done
277 Flag indicating if the C<install> call to your dist object was done
282 The location of this distributions CHECKSUMS file.
286 Flag indicating if the checksums check was done successfully.
290 The checksum value this distribution is expected to have
296 =head2 $self = CPANPLUS::Module->new( OPTIONS )
298 This method returns a C<CPANPLUS::Module> object. Normal users
299 should never call this method directly, but instead use the
300 C<CPANPLUS::Backend> to obtain module objects.
302 This example illustrates a C<new()> call with all required arguments:
304 CPANPLUS::Module->new(
306 path => 'authors/id/A/AA/AAA',
307 package => 'Foo-1.0.tgz',
308 author => $author_object,
309 _id => INTERNALS_OBJECT_ID,
312 Every accessor is also a valid option to pass to C<new>.
314 Returns a module object on success and false on failure.
320 my($class, %hash) = @_;
322 ### don't check the template for sanity
323 ### -- we know it's good and saves a lot of performance
324 local $Params::Check::SANITY_CHECK_TEMPLATE = 0;
326 my $object = check( $tmpl, \%hash ) or return;
328 bless $object, $class;
333 ### only create status objects when they're actually asked for
336 return $self->_status if $self->_status;
338 my $acc = Object::Accessor->new;
339 $acc->mk_accessors( qw[ installer_type dist_cpan dist prereqs
340 signature extract fetch readme uninstall
341 created installed prepared checksums files
342 checksum_ok checksum_value _fetch_from
346 ### create an alias from 'requires' to 'prereqs', so it's more in
347 ### line with 'configure_requires';
348 $acc->mk_aliases( requires => 'prereqs' );
350 $self->_status( $acc );
352 return $self->_status;
356 ### flush the cache of this object ###
359 $self->status->mk_flush;
363 =head2 $mod->package_name( [$package_string] )
365 Returns the name of the package a module is in. For C<Acme::Bleach>
366 that might be C<Acme-Bleach>.
368 =head2 $mod->package_version( [$package_string] )
370 Returns the version of the package a module is in. For a module
371 in the package C<Acme-Bleach-1.1.tar.gz> this would be C<1.1>.
373 =head2 $mod->package_extension( [$package_string] )
375 Returns the suffix added by the compression method of a package a
376 certain module is in. For a module in C<Acme-Bleach-1.1.tar.gz>, this
379 =head2 $mod->package_is_perl_core
381 Returns a boolean indicating of the package a particular module is in,
382 is actually a core perl distribution.
384 =head2 $mod->module_is_supplied_with_perl_core( [version => $]] )
386 Returns a boolean indicating whether C<ANY VERSION> of this module
387 was supplied with the current running perl's core package.
389 =head2 $mod->is_bundle
391 Returns a boolean indicating if the module you are looking at, is
392 actually a bundle. Bundles are identified as modules whose name starts
395 =head2 $mod->is_autobundle;
397 Returns a boolean indicating if the module you are looking at, is
398 actually an autobundle as generated by C<< $cb->autobundle >>.
400 =head2 $mod->is_third_party
402 Returns a boolean indicating whether the package is a known third-party
403 module (i.e. it's not provided by the standard Perl distribution and
404 is not available on the CPAN, but on a third party software provider).
405 See L<Module::ThirdParty> for more details.
407 =head2 $mod->third_party_information
409 Returns a reference to a hash with more information about a third-party
410 module. See the documentation about C<module_information()> in
411 L<Module::ThirdParty> for more details.
415 { ### fetches the test reports for a certain module ###
422 while ( my($type, $index) = each %map ) {
423 my $name = 'package_' . $type;
428 my $val = shift || $self->package;
429 my @res = $self->parent->_split_package_string( package => $val );
431 ### return the corresponding index from the result
432 return $res[$index] if @res;
437 sub package_is_perl_core {
440 ### check if the package looks like a perl core package
441 return 1 if $self->package_name eq PERL_CORE;
443 my $core = $self->module_is_supplied_with_perl_core;
444 ### ok, so it's found in the core, BUT it could be dual-lifed
446 ### if the package is newer than installed, then it's dual-lifed
447 return if $self->version > $self->installed_version;
449 ### if the package is newer or equal to the corelist,
450 ### then it's dual-lifed
451 return if $self->version >= $core;
453 ### otherwise, it's older than corelist, thus unsuitable.
457 ### not in corelist, not a perl core package.
461 sub module_is_supplied_with_perl_core {
463 my $ver = shift || $];
465 ### allow it to be called as a package function as well like:
466 ### CPANPLUS::Module::module_is_supplied_with_perl_core('Config')
467 ### so that we can check the status of modules that aren't released
468 ### to CPAN, but are part of the core.
469 my $name = ref $self ? $self->module : $self;
471 ### check Module::CoreList to see if it's a core package
472 require Module::CoreList;
474 ### Address #41157: Module::module_is_supplied_with_perl_core()
475 ### broken for perl 5.10: Module::CoreList's version key for the
476 ### hash has a different number of trailing zero than $] aka
478 my $core = $Module::CoreList::version{ 0+$ver }->{ $name };
483 ### make sure Bundle-Foo also gets flagged as bundle
488 return 1 if $self->module =~ /^bundle(?:-|::)/i;
491 return 1 if $self->is_autobundle;
497 ### full path to a generated autobundle
500 my $conf = $self->parent->configure_object;
501 my $prefix = $conf->_get_build('autobundle_prefix');
503 return 1 if $self->module eq $prefix;
510 return unless can_load( modules => { 'Module::ThirdParty' => 0 } );
512 return Module::ThirdParty::is_3rd_party( $self->name );
515 sub third_party_information {
518 return unless $self->is_third_party;
520 return Module::ThirdParty::module_information( $self->name );
526 =head2 $clone = $self->clone
528 Clones the current module object for tinkering with.
529 It will have a clean C<CPANPLUS::Module::Status> object, as well as
530 a fake C<CPANPLUS::Module::Author> object.
534 { ### accessors dont change during run time, so only compute once
535 my @acc = grep !/status/, __PACKAGE__->accessors();
540 ### clone the object ###
541 my %data = map { $_ => $self->$_ } @acc;
543 my $obj = CPANPLUS::Module::Fake->new( %data );
551 =head2 $where = $self->fetch
553 Fetches the module from a CPAN mirror.
554 Look at L<CPANPLUS::Internals::Fetch::_fetch()> for details on the
555 options you can pass.
561 my $cb = $self->parent;
564 my %args = ( module => $self );
566 ### if a custom fetch location got specified before, add that here
567 $args{fetch_from} = $self->status->_fetch_from
568 if $self->status->_fetch_from;
570 my $where = $cb->_fetch( @_, %args ) or return;
572 ### do an md5 check ###
573 if( !$self->status->_fetch_from and
574 $cb->configure_object->get_conf('md5') and
575 $self->package ne CHECKSUMS
577 unless( $self->_validate_checksum ) {
578 error( loc( "Checksum error for '%1' -- will not trust package",
589 =head2 $path = $self->extract
591 Extracts the fetched module.
592 Look at L<CPANPLUS::Internals::Extract::_extract()> for details on
593 the options you can pass.
599 my $cb = $self->parent;
601 unless( $self->status->fetch ) {
602 error( loc( "You have not fetched '%1' yet -- cannot extract",
607 ### can't extract these, so just use the basedir for the file
608 if( $self->is_autobundle ) {
610 ### this is expected to be set after an extract call
611 $self->get_installer_type;
613 return $self->status->extract( dirname( $self->status->fetch ) );
616 return $cb->_extract( @_, module => $self );
619 =head2 $type = $self->get_installer_type([prefer_makefile => BOOL])
621 Gets the installer type for this module. This may either be C<build> or
622 C<makemaker>. If C<Module::Build> is unavailable or no installer type
623 is available, it will fall back to C<makemaker>. If both are available,
624 it will pick the one indicated by your config, or by the
625 C<prefer_makefile> option you can pass to this function.
627 Returns the installer type on success, and false on error.
631 sub get_installer_type {
633 my $cb = $self->parent;
634 my $conf = $cb->configure_object;
637 my ($prefer_makefile,$verbose);
639 prefer_makefile => { default => $conf->get_conf('prefer_makefile'),
640 store => \$prefer_makefile, allow => BOOLEANS },
641 verbose => { default => $conf->get_conf('verbose'),
642 store => \$verbose },
645 check( $tmpl, \%hash ) or return;
649 ### autobundles use their own installer, so return that
650 if( $self->is_autobundle ) {
651 $type = INSTALLER_AUTOBUNDLE;
654 my $extract = $self->status->extract();
657 "Cannot determine installer type of unextracted module '%1'",
663 ### check if it's a makemaker or a module::build type dist ###
664 my $found_build = -e BUILD_PL->( $extract );
665 my $found_makefile = -e MAKEFILE_PL->( $extract );
667 $type = INSTALLER_BUILD if !$prefer_makefile && $found_build;
668 $type = INSTALLER_BUILD if $found_build && !$found_makefile;
669 $type = INSTALLER_MM if $prefer_makefile && $found_makefile;
670 $type = INSTALLER_MM if $found_makefile && !$found_build;
673 ### ok, so it's a 'build' installer, but you don't /have/ module build
674 if( $type eq INSTALLER_BUILD and
675 not CPANPLUS::Dist->has_dist_type( INSTALLER_BUILD )
678 ### XXX this is for recording purposes only. We *have* to install
679 ### these before even creating a dist object, or we'll get an error
680 ### saying 'no such dist type';
681 my $href = $self->status->configure_requires || {};
682 my $deps = { INSTALLER_BUILD, 0, %$href };
684 $self->status->configure_requires( $deps );
686 msg(loc("This module requires '%1' and '%2' to be installed first. ".
687 "Adding these modules to your prerequisites list",
688 'Module::Build', INSTALLER_BUILD
692 ### ok, actually we found neither ###
694 error( loc( "Unable to find '%1' or '%2' for '%3'; ".
695 "Will default to '%4' but might be unable ".
696 "to install!", BUILD_PL->(), MAKEFILE_PL->(),
697 $self->module, INSTALLER_MM ) );
698 $type = INSTALLER_MM;
701 return $self->status->installer_type( $type ) if $type;
707 =head2 $dist = $self->dist([target => 'prepare|create', format => DISTRIBUTION_TYPE, args => {key => val}]);
709 Create a distribution object, ready to be installed.
710 Distribution type defaults to your config settings
712 The optional C<args> hashref is passed on to the specific distribution
713 types' C<create> method after being dereferenced.
715 Returns a distribution object on success, false on failure.
717 See C<CPANPLUS::Dist> for details.
723 my $cb = $self->parent;
724 my $conf = $cb->configure_object;
727 ### have you determined your installer type yet? if not, do it here,
729 $self->get_installer_type unless $self->status->installer_type;
731 my($type,$args,$target);
733 format => { default => $conf->get_conf('dist_type') ||
734 $self->status->installer_type,
736 target => { default => TARGET_CREATE, store => \$target },
737 args => { default => {}, store => \$args },
740 check( $tmpl, \%hash ) or return;
742 ### ok, check for $type. Do we have it?
743 unless( CPANPLUS::Dist->has_dist_type( $type ) ) {
745 ### ok, we don't have it. Is it C::D::Build? if so we can install the
747 ### XXX we _could_ do this for any type we dont have actually...
748 if( $type eq INSTALLER_BUILD ) {
749 msg(loc("Bootstrapping installer '%1'", $type));
751 ### don't propagate the format, it's the one we're trying to
752 ### bootstrap, so it'll be an infinite loop if we do
754 $cb->module_tree( $type )->install( target => $target, %$args ) or
756 error(loc("Could not bootstrap installer '%1' -- ".
757 "can not continue", $type));
761 ### re-scan for available modules now
762 CPANPLUS::Dist->rescan_dist_types;
764 unless( CPANPLUS::Dist->has_dist_type( $type ) ) {
765 error(loc("Newly installed installer type '%1' should be ".
766 "available, but is not! -- aborting", $type));
769 msg(loc("Installer '%1' succesfully bootstrapped", $type));
772 ### some other plugin you dont have. Abort
774 error(loc("Installer type '%1' not found. Please verify your ".
775 "installation -- aborting", $type ));
780 my $dist = $type->new( module => $self ) or return;
782 my $dist_cpan = $type eq $self->status->installer_type
784 : $self->status->installer_type->new( module => $self );
787 $self->status->dist_cpan( $dist_cpan );
788 $self->status->dist( $dist );
791 ### first prepare the dist
792 $dist->prepare( %$args ) or return;
793 $self->status->prepared(1);
795 ### you just wanted us to prepare?
796 last DIST if $target eq TARGET_PREPARE;
798 $dist->create( %$args ) or return;
799 $self->status->created(1);
807 =head2 $bool = $mod->prepare( )
809 Convenience method around C<install()> that prepares a module
810 without actually building it. This is equivalent to invoking C<install>
811 with C<target> set to C<prepare>
813 Returns true on success, false on failure.
819 return $self->install( @_, target => TARGET_PREPARE );
822 =head2 $bool = $mod->create( )
824 Convenience method around C<install()> that creates a module.
825 This is equivalent to invoking C<install> with C<target> set to
828 Returns true on success, false on failure.
834 return $self->install( @_, target => TARGET_CREATE );
837 =head2 $bool = $mod->test( )
839 Convenience wrapper around C<install()> that tests a module, without
841 It's the equivalent to invoking C<install()> with C<target> set to
842 C<create> and C<skiptest> set to C<0>.
844 Returns true on success, false on failure.
850 return $self->install( @_, target => TARGET_CREATE, skiptest => 0 );
855 =head2 $bool = $self->install([ target => 'prepare|create|install', format => FORMAT_TYPE, extractdir => DIRECTORY, fetchdir => DIRECTORY, prefer_bin => BOOL, force => BOOL, verbose => BOOL, ..... ]);
857 Installs the current module. This includes fetching it and extracting
858 it, if this hasn't been done yet, as well as creating a distribution
861 This means you can pass it more arguments than described above, which
862 will be passed on to the relevant methods as they are called.
864 See C<CPANPLUS::Internals::Fetch>, C<CPANPLUS::Internals::Extract> and
865 C<CPANPLUS::Dist> for details.
867 Returns true on success, false on failure.
873 my $cb = $self->parent;
874 my $conf = $cb->configure_object;
877 my $args; my $target; my $format;
878 { ### so we can use the rest of the args to the create calls etc ###
879 local $Params::Check::NO_DUPLICATES = 1;
880 local $Params::Check::ALLOW_UNKNOWN = 1;
882 ### targets 'dist' and 'test' are now completely ignored ###
884 ### match this allow list with Dist->_resolve_prereqs
885 target => { default => TARGET_INSTALL, store => \$target,
886 allow => [TARGET_PREPARE, TARGET_CREATE,
888 force => { default => $conf->get_conf('force'), },
889 verbose => { default => $conf->get_conf('verbose'), },
890 format => { default => $conf->get_conf('dist_type'),
894 $args = check( $tmpl, \%hash ) or return;
898 ### if this target isn't 'install', we will need to at least 'create'
899 ### every prereq, so it can build
900 ### XXX prereq_target of 'prepare' will do weird things here, and is
902 $args->{'prereq_target'} ||= TARGET_CREATE if $target ne TARGET_INSTALL;
904 ### check if it's already upto date ###
905 if( $target eq TARGET_INSTALL and !$args->{'force'} and
906 !$self->package_is_perl_core() and # separate rules apply
907 ( $self->status->installed() or $self->is_uptodate ) and
908 !INSTALL_VIA_PACKAGE_MANAGER->($format)
910 msg(loc("Module '%1' already up to date, won't install without force",
911 $self->module), $args->{'verbose'} );
912 return $self->status->installed(1);
915 # if it's a non-installable core package, abort the install.
916 if( $self->package_is_perl_core() ) {
917 # if the installed is newer, say so.
918 if( $self->installed_version > $self->version ) {
919 error(loc("The core Perl %1 module '%2' (%3) is more ".
920 "recent than the latest release on CPAN (%4). ".
922 $], $self->module, $self->installed_version,
924 # if the installed matches, say so.
925 } elsif( $self->installed_version == $self->version ) {
926 error(loc("The core Perl %1 module '%2' (%3) can only ".
927 "be installed by Perl itself. ".
929 $], $self->module, $self->installed_version ) );
930 # otherwise, the installed is older; say so.
932 error(loc("The core Perl %1 module '%2' can only be ".
933 "upgraded from %3 to %4 by Perl itself (%5). ".
935 $], $self->module, $self->installed_version,
936 $self->version, $self->package ) );
940 ### it might be a known 3rd party module
941 } elsif ( $self->is_third_party ) {
942 my $info = $self->third_party_information;
944 "%1 is a known third-party module.\n\n".
945 "As it isn't available on the CPAN, CPANPLUS can't install " .
946 "it automatically. Therefore you need to install it manually " .
947 "before proceeding.\n\n".
948 "%2 is part of %3, published by %4, and should be available ".
949 "for download at the following address:\n\t%5",
950 $self->name, $self->name, $info->{name}, $info->{author},
957 ### fetch it if need be ###
958 unless( $self->status->fetch ) {
960 for (qw[prefer_bin fetchdir]) {
961 $params->{$_} = $args->{$_} if exists $args->{$_};
963 for (qw[force verbose]) {
964 $params->{$_} = $args->{$_} if defined $args->{$_};
966 $self->fetch( %$params ) or return;
969 ### extract it if need be ###
970 unless( $self->status->extract ) {
972 for (qw[prefer_bin extractdir]) {
973 $params->{$_} = $args->{$_} if exists $args->{$_};
975 for (qw[force verbose]) {
976 $params->{$_} = $args->{$_} if defined $args->{$_};
978 $self->extract( %$params ) or return;
981 $format ||= $self->status->installer_type;
984 error( loc( "Don't know what installer to use; " .
985 "Couldn't find either '%1' or '%2' in the extraction " .
986 "directory '%3' -- will be unable to install",
987 BUILD_PL->(), MAKEFILE_PL->(), $self->status->extract ) );
989 $self->status->installed(0);
994 ### do SIGNATURE checks? ###
995 if( $conf->get_conf('signature') ) {
996 unless( $self->check_signature( verbose => $args->{verbose} ) ) {
997 error( loc( "Signature check failed for module '%1' ".
998 "-- Not trusting this module, aborting install",
1000 $self->status->signature(0);
1002 ### send out test report on broken sig
1003 if( $conf->get_conf('cpantest') ) {
1007 buffer => CPANPLUS::Error->stack_as_string,
1008 verbose => $args->{verbose},
1009 force => $args->{force},
1010 ) or error(loc("Failed to send test report for '%1'",
1017 ### signature OK ###
1018 $self->status->signature(1);
1022 ### a target of 'create' basically means not to run make test ###
1023 ### eh, no it /doesn't/.. skiptest => 1 means skiptest => 1.
1024 #$args->{'skiptest'} = 1 if $target eq 'create';
1026 ### bundle rules apply ###
1027 if( $self->is_bundle ) {
1028 ### check what we need to install ###
1029 my @prereqs = $self->bundle_modules();
1030 unless( @prereqs ) {
1031 error( loc( "Bundle '%1' does not specify any modules to install",
1034 ### XXX mark an error here? ###
1038 my $dist = $self->dist( format => $format,
1042 error( loc( "Unable to create a new distribution object for '%1' " .
1043 "-- cannot continue", $self->module ) );
1047 return 1 if $target ne TARGET_INSTALL;
1049 my $ok = $dist->install( %$args ) ? 1 : 0;
1051 $self->status->installed($ok);
1057 =pod @list = $self->bundle_modules()
1059 Returns a list of module objects the Bundle specifies.
1061 This requires you to have extracted the bundle already, using the
1062 C<extract()> method.
1064 Returns false on error.
1068 sub bundle_modules {
1070 my $cb = $self->parent;
1072 unless( $self->is_bundle ) {
1073 error( loc("'%1' is not a bundle", $self->module ) );
1079 ### autobundles are special files generated by CPANPLUS. If we can
1080 ### read the file, we can determine the prereqs
1081 if( $self->is_autobundle ) {
1083 unless( $where = $self->status->fetch ) {
1084 error(loc("Don't know where '%1' was fetched to", $self->package));
1090 ### regular bundle::* upload
1093 unless( $dir = $self->status->extract ) {
1094 error(loc("Don't know where '%1' was extracted to", $self->module));
1099 wanted => sub { push @files, File::Spec->rel2abs($_) if /\.pm/i },
1104 my $prereqs = {}; my @list; my $seen = {};
1105 for my $file ( @files ) {
1106 my $fh = FileHandle->new($file)
1107 or( error(loc("Could not open '%1' for reading: %2",
1111 while( local $_ = <$fh> ) {
1112 ### quick hack to read past the header of the file ###
1113 last if $flag && m|^=head|i;
1115 ### from perldoc cpan:
1117 ### In this pod section each line obeys the format
1118 ### Module_Name [Version_String] [- optional text]
1119 $flag = 1 if m|^=head1 CONTENTS|i;
1121 if ($flag && /^(?!=)(\S+)\s*(\S+)?/) {
1123 my $version = $cb->_version_to_number( version => $2 );
1125 my $obj = $cb->module_tree($module);
1128 error(loc("Cannot find bundled module '%1'", $module),
1129 loc("-- it does not seem to exist") );
1133 ### make sure we list no duplicates ###
1134 unless( $seen->{ $obj->module }++ ) {
1136 $prereqs->{ $module } =
1137 $cb->_version_to_number( version => $version );
1143 ### store the prereqs we just found ###
1144 $self->status->prereqs( $prereqs );
1151 =head2 $text = $self->readme
1153 Fetches the readme belonging to this module and stores it under
1154 C<< $obj->status->readme >>. Returns the readme as a string on
1155 success and returns false on failure.
1161 my $conf = $self->parent->configure_object;
1163 ### did we already dl the readme once? ###
1164 return $self->status->readme() if $self->status->readme();
1166 ### this should be core ###
1167 return unless can_load( modules => { FileHandle => '0.0' },
1171 ### get a clone of the current object, with a fresh status ###
1172 my $obj = $self->clone or return;
1174 ### munge the package name
1175 my $pkg = README->( $obj );
1176 $obj->package($pkg);
1179 { ### disable checksum fetches on readme downloads
1181 my $tmp = $conf->get_conf( 'md5' );
1182 $conf->set_conf( md5 => 0 );
1184 $file = $obj->fetch;
1186 $conf->set_conf( md5 => $tmp );
1188 return unless $file;
1191 ### read the file into a scalar, to store in the original object ###
1192 my $fh = new FileHandle;
1193 unless( $fh->open($file) ) {
1194 error( loc( "Could not open file '%1': %2", $file, $! ) );
1198 my $in = do{ local $/; <$fh> };
1201 return $self->status->readme( $in );
1206 =head2 $version = $self->installed_version()
1208 Returns the currently installed version of this module, if any.
1210 =head2 $where = $self->installed_file()
1212 Returns the location of the currently installed file of this module,
1215 =head2 $dir = $self->installed_dir()
1217 Returns the directory (or more accurately, the C<@INC> handle) from
1218 which this module was loaded, if any.
1220 =head2 $bool = $self->is_uptodate([version => VERSION_NUMBER])
1222 Returns a boolean indicating if this module is uptodate or not.
1226 ### uptodate/installed functions
1227 { my $map = { # hashkey, alternate rv
1228 installed_version => ['version', 0 ],
1229 installed_file => ['file', ''],
1230 installed_dir => ['dir', ''],
1231 is_uptodate => ['uptodate', 0 ],
1234 while( my($method, $aref) = each %$map ) {
1235 my($key,$alt_rv) = @$aref;
1239 ### never use the @INC hooks to find installed versions of
1240 ### modules -- they're just there in case they're not on the
1241 ### perl install, but the user shouldn't trust them for *other*
1243 ### XXX CPANPLUS::inc is now obsolete, so this should not
1244 ### be needed anymore
1245 #local @INC = CPANPLUS::inc->original_inc;
1249 ### make sure check_install is not looking in %INC, as
1250 ### that may contain some of our sneakily loaded modules
1251 ### that aren't installed as such. -- kane
1252 local $Module::Load::Conditional::CHECK_INC_HASH = 0;
1253 my $href = check_install(
1254 module => $self->module,
1255 version => $self->version,
1259 return $href->{$key} || $alt_rv;
1268 =head2 $href = $self->details()
1270 Returns a hashref with key/value pairs offering more information about
1271 a particular module. For example, for C<Time::HiRes> it might look like
1274 Author Jarkko Hietaniemi (jhi@iki.fi)
1275 Description High resolution time, sleep, and alarm
1276 Development Stage Released
1277 Installed File /usr/local/perl/lib/Time/Hires.pm
1278 Interface Style plain Functions, no references used
1279 Language Used C and perl, a C compiler will be needed
1280 Package Time-HiRes-1.65.tar.gz
1281 Public License Unknown
1282 Support Level Developer
1283 Version Installed 1.52
1284 Version on CPAN 1.65
1290 my $conf = $self->parent->configure_object();
1291 my $cb = $self->parent;
1295 Author => loc("%1 (%2)", $self->author->author(),
1296 $self->author->email() ),
1297 Package => $self->package,
1298 Description => $self->description || loc('None given'),
1299 'Version on CPAN' => $self->version,
1302 ### check if we have the module installed
1303 ### if so, add version have and version on cpan
1304 $res->{'Version Installed'} = $self->installed_version
1305 if $self->installed_version;
1306 $res->{'Installed File'} = $self->installed_file if $self->installed_file;
1309 for my $item( split '', $self->dslip ) {
1310 $res->{ $cb->_dslip_defs->[$i]->[0] } =
1311 $cb->_dslip_defs->[$i]->[1]->{$item} || loc('Unknown');
1318 =head2 @list = $self->contains()
1320 Returns a list of module objects that represent the modules also
1321 present in the package of this module.
1323 For example, for C<Archive::Tar> this might return:
1326 Archive::Tar::Constant
1333 my $cb = $self->parent;
1334 my $pkg = $self->package;
1336 my @mods = $cb->search( type => 'package', allow => [qr/^$pkg$/] );
1343 =head2 @list_of_hrefs = $self->fetch_report()
1345 This function queries the CPAN testers database at
1346 I<http://testers.cpan.org/> for test results of specified module
1347 objects, module names or distributions.
1349 Look at L<CPANPLUS::Internals::Report::_query_report()> for details on
1350 the options you can pass and the return value to expect.
1356 my $cb = $self->parent;
1358 return $cb->_query_report( @_, module => $self );
1363 =head2 $bool = $self->uninstall([type => [all|man|prog])
1365 This function uninstalls the specified module object.
1367 You can install 2 types of files, either C<man> pages or C<prog>ram
1368 files. Alternately you can specify C<all> to uninstall both (which
1371 Returns true on success and false on failure.
1373 Do note that this does an uninstall via the so-called C<.packlist>,
1374 so if you used a module installer like say, C<ports> or C<apt>, you
1375 should not use this, but use your package manager instead.
1381 my $conf = $self->parent->configure_object();
1384 my ($type,$verbose);
1386 type => { default => 'all', allow => [qw|man prog all|],
1388 verbose => { default => $conf->get_conf('verbose'),
1389 store => \$verbose },
1390 force => { default => $conf->get_conf('force') },
1393 ### XXX add a warning here if your default install dist isn't
1394 ### makefile or build -- that means you are using a package manager
1395 ### and this will not do what you think!
1397 my $args = check( $tmpl, \%hash ) or return;
1399 if( $conf->get_conf('dist_type') and (
1400 ($conf->get_conf('dist_type') ne INSTALLER_BUILD) or
1401 ($conf->get_conf('dist_type') ne INSTALLER_MM))
1403 msg(loc("You have a default installer type set (%1) ".
1404 "-- you should probably use that package manager to " .
1405 "uninstall modules", $conf->get_conf('dist_type')), $verbose);
1408 ### check if we even have the module installed -- no point in continuing
1410 unless( $self->installed_version ) {
1411 error( loc( "Module '%1' is not installed, so cannot uninstall",
1416 ### nothing to uninstall ###
1417 my $files = $self->files( type => $type ) or return;
1418 my $dirs = $self->directory_tree( type => $type ) or return;
1419 my $sudo = $conf->get_program('sudo');
1421 ### just in case there's no file; M::B doensn't provide .packlists yet ###
1422 my $pack = $self->packlist;
1423 $pack = $pack->[0]->packlist_file() if $pack;
1425 ### first remove the files, then the dirs if they are empty ###
1427 for my $file( @$files, $pack ) {
1428 next unless defined $file && -f $file;
1430 msg(loc("Unlinking '%1'", $file), $verbose);
1432 my @cmd = ($^X, "-eunlink+q[$file]");
1433 unshift @cmd, $sudo if $sudo;
1436 unless ( run( command => \@cmd,
1437 verbose => $verbose,
1438 buffer => \$buffer )
1440 error(loc("Failed to unlink '%1': '%2'",$file, $buffer));
1445 for my $dir ( sort @$dirs ) {
1447 opendir DIR, $dir or next;
1448 my @count = readdir(DIR);
1451 next unless @count == 2; # . and ..
1453 msg(loc("Removing '%1'", $dir), $verbose);
1455 ### this fails on my win2k machines.. it indeed leaves the
1456 ### dir, but it's not a critical error, since the files have
1457 ### been removed. --kane
1458 #unless( rmdir $dir ) {
1459 # error( loc( "Could not remove '%1': %2", $dir, $! ) )
1460 # unless $^O eq 'MSWin32';
1463 my @cmd = ($^X, "-e", "rmdir q[$dir]");
1464 unshift @cmd, $sudo if $sudo;
1467 unless ( run( command => \@cmd,
1468 verbose => $verbose,
1469 buffer => \$buffer )
1471 error(loc("Failed to rmdir '%1': %2",$dir,$buffer));
1476 $self->status->uninstall(!$flag);
1477 $self->status->installed( $flag ? 1 : undef);
1484 =head2 @modobj = $self->distributions()
1486 Returns a list of module objects representing all releases for this
1487 module on success, false on failure.
1495 my @list = $self->author->distributions( %hash, module => $self ) or return;
1497 ### it's another release then by the same author ###
1498 return grep { $_->package_name eq $self->package_name } @list;
1503 =head2 @list = $self->files ()
1505 Returns a list of files used by this module, if it is installed.
1510 return shift->_extutils_installed( @_, method => 'files' );
1515 =head2 @list = $self->directory_tree ()
1517 Returns a list of directories used by this module.
1521 sub directory_tree {
1522 return shift->_extutils_installed( @_, method => 'directory_tree' );
1527 =head2 @list = $self->packlist ()
1529 Returns the C<ExtUtils::Packlist> object for this module.
1534 return shift->_extutils_installed( @_, method => 'packlist' );
1539 =head2 @list = $self->validate ()
1541 Returns a list of files that are missing for this modules, but
1542 are present in the .packlist file.
1547 return shift->_extutils_installed( method => 'validate' );
1550 ### generic method to call an ExtUtils::Installed method ###
1551 sub _extutils_installed {
1553 my $conf = $self->parent->configure_object();
1556 my ($verbose,$type,$method);
1558 verbose => { default => $conf->get_conf('verbose'),
1559 store => \$verbose, },
1560 type => { default => 'all',
1561 allow => [qw|prog man all|],
1563 method => { required => 1,
1565 allow => [qw|files directory_tree packlist
1570 my $args = check( $tmpl, \%hash ) or return;
1572 ### old versions of cygwin + perl < 5.8 are buggy here. bail out if we
1573 ### find we're being used by them
1574 { my $err = ON_OLD_CYGWIN;
1575 if($err) { error($err); return };
1578 return unless can_load(
1579 modules => { 'ExtUtils::Installed' => '0.0' },
1580 verbose => $verbose,
1583 ### search in your regular @INC, and anything you added to your config.
1584 ### this lets EU::Installed find .packlists that are *not* in the standard
1585 ### compiled in @INC path. Requires EU::I 1.42 or up. this addresses #33438
1586 ### make sure the archname path is also added, as that's where the .packlist
1587 ### files are written
1589 for my $lib ( @{ $conf->get_conf('lib') } ) {
1592 ### figure out what an MM prefix expands to. Basically, it's the
1593 ### site install target from %Config, ie: /opt/lib/perl5/site_perl/5.8.8
1594 ### minus the site wide prefix, ie: /opt
1595 ### this lets users add the dir they have set as their EU::MM PREFIX
1596 ### to our 'lib' config and it Just Works
1597 ### XXX is this the right thing to do?
1599 my $site = $Config::Config{sitelib};
1600 my $prefix = quotemeta $Config::Config{prefix};
1602 ### strip the prefix from the site dir
1603 $site =~ s/^$prefix//;
1605 File::Spec->catdir( $lib, $site ),
1606 File::Spec->catdir( $lib, $site, $Config::Config{'archname'} );
1609 ### the arch specific dir, ie:
1610 ### /opt/lib/perl5/site_perl/5.8.8/darwin-2level
1611 push @libs, File::Spec->catdir( $lib, $Config::Config{'archname'} );
1613 ### and just the standard dir
1618 unless( $inst = ExtUtils::Installed->new( extra_libs => \@libs ) ) {
1619 error( loc("Could not create an '%1' object", 'ExtUtils::Installed' ) );
1621 ### in case it's being used directly... ###
1626 { ### EU::Installed can die =/
1628 eval { @files = $inst->$method( $self->module, $type ) };
1632 error( loc("Could not get '%1' for '%2': %3",
1633 $method, $self->module, $@ ) );
1637 return wantarray ? @files : \@files;
1641 =head2 $bool = $self->add_to_includepath;
1643 Adds the current modules path to C<@INC> and C<$PERL5LIB>. This allows
1644 you to add the module from its build dir to your path.
1646 You can reset C<@INC> and C<$PERL5LIB> to its original state when you
1647 started the program, by calling:
1649 $self->parent->flush('lib');
1653 sub add_to_includepath {
1655 my $cb = $self->parent;
1657 if( my $dir = $self->status->extract ) {
1659 $cb->_add_to_includepath(
1661 File::Spec->catdir(BLIB->($dir), LIB),
1662 File::Spec->catdir(BLIB->($dir), ARCH),
1668 error(loc( "No extract dir registered for '%1' -- can not add ".
1669 "add builddir to search path!", $self->module ));
1679 =head2 $path = $self->best_path_to_module_build();
1683 If a newer version of Module::Build is found in your path, it will
1684 return this C<special> path. If the newest version of C<Module::Build>
1685 is found in your regular C<@INC>, the method will return false. This
1686 indicates you do not need to add a special directory to your C<@INC>.
1688 Note that this is only relevant if you're building your own
1689 C<CPANPLUS::Dist::*> plugin -- the built-in dist types already have
1694 ### make sure we're always running 'perl Build.PL' and friends
1695 ### against the highest version of module::build available
1696 sub best_path_to_module_build {
1699 ### Since M::B will actually shell out and run the Build.PL, we must
1700 ### make sure it refinds the proper version of M::B in the path.
1701 ### that may be either in our cp::inc or in site_perl, or even a
1702 ### new M::B being installed.
1703 ### don't add anything else here, as that might screw up prereq checks
1705 ### XXX this might be needed for Dist::MM too, if a makefile.pl is
1706 ### masquerading as a Build.PL
1708 ### did we find the most recent module::build in our installer path?
1710 ### XXX can't do changes to @INC, they're being ignored by
1711 ### new_from_context when writing a Build script. see ticket:
1712 ### #8826 Module::Build ignores changes to @INC when writing Build
1713 ### from new_from_context
1714 ### XXX applied schwern's patches (as seen on CPANPLUS::Devel 10/12/04)
1715 ### and upped the version to 0.26061 of the bundled version, and things
1718 ### this functionality is now obsolete -- prereqs should be installed
1719 ### and we no longer use the CPANPLUS::inc magic.. so comment this out.
1720 # require Module::Build;
1721 # if( CPANPLUS::inc->path_to('Module::Build') and (
1722 # CPANPLUS::inc->path_to('Module::Build') eq
1723 # CPANPLUS::inc->installer_path )
1726 # ### if the module being installed is *not* Module::Build
1727 # ### itself -- as that would undoubtedly be newer -- add
1728 # ### the path to the installers to @INC
1729 # ### if it IS module::build itself, add 'lib' to its path,
1730 # ### as the Build.PL would do as well, but the API doesn't.
1731 # ### this makes self updates possible
1732 # return $self->module eq 'Module::Build'
1734 # : CPANPLUS::inc->installer_path;
1737 ### otherwise, the path was found through a 'normal' way of
1746 Please report bugs or other issues to E<lt>bug-cpanplus@rt.cpan.org<gt>.
1750 This module by Jos Boumans E<lt>kane@cpan.orgE<gt>.
1754 The CPAN++ interface (of which this module is a part of) is copyright (c)
1755 2001 - 2007, Jos Boumans E<lt>kane@cpan.orgE<gt>. All rights reserved.
1757 This library is free software; you may redistribute and/or modify it
1758 under the same terms as Perl itself.
1763 # c-indentation-style: bsd
1765 # indent-tabs-mode: nil
1767 # vim: expandtab shiftwidth=4: