package Module::Setup::Plugin::Site::GitHub; use strict; use warnings; use base 'Module::Setup::Plugin'; use JSON; use LWP::UserAgent; sub register { my($self, ) = @_; $self->add_trigger( before_dump_config => \&before_dump_config ); $self->add_trigger( finalize_create_skeleton => \&finalize_create_skeleton ); } sub before_dump_config { my($self, $config) = @_; my %modules = ( readme_from => 'Module::Install::ReadmeFromPod', readme_markdown_from => 'Module::Install::ReadmeMarkdownFromPod', readme_pod_from => 'Module::Install::ReadmePodFromPod', githubmeta => 'Module::Install::GithubMeta', ); while (my($name, $module) = each %modules) { my $version = eval "require $module; 'installed '.\$$module\::VERSION;" || 'not installed'; $config->{$name} = 0; if ($self->dialog("use $name? (depend $module, $version [Yn] ", 'y') =~ /[Yy]/) { $config->{$name} = 1; } } $config->{github_format} ||= 'p5-%s'; $config->{github_format} = $self->dialog("github repository name format: ", $config->{github_format}); } # run github developer api sub finalize_create_skeleton { my $self = shift; my $user = $self->shell('git config --get github.user'); chomp $user; my $token = $self->shell('git config --get github.token'); chomp $token; unless ($user && $token) { $self->log("set the github.token And github.user for git config if you wants the create github repository."); return; } if ($self->dialog("create GitHub repository? [Yn] ", 'y') =~ /[Yy]/) { # create repository my $name = sprintf $self->config->{github_format}, $self->distribute->dist_name; $name = $self->dialog("github repository name: ", $name); my $description = 'Perl Module of ' . $self->distribute->module; $description = $self->dialog("github repository description: ", $description); my $homepage = ''; $homepage = $self->dialog("github repository homepage: ", $homepage); my $public = 1; if ($self->dialog("create private repository? [yN] ", 'n') =~ /[Yy]/) { $public = 0; } unless (_create_repository( login => $user, token => $token, name => $name, description => $description, homepage => $homepage, public => $public, )) { $self->log('can not created on GitHub'); return; } !$self->system('perl', 'Makefile.PL') or die $?; !$self->system('make', 'test') or die $?; !$self->system('make', 'distclean') or die $?; unless (-d '.git') { !$self->system('git', 'init') or die $?; !$self->system('git', 'add', '.') or die $?; !$self->system('git', 'commit', '-m', 'initial commit') or die $?; } !$self->system('git', 'remote', 'add', 'origin', "git\@github.com:${user}/${name}.git") or die $?; if ($self->dialog("try git push to GitHub? [Yn] ", 'y') =~ /[Yy]/) { !$self->system('git', 'push', 'origin', 'master') or die $?; } } } sub _create_repository { my %args = @_; my $ua = LWP::UserAgent->new( agent => join('/', __PACKAGE__, $Module::Setup::VERSION), cookie_jar => +{}, ); my $res = $ua->post( 'https://github.com/api/v2/json/repos/create' => \%args ); $res->is_success; } 1;