Dist-Zilla-Plugin-GitHub-CreateRelease
view release on metacpan or search on metacpan
lib/Dist/Zilla/Plugin/GitHub/CreateRelease.pm view on Meta::CPAN
use Git::Wrapper;
use File::Basename;
use URI;
use URI::Escape qw( uri_unescape );
use File::Slurper qw/read_text read_binary/;
use Exporter qw(import);
use Moose;
use Try::Tiny;
use JSON::MaybeXS 1.004000;
with 'Dist::Zilla::Role::AfterRelease';
use namespace::autoclean;
has hash_alg => (is => 'ro', default => 'sha256');
has repo => (is => 'ro');
has branch => (is => 'ro', default => 'main');
has remote_name => (is => 'ro', default => 'origin');
has title_template => (is => 'ro', default => 'Version RELEASE - TRIAL CPAN release');
has notes_as_code => (is => 'ro', default => 1);
has github_notes => (is => 'ro', default => 0);
has notes_from => (is => 'ro', default => 'SignReleaseNotes');
has notes_file => (is => 'ro', default => 'Release-VERSION');
has draft => (is => 'ro', default => 0);
has add_checksum => (is => 'ro', default => 1);
has org_id => (is => 'ro', default => 'github');
sub _create_release {
my $self = shift;
my $tag = shift;
my $branch = shift;
my $title = shift;
my $notes = shift;
my $filename = shift;
my $cpan_tar = shift;
my @fields = ("login", "token");
my %identity = Config::Identity->load_check($self->{org_id}, \@fields);
my $org = $self->{org_id} ? $self->{org_id} : "github";
die "Unable to load github token from ~/.$org-identity or ~/.$org" if (! defined $identity{token});
my $releases = Pithub::Repos::Releases->new(
user => $identity{login} || $self->{username},
repo => $self->_get_repo_name() || $self->{repo},
token => $identity{token},
);
die "Unable to instantiate Pithub::Repos::Releases" if (! defined $releases);
my $release = $releases->create(
data => {
tag_name => "$tag",
target_commitish => $branch,
name => $title,
body => $notes,
draft => $self->{draft} ? JSON::MaybeXS::true : JSON::MaybeXS::false,
prerelease => $self->zilla->is_trial ? JSON::MaybeXS::true : JSON::MaybeXS::false,
generate_release_notes => $self->{github_notes} ? JSON::MaybeXS::true : JSON::MaybeXS::false,
}
);
die "Discussion category name is invalid" if ($release->response eq '404');
die "Validation failed, or the endpoint has been spammed." if ($release->response eq '422');
die "login ($identity{login}) or token invalid for the specified repository ($releases->{repo})\n"
if ($release->code eq '403');
if (! defined $release->content->{id}) {
die "Unable to create GitHub release\n";
}
$self->log("Release created at $releases->{repo} for $identity{login}");
my $asset = $releases->assets->create(
release_id => $release->content->{id},
name => $filename,
data => $cpan_tar,
content_type => 'application/gzip',
);
if ($asset->code eq '201') {
$self->log("CPAN archive appended to GitHub release: $tag");
} else {
$self->log("Unable to append CPAN archive GitHub release: $tag");
}
}
sub _menu {
my $self = shift;
my @items = @_;
print "Enter the number of the git remote where you want to create a release:\n";
print "Valid values are:\n";
print "\n?: ";
my $count = 0;
foreach my $item( @items ) {
$item =~ m/remote\.(.*)\.url/;
printf "%d: %s\n", ++$count, $1;
}
print "\n?: ";
while( my $line = <STDIN> ) {
chomp $line;
if ( $line =~ m/\d+/ && $line <= @items ) {
return $line - 1;
}
print "\n?: ";
}
}
sub _get_repo_name {
my $self = shift;
my $setting = "remote." . $self->{remote_name} . ".url";
$self->log("Release will be created using $setting\n");
my $git = Git::Wrapper->new('./');
my @url;
try {
@url = $git->RUN('config', '--get', $setting);
}
catch {
$self->log("Unable to find git \'$setting\' using git config --get $setting\n");
my @settings;
try {
@settings = $git->RUN('config', '--name-only', '--get-regexp', 'remote\..*\.url');
( run in 0.535 second using v1.01-cache-2.11-cpan-437f7b0c052 )