Dist-Zilla-Plugin-Bitbucket
view release on metacpan or search on metacpan
lib/Dist/Zilla/Plugin/Bitbucket.pm view on Meta::CPAN
# ABSTRACT: Plugins to integrate Dist::Zilla with Bitbucket
use Moose 2.1400;
use Moose::Util::TypeConstraints 1.01;
use Config::Identity::Bitbucket;
#pod =attr remote
#pod
#pod Specifies the git/hg remote name to use (default 'origin').
#pod
#pod =cut
has 'remote' => (
is => 'ro',
isa => 'Maybe[Str]',
default => 'origin',
);
#pod =attr repo
#pod
#pod Specifies the name of the Bitbucket repository to be created (by default the name
#pod of the dist is used). This can be a template, so something like the following
#pod will work:
#pod
#pod repo = {{ lc $dist -> name }}
#pod
#pod =cut
has 'repo' => (
is => 'ro',
isa => 'Maybe[Str]',
);
#pod =attr scm
#pod
#pod Specifies the source code management system to use.
#pod
#pod The possible choices are hg and git. It will be autodetected from the
#pod distribution root directory if not provided.
#pod
#pod =cut
has 'scm' => (
is => 'ro',
isa => enum( [ qw( hg git ) ] ),
lazy => 1,
default => sub {
my $self = shift;
# Does git exist?
if ( -d '.git' ) {
return 'git';
} elsif ( -d '.hg' ) {
return 'hg';
} else {
die "Unknown local repository type!";
}
},
);
sub _get_credentials {
my ($self, $nopass) = @_;
# TODO I'm so lazy...
## no critic (InputOutput::ProhibitBacktickOperators)
my %identity = Config::Identity::Bitbucket->load;
my ($login, $pass);
if (%identity) {
$login = $identity{'login'};
} else {
if ( $self->scm eq 'git' ) {
$login = `git config bitbucket.user`;
} else {
$login = `hg showconfig bitbucket.user`;
}
chomp $login;
}
if (!$login) {
my $error = %identity ?
"Err: missing value 'user' in ~/.bitbucket" :
"Err: Missing value 'bitbucket.user' in git/hg config";
$self->log($error);
return;
}
if (!$nopass) {
if (%identity) {
$pass = $identity{'password'};
} else {
if ( $self->scm eq 'git' ) {
$pass = `git config bitbucket.password`;
} else {
$pass = `hg showconfig bitbucket.password`;
}
chomp $pass;
}
if (!$pass) {
$pass = $self->zilla->chrome->prompt_str( "Bitbucket password for '$login'", { noecho => 1 } );
}
}
return ($login, $pass);
}
sub _get_repo_name {
my ($self, $login) = @_;
my $repo;
if ( $self->scm eq 'git' ) {
if ($self->repo) {
$repo = $self->repo;
} else {
require Git::Wrapper;
my $git = Git::Wrapper->new('./');
my ($url) = map { /Fetch URL: (.*)/ } $git->remote('show', '-n', $self->remote);
if ($url =~ /bitbucket\.org.*?[:\/](.*)\.git$/) {
$repo = $1;
} else {
$repo = $self->zilla->name;
}
}
# Make sure we return full path including user
if ($repo !~ /.*\/.*/) {
($login, undef) = $self->_get_credentials(1);
$repo = "$login/$repo";
}
} else {
# Get it from .hgrc
if ( -f '.hg/hgrc' ) {
require File::Slurp::Tiny;
my $hgrc = File::Slurp::Tiny::read_file( '.hg/hgrc' );
# TODO this regex sucks.
# apoc@box:~/test-hg$ cat .hg/hgrc
#[paths]
#default = ssh://hg@bitbucket.org/Apocal/test-hg
if ( $hgrc =~ /default\s*=\s*(\S+)/ ) {
$repo = $1;
if ( $repo =~ /bitbucket\.org\/(.+)$/ ) {
$repo = $1;
} else {
die "Unable to extract Bitbucket repo from hg: $repo";
}
} else {
die "Unable to parse repo from hg: $hgrc";
}
} else {
die "Unable to determine repository name as .hg/hgrc is nonexistent";
}
}
$self->log_debug([ "Determined the repo name for Bitbucket is %s", $repo ]);
return $repo;
}
no Moose;
__PACKAGE__ -> meta -> make_immutable;
1;
__END__
=pod
=encoding UTF-8
=for :stopwords Apocalypse cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee
diff irc mailto metadata placeholders metacpan
=head1 NAME
Dist::Zilla::Plugin::Bitbucket - Plugins to integrate Dist::Zilla with Bitbucket
=head1 VERSION
This document describes v0.001 of Dist::Zilla::Plugin::Bitbucket - released November 03, 2014 as part of Dist-Zilla-Plugin-Bitbucket.
=head1 DESCRIPTION
This is a set of plugins for L<Dist::Zilla> intended
to more easily integrate L<Bitbucket|https://bitbucket.org> in the C<dzil> workflow.
The following is the list of the plugins shipped in this distribution:
=over 4
=item *
L<Dist::Zilla::Plugin::Bitbucket::Create>
Create Bitbucket repo on dzil new
=item *
L<Dist::Zilla::Plugin::Bitbucket::Update>
Update Bitbucket repo info on release
=item *
L<Dist::Zilla::Plugin::Bitbucket::Meta>
Add Bitbucket repo info to META.{yml,json}
=back
=head2 Configuration
Configure git with your Bitbucket credentials:
$ git config --global bitbucket.user LoginName
$ git config --global bitbucket.password MySecretPassword
Alternatively you can install L<Config::Identity> and write your credentials
in the (optionally GPG-encrypted) C<~/.bitbucket> file as follows:
login LoginName
password MySecretPassword
(if only the login name is set, the password will be asked interactively)
=head1 ATTRIBUTES
=head2 remote
Specifies the git/hg remote name to use (default 'origin').
=head2 repo
Specifies the name of the Bitbucket repository to be created (by default the name
of the dist is used). This can be a template, so something like the following
will work:
repo = {{ lc $dist -> name }}
=head2 scm
Specifies the source code management system to use.
The possible choices are hg and git. It will be autodetected from the
distribution root directory if not provided.
=head1 SUPPORT
=head2 Perldoc
You can find documentation for this module with the perldoc command.
perldoc Dist::Zilla::Plugin::Bitbucket
=head2 Websites
The following websites have more information about this module, and may be of help to you. As always,
in addition to those websites please use your favorite search engine to discover more resources.
=over 4
=item *
MetaCPAN
A modern, open-source CPAN search engine, useful to view POD in HTML format.
L<http://metacpan.org/release/Dist-Zilla-Plugin-Bitbucket>
=item *
Search CPAN
The default CPAN search engine, useful to view POD in HTML format.
L<http://search.cpan.org/dist/Dist-Zilla-Plugin-Bitbucket>
=item *
( run in 1.707 second using v1.01-cache-2.11-cpan-140bd7fdf52 )