BackPAN-Index-Create
view release on metacpan or search on metacpan
lib/BackPAN/Index/Create.pm view on Meta::CPAN
my $order = defined($argref->{order})
? $argref->{order}
: $DEFAULT_ORDER;
my $author_dir = "$basedir/authors";
my $stem = "$author_dir/id";
my $releases_only = $argref->{releases_only} || 0;
my $loader = Module::Loader->new()
|| croak "failed to instantiate Module::Loader\n";
my @plugins = $loader->find_modules($PLUGIN_NAMESPACE);
my @plugin_basenames = map { my $p = $_; $p =~ s/^.*:://; $p } @plugins;
my $fh;
if (not -d $author_dir) {
croak "create_backpan_index() can't find 'authors' directory in basedir ($basedir)\n";
}
my ($basename) = grep { lc($_) eq lc($order) } @plugin_basenames;
if (not defined($basename)) {
croak "order '$order' not known. Supported orders are ",
join($COMMA, map { "'".lc($_)."'" } @plugin_basenames), "\n";
}
my $plugin_class = $PLUGIN_NAMESPACE.'::'.$basename;
$loader->load($plugin_class);
if (exists($argref->{output})) {
open($fh, '>', $argref->{output});
}
else {
$fh = \*STDOUT;
}
my $plugin = $plugin_class->new(filehandle => $fh)
|| croak "failed to create instance of '$order' plugin ($plugin_class)";
print $fh "#FORMAT $FORMAT_REVISION\n";
my $rule = Path::Iterator::Rule->new();
$rule->file->name("*");
if ($releases_only) {
# A 'releases only' index contains just the tarballs
# and the paths don't include the leading 'authors/id'
# Does a BackPAN ever contain anything in a directory
# other than authors?
$rule->and(sub { /\.(tar\.gz|tgz|zip)$/ }) if $releases_only;
$stem = "$author_dir/id";
}
else {
$stem = $basedir;
}
foreach my $path ($rule->all($author_dir)) {
next if $path =~ /\s+\z/;
next if $path =~ /\n/;
my $tail = $path;
$tail =~ s!^\Q${stem}\E[^A-Za-z0-9]+!!;
$tail =~ s!\\!/!g if $^O eq 'MSWin32';
my @stat = stat($path);
my $time = $stat[9];
my $size = $stat[7];
# printf $fh "%s %d %d\n", $tail, $time, $size;
$plugin->add_file($tail, $time, $size);
}
$plugin->finish();
close($fh) if exists($argref->{output});
}
1;
=head1 NAME
BackPAN::Index::Create - generate an index file for a BackPAN mirror
=head1 SYNOPSIS
use BackPAN::Index::Create qw/ create_backpan_index /;
create_backpan_index({
basedir => '/path/to/backpan'
releases_only => 0 | 1,
output => 'backpan-index.txt',
order => 'dist' # or 'author' or 'age'
});
=head1 DESCRIPTION
B<BackPAN::Index::Create> provides a function C<create_backpan_index()>
that will create a text index file for a BackPAN CPAN mirror.
A BackPAN CPAN mirror is like a regular CPAN mirror, but it has everything
that has ever been released to CPAN.
The canonical BackPAN mirror is L<backpan.perl.org|http://backpan.perl.org>.
By default the generated index will look like this:
#FORMAT 1
authors/id/B/BA/BARBIE/Acme-CPANAuthors-British-1.01.meta.txt 1395991503 1832
authors/id/B/BA/BARBIE/Acme-CPANAuthors-British-1.01.readme.txt 1395991503 1912
authors/id/B/BA/BARBIE/Acme-CPANAuthors-British-1.01.tar.gz 1395991561 11231
The first line is a comment that identifies the revision number of the index format.
For each file in the BackPAN mirror the index will then contain one line.
Each line contains three items:
=over 4
=item * path
=item * timestamp
=item * size (in bytes)
=back
You can see indexes created using this module on the
L<CPAN Testers BackPAN|http://backpan.cpantesters.org>,
the home page of which also has more information about BackPAN mirrors.
( run in 1.817 second using v1.01-cache-2.11-cpan-39bf76dae61 )