use
subs
qw(get_caller_info)
;
use
vars
qw($VERSION $indexer_logger $reporter_logger)
;
$VERSION
=
'1.21'
;
BEGIN {
$indexer_logger
= Log::Log4perl->get_logger(
'Indexer'
);
$reporter_logger
= Log::Log4perl->get_logger(
'Reporter'
);
}
sub
_exit { 1 }
__PACKAGE__->activate(
@ARGV
)
unless
caller
;
sub
examine_dist_steps
{
my
@methods
= (
[
'unpack_dist'
,
"Could not unpack distribution!"
, 1 ],
[
'find_dist_dir'
,
"Did not find distro directory!"
, 1 ],
[
'find_modules'
,
"Could not find modules!"
, 1 ],
[
'examine_modules'
,
"Could not process modules!"
, 0 ],
[
'find_tests'
,
"Could not find tests!"
, 0 ],
[
'examine_tests'
,
"Could not process tests!"
, 0 ],
);
}
sub
find_module_techniques
{
my
@methods
= (
[
'look_in_lib'
,
"Guessed from looking in lib/"
],
[
'look_in_cwd'
,
"Guessed from looking in cwd"
],
[
'look_in_meta_yml_provides'
,
"Guessed from looking in META.yml"
],
[
'look_for_pm'
,
"Guessed from looking in cwd"
],
);
}
sub
get_module_info_tasks
{
(
[
'extract_module_namespaces'
,
'Extract the namespaces a file declares'
],
[
'extract_module_version'
,
'Extract the version of the module'
],
)
}
sub
setup_run_info
{
my
$perl
= Probe::Perl->new;
$_
[0]->set_run_info(
'root_working_dir'
, cwd() );
$_
[0]->set_run_info(
'run_start_time'
,
time
);
$_
[0]->set_run_info(
'completed'
, 0 );
$_
[0]->set_run_info(
'pid'
, $$ );
$_
[0]->set_run_info(
'ppid'
,
$_
[0]->
getppid
);
$_
[0]->set_run_info(
'indexer'
,
ref
$_
[0] );
$_
[0]->set_run_info(
'indexer_versions'
,
$_
[0]->VERSION );
return
1;
}
sub
setup_dist_info
{
my
(
$self
,
$dist
) =
@_
;
$indexer_logger
->debug(
"Setting dist [$dist]\n"
);
$self
->set_dist_info(
'dist_file'
,
$dist
);
return
1;
}
sub
final_words
{
my
(
$class
,
$Notes
) =
@_
;
$reporter_logger
->trace(
"Final words from the DPAN Reporter"
);
my
$report_dir
=
$Notes
->{config}->success_report_subdir;
$reporter_logger
->debug(
"Report dir is $report_dir"
);
opendir
my
(
$dh
),
$report_dir
or
$reporter_logger
->fatal(
"Could not open directory [$report_dir]: $!"
);
my
%dirs_needing_checksums
;
my
$package_details
= CPAN::PackageDetails->new;
$reporter_logger
->info(
"Creating index files"
);
foreach
my
$file
(
readdir
(
$dh
) )
{
next
unless
$file
=~ /\.yml\z/;
$reporter_logger
->debug(
"Processing output file $file"
);
my
$yaml
=
eval
{ YAML::LoadFile( catfile(
$report_dir
,
$file
) ) } or
do
{
$reporter_logger
->error(
"$file: $@"
);
next
;
};
my
$dist_file
=
$yaml
->{dist_info}{dist_file};
next
unless
-e
$dist_file
;
my
$dist_dir
= dirname(
$dist_file
);
$dirs_needing_checksums
{
$dist_dir
}++;
foreach
my
$module
( @{
$yaml
->{dist_info}{module_info} } )
{
my
$packages
=
$module
->{packages};
my
$version
=
$module
->{version_info}{value};
$version
=
$version
->numify
if
eval
{
$version
->can(
'numify'
) };
(
my
$version_variable
=
$module
->{version_info}{identifier} ||
''
)
=~ s/(?:\:\:)?VERSION$//;
$reporter_logger
->debug(
"Package from version variable is $version_variable"
);
PACKAGE:
foreach
my
$package
(
@$packages
)
{
if
(
$version_variable
&&
$version_variable
ne
$package
)
{
$reporter_logger
->debug(
"Skipping package [$package] since version variable [$version_variable] is in a different package"
);
next
;
}
(
my
$path
=
$dist_file
) =~ s/.
*authors
.id.//g;
$path
=~ s|\\+|/|g;
if
(
$class
->skip_package(
$package
) )
{
$reporter_logger
->debug(
"Skipping $package: excluded by config"
);
next
PACKAGE;
}
$package_details
->add_entry(
'package name'
=>
$package
,
version
=>
$version
,
path
=>
$path
,
);
}
}
}
my
$dir
=
do
{
my
$d
=
$Notes
->{config}->backpan_dir;
ref
$d
?
$d
->[0] :
$d
;
};
(
my
$packages_dir
=
$dir
) =~ s/authors.id.*//;
$reporter_logger
->debug(
"package details directory is [$packages_dir]"
);
my
$index_dir
= catfile(
$packages_dir
,
'modules'
);
mkpath(
$index_dir
);
my
$packages_file
= catfile(
$index_dir
,
'02packages.details.txt.gz'
);
$reporter_logger
->debug(
"package details file is [$packages_file]"
);
$package_details
->write_file(
$packages_file
);
$class
->create_modlist(
$index_dir
);
$class
->create_checksums( [
keys
%dirs_needing_checksums
] );
}
sub
guess_package_name
{
my
(
$self
,
$module_info
) =
@_
;
}
sub
get_package_version
{
}
sub
skip_package
{
}
sub
create_package_details
{
my
(
$self
,
$index_dir
) =
@_
;
1;
}
sub
create_modlist
{
my
(
$self
,
$index_dir
) =
@_
;
my
$module_list_file
= catfile(
$index_dir
,
'03modlist.data.gz'
);
$reporter_logger
->debug(
"modules list file is [$module_list_file]"
);
if
( -e
$module_list_file
)
{
$reporter_logger
->debug(
"File [$module_list_file] already exists!"
);
return
1;
}
my
$fh
= IO::Compress::Gzip->new(
$module_list_file
);
print
$fh
<<"HERE";
File: 03modlist.data
Description: This a placeholder for CPAN.pm
Modcount: 0
Written-By: Id: $0
Date: @{ [ scalar localtime ] }
package CPAN::Modulelist;
sub data { {} }
1;
HERE
close
$fh
;
}
sub
create_checksums
{
my
(
$self
,
$dirs
) =
@_
;
foreach
my
$dir
(
@$dirs
)
{
my
$rc
=
eval
{ CPAN::Checksums::updatedir(
$dir
) };
$reporter_logger
->error(
"Couldn't create CHECKSUMS for $dir: $@"
)
if
$@;
$reporter_logger
->info(
do
{
if
(
$rc
== 1 ) {
"Valid CHECKSUMS file is already present"
}
elsif
(
$rc
== 2 ) {
"Wrote new CHECKSUMS file in $dir"
}
else
{
"updatedir unexpectedly returned an error"
}
} );
}
}