App-Sybil

 view release on metacpan or  search on metacpan

lib/App/Sybil/Command/release.pm  view on Meta::CPAN

  my $github = Net::GitHub->new(
    version      => 3,
    access_token => $token,
    RaiseError => 1,
  );

  my $url = capture_stdout {
    system 'git', 'remote', 'get-url', 'origin';
  };
  unless ($url =~ m|github\.com[:/](\w+)/(\w+)(?:\.git)?$|) {
    say STDERR 'Remote "origin" is not a github url';
    return;
  }

  my $repos = $github->repos;
  $repos->set_default_user_repo($1, $2);

  foreach my $r ($repos->releases()) {
    if ($r->{name} eq $version) {
      say STDERR "There is already a release named $version";
      say STDERR $r->{html_url};
      return;
    }
  }

  my $last_tag = capture_stdout {
    system 'git', 'describe', '--tags', '--abbrev=0';
  };
  chomp $last_tag;
  my $changes = capture_stdout {
    system 'git', 'log', "$last_tag..HEAD", '--format=" * %s"';
  };

  my ($fh, $filename) = tempfile();
  print $fh $changes;
  close $fh;

  my $editor = $ENV{EDITOR} // 'vi';
  system($editor, $filename);
  my $desc = read_file($filename);

  say STDERR "Tagging and pushing release";
  system('git', 'tag', '-a', $version, '-F', $filename);
  system('git', 'push', '--follow-tags');

  say STDERR "Publishing $project $version to github.";

  my $release = $repos->create_release({
    tag_name => $version,
    name     => $version,
    body     => $desc,
    draft    => \1,
    prerelease => \( $version =~ /^v0\./ ? 1 : 0 ),
  });

  say STDERR "Created release $version";

  foreach my $target ($self->app->targets) {
    my $file = $self->app->output_file($version, $target);
    my $type = $file =~ /\.zip$/ ? 'application/zip' : 'application/gzip';
    my $data = read_file($file, { binmode => ':raw' });
    my $size = length $data;
    say STDERR "Uploading $file ($type): $size bytes";
    my $asset = $repos->upload_asset($release->{id}, $file, $type, $data);
  }

  say STDERR "Released $version at $release->{html_url}";
}

1;



( run in 1.463 second using v1.01-cache-2.11-cpan-140bd7fdf52 )