use strict;
use warnings;
package Dist::Zilla::Plugin::CPAN::Mini::Inject::REST;
our $VERSION = '0.004';
use Moose;
use Data::Dump;
extends 'CPAN::Mini::Inject::REST::Client::API';
with 'Dist::Zilla::Role::Releaser';
has '+port' => ( default => 80 );
has '+protocol' => ( default => 'http' );
sub release {
my ($self, $archive) = @_;
if($ENV{ALREADY_UPLOADED_PRETEND_THIS_HAPPENED_ALREADY})
{
# sometimes the CPAN::Mini::Inject::REST reports an error
# despite successfully uploading and indexing a distribution.
# this leaves us in an awkward state as we can't re-upload it
# and we need this step to pass to get the rest of the release
# tasks accomplished.
# NOTE: this often a 504 because the timeouts on the frontend
# nginx are too low. Since the server does the whole indexing
# during the processing of the REST call itself this can take a
# while.
$self->log("Pretending we succesfully uploaded $archive");
return;
}
if($self->host =~ qr|//|)
{
# stop a common goof that was being reported as a 500.
# despite not actually reaching a server.
$self->log_fatal(sprintf "host looks like a url (%s), please change it to a hostname.", $self->host);
}
$self->log_debug(sprintf "Sending %s to %s://%s:%d", $archive, $self->protocol, $self->host, $self->port);
my ($code, $result) = $self->post(
qq(repository/$archive) => {
file => ["$archive"]
}
);
if ($code >= 500) {
# FIXME - does it give us info?
$self->log_fatal("$code: Server error");
}
elsif ($code >= 400) {
my $error = ref $result ? $result->{error} : $result;
$error = pp $error if ref $error;
$self->log_fatal("$code: Client error: $error");
}
elsif ($code >= 300) {
$self->log_fatal("Unexpected $code that wasn't followed");
}
else {
$self->log("Successfully indexed $archive");
}
}
1;
__END__
=encoding utf-8
=head1 NAME
Dist::Zilla::Plugin::CPAN::Mini::Inject::REST - Uploads to a
L<CPAN::Mini::Inject> mirror using L<CPAN::Mini::Inject::REST>
=head1 DESCRIPTION
Like L<Dist::Zilla::Plugin::Inject>, this plugin is a release-stage plugin that
uploads to a L<CPAN::Mini> mirror. This one expects that the remote is a
L<CPAN::Mini::Inject::REST> server, since it uses
L<CPAN::Mini::Inject::REST::Client::API> to do it.
=head1 ATTRIBUTES
This plugin extends L<CPAN::Mini::Inject::REST::Client::API> and therefore all of its properties can be provided. A summary:
=over
=item host - Required - without the protocol.
=item protocol - Optional. Defaults to C<http>. This differs from the parent class, where it is required.
=item port - Optional. Defaults to C<80>. This differs from the parent class, where it is required.
=item username - Optional. Username for HTTP basic auth.
=item password - Optional. Password for HTTP basic auth.
=back