The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package MyCPAN::App::DPAN;
use strict;
use warnings;

use base qw(MyCPAN::App::BackPAN::Indexer);
use vars qw($VERSION $logger);

use Cwd qw(cwd);
use File::Spec::Functions;
use Log::Log4perl;

$VERSION = '1.28';

BEGIN {

$SIG{INT} = sub { exit };

my $cwd = cwd();

my $report_dir = catfile( $cwd, 'indexer_reports' );

my %Defaults = (
	ignore_packages       => 'main MY MM DB bytes DynaLoader',
	indexer_class         => 'MyCPAN::App::DPAN::Indexer',
	dispatcher_class      => 'MyCPAN::Indexer::Dispatcher::Serial',
	queue_class           => 'MyCPAN::App::DPAN::SkipQueue',
	organize_dists        => 0,
	parallel_jobs         => 1,
	pause_id              => 'DPAN',
	reporter_class        => 'MyCPAN::App::DPAN::Reporter::Minimal',
	backpan_dir           => $cwd,
	fresh_start           => defined $ENV{DPAN_FRESH_START} ? $ENV{DPAN_FRESH_START} : 0,
	skip_perl             => 0,
	extra_reports_dir     => undef,
	i_ignore_errors_at_my_peril => 0,
	ignore_missing_dists  => 0,
	);

sub default_keys
	{
	my %Seen;
	grep { ! $Seen{$_}++ } keys %Defaults, $_[0]->SUPER::default_keys;
	}
	
sub default
	{
	exists $Defaults{ $_[1] }
		?
	$Defaults{ $_[1] }
		:
	$_[0]->SUPER::default( $_[1] );
	}

$logger = Log::Log4perl->get_logger( 'backpan_indexer' );
}

sub activate_steps
	{
	qw(
	process_options 
	setup_coordinator 
	setup_environment 
	handle_config
	setup_logging 
	fresh_start 
	setup_dirs 
	run_components
	);
	}

sub components
	{
	(
	[ qw( queue      MyCPAN::Indexer::Queue                get_queue      ) ],
	[ qw( dispatcher MyCPAN::Indexer::Dispatcher::Serial   get_dispatcher ) ],
	[ qw( reporter   MyCPAN::App::DPAN::Reporter::Minimal  get_reporter   ) ],
	[ qw( worker     MyCPAN::Indexer::Worker               get_task       ) ],
	[ qw( interface  MyCPAN::Indexer::Interface::Text      do_interface   ) ],
	)
	}

sub fresh_start
	{
	my( $application ) = @_;
	
	return unless $application->get_coordinator->get_config->fresh_start;
	
	my $indexer_reports_dir = $application->get_coordinator->get_config->report_dir;
	
	require File::Path;
	
	File::Path::remove_tree( $indexer_reports_dir ); 
		
	return 1;
	}
	
sub activate_end
	{
	my( $application ) = @_;
	
	my $reporter = $application->get_coordinator->get_reporter;
	
	if( $reporter->can( 'create_index_files' ) )
		{
		$reporter->create_index_files;
		}
	else
		{
		$logger->warn( 'Reporter class is missing create_index_files!' );
		}

	$application->SUPER::activate_end;
	}
	
	
1;

=head1 NAME

MyCPAN::App::DPAN - Create a CPAN-like structure out of some dists

=head1 SYNOPSIS

	use MyCPAN::App::DPAN;
	
	my $application = MyCPAN::App::DPAN->activate( @ARGV );
	
	# do some other stuff, anything that you like
	
	$application->activate_end;
	
=head1 DESCRIPTION

This module ties together all the bits to let the C<dpan> do its work. It
overrides the defaults in C<MyCPAN::App::BackPAN::Indexer> to provide the
right components.

The work happens in two steps. When you call C<activate>, the program goes
through all of the steps to examin each of the module distributions. It creates
a report for each distribution, then stops. This pause right after the
examination gives you the chance to do something right before the program
creates the PAUSE index files. The examination might take several minutes
(or even hours depending on how much you want to index), so you have a chance
to check the state of the world before the next step.

When you call C<activate_end>, the program takes the results from the 
previous step and creates the PAUSE index files in the F<modules> directory.
This step should be very quick since all of the information is ready-to-go.

=cut

=head1 SOURCE AVAILABILITY

This code is in Github:

      git://github.com/briandfoy/mycpan-indexer.git
      git://github.com/briandfoy/mycpan--app--dpan.git

=head1 AUTHOR

brian d foy, C<< <bdfoy@cpan.org> >>

=head1 COPYRIGHT AND LICENSE

Copyright (c) 2008-2009, brian d foy, All Rights Reserved.

You may redistribute this under the same terms as Perl itself.

=cut