App-SD
view release on metacpan or search on metacpan
lib/App/SD/Replica/trac.pm view on Meta::CPAN
package App::SD::Replica::trac;
use Any::Moose;
extends qw/App::SD::ForeignReplica/;
use Params::Validate qw(:all);
use File::Temp 'tempdir';
use Memoize;
use Try::Tiny;
use constant scheme => 'trac';
use constant pull_encoder => 'App::SD::Replica::trac::PullEncoder';
use constant push_encoder => 'App::SD::Replica::trac::PushEncoder';
has trac => ( isa => 'Net::Trac::Connection', is => 'rw');
has remote_url => ( isa => 'Str', is => 'rw');
has query => ( isa => 'Maybe[Str]', is => 'rw');
has foreign_username => ( isa => 'Str', is => 'rw' );
sub BUILD {
my $self = shift;
# Require rather than use to defer load
try {
require Net::Trac;
} catch {
die "SD requires Net::Trac to sync with a Trac server.\n".
"'cpan Net::Trac' may sort this out for you.\n";
};
my ( $server, $type, $query ) = $self->{url} =~ m/^trac:(.*?)$/
or die
"Can't parse Trac server spec. Expected trac:http://example.com";
my $uri = URI->new($server);
my ( $username, $password );
if ( my $auth = $uri->userinfo ) {
( $username, $password ) = split /:/, $auth, 2;
$uri->userinfo(undef);
}
$self->remote_url( $uri->as_string );
if ( $password ) {
try {
$self->_trac_login( $username, $password );
} catch {
die "Bad username or password specified in URL!\n";
};
}
else {
($username, $password) = $self->login_loop(
uri => $uri,
username => $username,
login_callback => \&_trac_login,
);
}
}
sub _trac_login {
my ($self, $username, $password) = @_;
$self->trac(
Net::Trac::Connection->new(
url => $self->remote_url,
user => $username,
password => $password,
)
);
# Net::Trac doesn't give us enough information
( run in 2.467 seconds using v1.01-cache-2.11-cpan-d8267643d1d )