App-opan
view release on metacpan or search on metacpan
script/opan view on Meta::CPAN
$base_static->dispatch($_[0]->stash(path => "${pan}/index"));
};
get "/${pan}/modules/02packages.details.txt.gz" => sub {
$base_static->dispatch($_[0]->stash(path => "${pan}/index.gz"));
};
}
my $serve_upstream = sub {
my ($c) = @_;
$c->render_later;
$c->ua->get(
$c->cpan_url.'authors/id/'.$c->stash->{dist_path},
sub {
my (undef, $tx) = @_;
$c->tx->res($tx->res);
$c->rendered;
}
);
return;
};
get '/upstream/authors/id/*dist_path' => $serve_upstream;
get '/combined/authors/id/*dist_path' => sub {
$_[0]->stash(path => $_[0]->stash->{dist_path});
$combined_static->dispatch($_[0]) or $serve_upstream->($_[0]);
};
get '/nopin/authors/id/*dist_path' => sub {
$_[0]->stash(path => $_[0]->stash->{dist_path});
$nopin_static->dispatch($_[0]) or $serve_upstream->($_[0]);
};
get "/autopin/modules/02packages.details.txt" => sub {
return $_[0]->render(text => 'Autopin off', status => 404)
unless $ENV{OPAN_AUTOPIN};
$base_static->dispatch($_[0]->stash(path => "nopin/index"));
};
get "/autopin/modules/02packages.details.txt.gz" => sub {
return $_[0]->render(text => 'Autopin off', status => 404)
unless $ENV{OPAN_AUTOPIN};
$base_static->dispatch($_[0]->stash(path => "nopin/index.gz"));
};
get '/autopin/authors/id/*dist_path' => sub {
return $_[0]->render(text => 'Autopin off', status => 404)
unless $ENV{OPAN_AUTOPIN};
return if $nopin_static->dispatch($_[0]->stash(path => $_[0]->stash->{dist_path}));
return if eval {
do_pin(app, $_[0]->stash->{path});
$pinset_static->dispatch($_[0]);
};
return $_[0]->render(text => 'Not found', status => 404);
};
caller() ? app : app->tap(sub { shift->log->level('fatal') })->start;
=head1 NAME
App::opan - A CPAN overlay for darkpan and pinning purposes
=head1 SYNOPSIS
Set up an opan (creates a directory tree in C<pans/>):
$ opan init
$ opan pin MSTROUT/M-1.tar.gz
$ opan add ./My-Dist-1.23.tar.gz
Now, you can start the server:
$ opan daemon -l http://localhost:8030/
Server available at http://localhost:8030/
Then in another terminal, run one of:
$ cpanm --mirror http://localhost:8030/combined/ --mirror-only --installdeps .
$ PERL_CARTON_MIRROR=http://localhost:8030/combined/ carton install
Or, to let opan do that part for you, skip starting the server and run one of:
$ opan cpanm --installdeps .
$ opan carton install
=head1 DESCRIPTION
Two basic approaches to using this thing. First, if you're using carton, you
can probably completely ignore the pinning system, so just do:
$ opan init
$ opan add ./My-DarkPan-Dist-1.23.tar.gz
$ git add pans/; git commit -m 'fresh opan'
$ opan carton install
You can reproduce this install with simply:
$ opan carton install --deployment
When you want to update to a new version of the cpan index (assuming you
already have an additional requirement that's too old in your current
snapshot):
$ opan pull
$ git add pans/; git commit -m 'update pans'
$ opan carton install
Second, if you're not using carton, but you want reproducible installs, you
can still mostly ignore the pinning system by doing:
$ opan init
$ opan add ./My-DarkPan-Dist-1.23.tar.gz
$ opan cpanm --autopin --installdeps .
$ git add pans/; git commit -m 'opan with current version pinning'
Your reproducible install is now:
$ opan cpanm --installdeps .
When you want to update to a new version of the cpan index (assuming you
already have an additional requirement that's too old in your current
script/opan view on Meta::CPAN
to request a specific PAN.
=head2 PANs
=head3 upstream
02packages: Fetched from www.cpan.org by the L</fetch> command.
Dist files: Fetched from www.cpan.org on-demand.
=head3 pinset
02packages: Managed by L</pin> and L</unpin> commands.
Dist files: Fetched from www.cpan.org by L</pin> command.
=head3 custom
02packages: Managed by L</add> and L</unadd> commands.
Dist files: Imported from local disk by L</add> command.
=head3 combined
02packages: Merged from upstream, pinset and custom PANs by L</merge> command.
Dist files: Fetched from custom, pinset and upstream in that order.
=head3 nopin
02packages: Merged from upstream and custom PANs by L</merge> command.
Dist files: Fetched from custom, pinset and upstream in that order.
=head3 autopin
Virtual PAN with no presence on disk.
Identical to nopin, but fetching a dist from upstream does an implict L</pin>.
Since this can modify your opan config, it's only enabled if the environment
variable C<OPAN_AUTOPIN> is set to a true value (calling the L</cpanm> or
L</carton> commands with C<--autopin> sets this for you, because you already
specified you wanted that).
=head2 uploads
To enable the /upload endpoint, set the ENV var OPAN_AUTH_TOKENS to a colon
separated list of accepted tokens for uploads. This will allow a post with a
'file' upload argument, checking http basic auth password against the provided
auth tokens.
=head2 recurring pull
Set ENV OPAN_RECURRING_PULL to a true value to make opan automatically pull
from upstream every 600 seconds
=head2 custom upstream
Set the ENV var OPAN_MIRROR to specify a cpan mirror - the default is
www.cpan.org. Remember that if you need to temporarily overlay your overlay
but only for one user, there's nothing stopping you setting OPAN_MIRROR to
another opan.
=head1 AUTHOR
Matt S. Trout (mst) <mst@shadowcat.co.uk>
=head1 CONTRIBUTORS
Aaron Crane (arc) <arc@cpan.org>
Marcus Ramburg (marcus) <marcus.ramberg@gmail.com>
=head1 COPYRIGHT
Copyright (c) 2016-2018 the L<App::opan> L</AUTHOR> and L</CONTRIBUTORS>
as listed above.
=head1 LICENSE
This library is free software and may be distributed under the same terms
as perl itself.
=cut
( run in 0.624 second using v1.01-cache-2.11-cpan-5735350b133 )