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 )