[pkg-perl-tools] 02/03: Convert Debian::PkgPerl::GitHub into a class
Alex Muntada
alexm-guest at moszumanska.debian.org
Mon Nov 28 21:58:48 UTC 2016
This is an automated email from the git hooks/post-receive script.
alexm-guest pushed a commit to branch master
in repository pkg-perl-tools.
commit a57fbd82f3ac0cb6f898c141947038dff0ff1999
Author: Alex Muntada <alexm at alexm.org>
Date: Mon Nov 28 05:02:35 2016 +0100
Convert Debian::PkgPerl::GitHub into a class
---
lib/Debian/PkgPerl/GitHub.pm | 382 ++++++++++++++++++++++++++-----------------
scripts/forward | 61 +------
t/github.t | 33 +---
3 files changed, 245 insertions(+), 231 deletions(-)
diff --git a/lib/Debian/PkgPerl/GitHub.pm b/lib/Debian/PkgPerl/GitHub.pm
index a46125d..bf30589 100644
--- a/lib/Debian/PkgPerl/GitHub.pm
+++ b/lib/Debian/PkgPerl/GitHub.pm
@@ -10,28 +10,25 @@ Debian::PkgPerl::GitHub - Help forwarding a bug or a patch to GitHub
=head1 SYNOPSIS
- $gh = Net::GitHub->new(
- access_token => $token,
- );
+ use Debian::PkgPerl::GitHub;
- create_fork($gh, $owner, $repo, $orgname)
- unless fork_exists($gh, $orgname, $repo);
+ my $url = 'https://github.com/foo/bar/issues';
+ my $gh = Debian::PkgPerl::GitHub->new(tracker => $url);
- clone_branch_patch_push($orgname, $repo, $branch, $patch, $comment);
+ my %params = (
+ subject => $summary,
+ body => $comment,
+ );
- $url = create_pull_request($gh, $owner, $repo, {
- title => $comment,
- body => $body,
- head => "$orgname:$branch",
- base => $base,
- });
+ my $pull = $gh->patch($file)->forward(%params);
+ my $issue = $gh->bug($ticket)->forward(%params);
=head1 DESCRIPTION
This module exports several helpers that that provide support for
forwarding patches to GitHub as pull requests.
-=head1 SUBROUTINES/METHODS
+=head1 METHODS
=cut
@@ -40,76 +37,104 @@ use File::Temp qw(tempdir);
use Git::Repository;
use Cwd 'realpath';
-use Exporter 'import';
-our @EXPORT_OK = qw(
- fork_exists
- create_fork
- clone_branch_patch_push
- create_pull_request
- forward_patch_as_pull_request
- forward_bug_as_issue
-);
-our %EXPORT_TAGS = ( all => \@EXPORT_OK );
-=head2 fork_exists($gh, $user, $repo)
-
-Checks if a GitHub user has already forked a repository.
+=head2 new(%params)
=head3 Parameters:
=over
-=item * $gh
+=item * tracker
-Net::GitHub object that must be already authenticated.
+Issue tracker URL for an upstream project.
-=item * $user
+=back
-GitHub username.
+=head3 Environment:
-=item * $repo
+=over
-GitHub repository name.
+=item * DPT_GITHUB_OAUTH
-=back
+GitHub personal API token. No default.
-=head3 Returns:
+=item * DPT_GITHUB_ORGNAME
-Boolean value.
+Organization used to fork upstreams. Defaults to I<pkg-perl-tools>.
+
+=item * DPT_GITHUB_BRANCH
+
+Branch name for pull requests. Defaults to C<pkg-perl-$^T>.
+
+=back
=cut
-sub fork_exists {
- my ($gh, $user, $repo) = @_;
+sub new {
+ my $class = shift;
+ my %params = @_;
- return !!eval{ $gh->repos->get($user, $repo) };
-}
+ eval { require Net::GitHub; }
+ or die "Net::GitHub not available.\n"
+ . "Please install libnet-github-perl and try again.";
-=head2 create_fork($gh, $owner, $repo, $orgname)
+ die "github requires DPT_GITHUB_OAUTH setting.\n"
+ . "See dpt-config(5) and dpt-github-oauth.\n"
+ unless $ENV{DPT_GITHUB_OAUTH};
-Creates a repository fork by an organization.
+ die "Unable to determine github issue tracker URL.\n"
+ unless $params{tracker};
-=head3 Parameters:
+ my ( $owner, $repo, $opts )
+ = $params{tracker}
+ =~ m{^https?://github.com/([^/]+)/([^/]+)/issues(?:/?|\?(.*))$};
-=over
+ my @labels;
+ @labels = split /,/, $1 if $opts and $opts =~ m{labels=([^;&]+)};
-=item * $gh
+ die "Unable to determine github user and repository\n"
+ . "from $params{tracker}"
+ unless $owner and $repo;
-Net::GitHub object that must be already authenticated.
+ my $github = Net::GitHub::V3->new(
+ access_token => $ENV{DPT_GITHUB_OAUTH},
+ );
-=item * $owner
+ my %obj = (
+ github => $github,
+ owner => $owner,
+ repo => $repo,
+ labels => \@labels,
+ orgname => $ENV{'DPT_GITHUB_ORGNAME'} || 'pkg-perl-tools',
+ branch => $ENV{'DPT_GITHUB_BRANCH' } || "pkg-perl-$^T",
+ );
-Repository owner.
+ return bless \%obj, $class;
+}
-=item * $repo
+=head2 fork_exists()
-Repository being forked.
+Checks if any member in the GitHub organization has already forked a repository.
-=item * $orgname
+=head3 Returns:
-Organization that is forking the repository.
+Boolean value.
-=back
+=cut
+
+sub fork_exists {
+ my $self = shift;
+
+ my $gh = $self->{github};
+ my $user = $self->{orgname};
+ my $repo = $self->{repo};
+
+ return !!eval{ $gh->repos->get($user, $repo) };
+}
+
+=head2 create_fork()
+
+Creates a repository fork by an organization.
=head3 Returns:
@@ -118,13 +143,18 @@ The new forked repository.
=cut
sub create_fork {
- my ($gh, $owner, $repo, $orgname) = @_;
+ my $self = shift;
+
+ my $gh = $self->{github};
+ my $owner = $self->{owner};
+ my $repo = $self->{repo};
+ my $orgname = $self->{orgname};
$gh->repos->set_default_user_repo($owner, $repo);
return $gh->repos->create_fork($orgname);
}
-=head2 clone_branch_patch_push($user, $repo, $branch, $patch, $comment)
+=head2 clone_branch_patch_push(%params)
Clones a repository in a temporary directory, creates a new branch,
applies the patch, commits the change, pushes it and removes the
@@ -134,23 +164,7 @@ temporary working copy.
=over
-=item * $user
-
-User cloning the repository.
-
-=item * $repo
-
-Repository being cloned.
-
-=item * $branch
-
-Name of the branch being created.
-
-=item * $patch
-
-Full pathname to the file containing the patch.
-
-=item * $comment
+=item * subject
Message used in the commit.
@@ -163,7 +177,15 @@ Nothing.
=cut
sub clone_branch_patch_push {
- my ($user, $repo, $orgname, $branch, $patch, $comment) = @_;
+ my $self = shift;
+ my %params = @_;
+
+ my $orgname = $self->{orgname};
+ my $user = $self->{owner};
+ my $repo = $self->{repo};
+ my $branch = $self->{branch};
+ my $comment = $params{subject};
+ my $patch = $self->{patch};
# Clone
my $workdir = tempdir( CLEANUP => 1 );
@@ -196,28 +218,19 @@ sub clone_branch_patch_push {
return;
}
-=head2 create_pull_request($gh, $user, $repo, $params)
+=head2 create_pull_request(%params)
=head3 Parameters:
=over
-=item * $gh
-
-Net::GitHub object that must be already authenticated.
+=item * subject
-=item * $user
+Title used in the pull request.
-User performing the pull request.
+=item * body
-=item * $repo
-
-Repository receiving the pull request.
-
-=item * $params
-
-Hash reference with pull request parameters (usually B<title>, B<body>,
-B<head> and B<base>.) See L<Net::GitHub::V3::PullRequests> for details.
+Comment used as the body of the pull request message.
=back
@@ -228,138 +241,199 @@ Pull request URL on success, nothing otherwise.
=cut
sub create_pull_request {
- my ($gh, $user, $repo, $params) = @_;
+ my $self = shift;
+ my %params = @_;
+
+ my $gh = $self->{github};
+ my $user = $self->{owner};
+ my $repo = $self->{repo};
$gh->pull_request->set_default_user_repo($user, $repo);
- my $pull = $gh->pull_request->create_pull($params);
+
+ my $pull = $gh->pull_request->create_pull({
+ title => $params{subject},
+ body => $params{body},
+ head => join(":", $self->{orgname}, $self->{branch}),
+ base => 'master',
+ labels => $self->{labels},
+ });
return $pull && $pull->{html_url};
}
-=head2 forward_patch_as_pull_request($gh, $user, $repo, $orgname, $branch, $patch, $title, $comment, $labels)
+=head2 forward_patch_as_pull_request(%params)
=head3 Parameters:
=over
-=item * $gh
+=item * subject
-Net::GitHub object that must be already authenticated.
+Title used in the pull request.
-=item * $user
+=item * body
-User forwarding the patch.
+Comment used as the body of the pull request message.
-=item * $repo
+=back
-Repository receiving the patch.
+=cut
-=item * $orgname
+sub forward_patch_as_pull_request {
+ my $self = shift;
+ my %params = @_;
-Organization that owns the forked repository.
+ my $gh = $self->{github};
+ my $orgname = $self->{orgname};
+ die "Cannot find your GitHub user in $orgname organization"
+ unless $gh->user->show($orgname)->{login} eq $orgname;
-=item * $branch
+ $self->create_fork() unless $self->fork_exists();
+ $self->clone_branch_patch_push(%params);
+ my $issue_url = $self->create_pull_request(%params);
+ return $issue_url;
+}
-Name of the branch being created.
+=head2 forward_bug_as_issue(%params)
-=item * $patch
+=head3 Parameters:
-Full pathname to the file containing the patch.
+=over
-=item * $title
+=item * subject
Title of the bug report.
-=item * $comment
+=item * body
-Message used in the bug report.
-
-=item * $labels
-
-Labels to be set in the bug report.
+Comment used in the body of the bug report.
=back
=cut
-sub forward_patch_as_pull_request {
- my ($gh, $user, $repo, $orgname, $branch, $patch, $title, $comment, $labels) = @_;
-
- die "Cannot find your GitHub user in $orgname organization"
- unless $gh->user->show($orgname)->{login} eq $orgname;
+sub forward_bug_as_issue {
+ my $self = shift;
+ my %params = @_;
- create_fork($gh, $user, $repo, $orgname)
- unless fork_exists($gh, $orgname, $repo);
+ my $gh = $self->{github};
+ my $user = $self->{owner};
+ my $repo = $self->{repo};
+ my $ticket = $self->{ticket};
+ my $title = $params{subject};
+ my $comment = $params{body};
- clone_branch_patch_push($user, $repo, $orgname, $branch, $patch, $title);
+ $gh->set_default_user_repo( $user, $repo );
- $issue_url = create_pull_request($gh, $user, $repo, {
- title => $title,
- body => $comment,
- head => "$orgname:$branch",
- base => 'master',
- labels => [ split( /,/, $labels ) ],
- });
+ my $issue;
+ if ($ticket) {
+ $issue = $gh->issue->issue($ticket);
+ $gh->issue->create_comment( $ticket, { body => $comment } );
+ }
+ else {
+ $issue = $gh->issue->create_issue({
+ title => $title,
+ body => $comment,
+ labels => $self->{labels},
+ });
+ }
- return $issue_url;
+ return $issue->{html_url};
}
-=head2 forward_bug_as_issue($gh, $user, $repo, $ticket, $title, $comment, $labels)
+=head2 patch($file)
+
+Set the filename of the patch to be forwarded.
=head3 Parameters:
=over
-=item * $gh
+=item * $file
+
+Filename containing a patch.
+
+=back
+
+=cut
+
+sub patch {
+ my $self = shift;
+ my ($file) = @_;
+
+ $self->{patch} = $file;
-Net::GitHub object that must be already authenticated.
+ return $self;
+}
-=item * $user
+=head2 bug($ticket)
-User forwarding the bug.
+Set the bug nuber of the issue to be forwarded.
-=item * $repo
+=head3 Parameters:
-Repository receiving the bug report.
+=over
=item * $ticket
-Use an existing ticket number to make the report.
+An existing bug number. Forward will create a new one otherwise.
-=item * $title
+=back
-Title of the bug report.
+=cut
-=item * $comment
+sub bug {
+ my $self = shift;
+ my ($ticket) = @_;
-Message used in the bug report.
+ $self->{bug} = $ticket;
-=item * $labels
+ return $self;
+}
+
+=head2 forward(%params)
+
+Forward an issue as a pull request or bug.
+
+=head3 Parameters:
+
+=over
+
+=item * subject
-Labels to be set in the bug report.
+The title of the forwarded issue.
+
+=item * body
+
+The comment of the forwarded issue.
=back
=cut
-sub forward_bug_as_issue {
- my ($gh, $user, $repo, $ticket, $title, $comment, $labels) = @_;
+sub forward {
+ my $self = shift;
- $gh->set_default_user_repo( $user, $repo );
+ my $issue_url = $self->{patch}
+ ? $self->forward_patch_as_pull_request(@_)
+ : $self->forward_bug_as_issue(@_)
+ ;
- my $issue;
- if ($ticket) {
- $issue = $gh->issue->issue($ticket);
- $gh->issue->create_comment( $ticket, { body => $comment } );
- }
- else {
- $issue = $gh->issue->create_issue({
- title => $title,
- body => $comment,
- labels => [ split( /,/, $labels ) ],
- });
- }
+ return $issue_url;
+}
- return $issue->{html_url};
+=head2 test()
+
+Support for off-line testing.
+
+=cut
+
+sub test {
+ my $self = shift;
+
+ my $gh_user = $self->{owner};
+ my $gh_repo = $self->{repo};
+
+ return "https://github.com/$gh_user/$gh_repo/issues/DUMMY";
}
=head1 LICENSE AND COPYRIGHT
diff --git a/scripts/forward b/scripts/forward
index 7b03bf8..d0cea27 100755
--- a/scripts/forward
+++ b/scripts/forward
@@ -16,7 +16,7 @@ use Text::Wrap qw(wrap);
use Proc::InvokeEditor;
use MIME::Lite;
use YAML::XS qw(LoadFile);
-use Debian::PkgPerl::GitHub ':all';
+use Debian::PkgPerl::GitHub;
use warnings;
use strict;
@@ -571,26 +571,7 @@ sub submit_cpan_rt {
sub submit_github {
- eval { require Net::GitHub; }
- or die "Net::GitHub not available.\n"
- . "Please install libnet-github-perl and try again.";
-
- die "github requires DPT_GITHUB_OAUTH setting.\n"
- . "See dpt-config(5) and dpt-github-oauth.\n"
- unless $ENV{DPT_GITHUB_OAUTH};
-
- die "Unable to determine github issue tracker URL.\n"
- unless $opt_tracker_url;
-
- my ( $gh_user, $gh_repo, $gh_opts )
- = $opt_tracker_url
- =~ m{^https?://github.com/([^/]+)/([^/]+)/issues(?:/?|\?(.*))$};
- my $gh_labels = '';
- $gh_labels = $1 if $gh_opts and $gh_opts =~ m{labels=([^;&]+)};
-
- die "Unable to determine github user and repository\n"
- . "from $opt_tracker_url"
- unless $gh_user and $gh_repo;
+ my $gh = Debian::PkgPerl::GitHub->new( tracker => $opt_tracker_url );
# prepare subject
my $subject = get_subject();
@@ -600,43 +581,17 @@ sub submit_github {
my $issue_url;
if ( $opt_offline_test ) {
- $issue_url = "https://github.com/$gh_user/$gh_repo/issues/DUMMY";
+ $issue_url = $gh->test();
goto ISSUE_CREATED;
}
- # now create the issue
- my $gh = Net::GitHub->new( # Net::GitHub::V3
- access_token => $ENV{DPT_GITHUB_OAUTH},
+ $gh->patch($patch);
+ $gh->bug($opt_ticket);
+ $issue_url = $gh->forward(
+ subject => $subject,
+ body => $body,
);
- if ($patch) {
- my $orgname = 'pkg-perl-tools';
- my $branch = "pkg-perl-$^T";
-
- $issue_url = forward_patch_as_pull_request(
- $gh,
- $gh_user,
- $gh_repo,
- $orgname,
- $branch,
- $patch,
- $subject,
- $body,
- $gh_labels,
- );
- }
- else {
- $issue_url = forward_bug_as_issue(
- $gh,
- $gh_user,
- $gh_repo,
- $opt_ticket,
- $subject,
- $body,
- $gh_labels,
- );
- }
-
ISSUE_CREATED:
mark_patch_as_forwarded($issue_url) if $patch;
mark_bug_as_forwarded($issue_url) if $bug;
diff --git a/t/github.t b/t/github.t
index aed816c..a04ddd0 100644
--- a/t/github.t
+++ b/t/github.t
@@ -13,42 +13,27 @@ BEGIN {
plan skip_all
=> "GitHub tests require DPT_GITHUB_OAUTH token"
- . " and Net::GitHub"
+ . " and a working Debian::PkgPerl::GitHub"
unless $ENV{DPT_GITHUB_OAUTH}
and $ENV{DPT_GITHUB_OAUTH} =~ /^\w+$/
- and eval "use Net::GitHub; 1";
+ and eval { use Debian::PkgPerl::GitHub; 1 };
}
use Test::RequiresInternet ( 'github.com' => 22 );
-use Debian::PkgPerl::GitHub ':all';
# Defaults
-my $owner = 'alexm';
-my $repo = 'pkg-perl-dummy';
-my $orgname = 'pkg-perl-tools';
-my $branch = "pkg-perl-$^T";
+my $tracker = 'https://github.com/alexm/pkg-perl-dummy/issues';
my $patch = "$ENV{DPT_PACKAGES}/pkg-perl-tools/t/dummy.txt.patch";
my $comment = "Test patch $^T";
my $body = 'Pull request by Debian pkg-perl team.';
-my $base = 'master';
-# Test GitHub API access
-my $gh = new_ok('Net::GitHub::V3', [
- access_token => $ENV{DPT_GITHUB_OAUTH},
-]);
-is( $gh->user->show($orgname)->{login}, $orgname, $orgname );
+my $gh = new_ok( 'Debian::PkgPerl::GitHub', [ tracker => $tracker ] );
+isa_ok( $gh->patch($patch), 'Debian::PkgPerl::GitHub', '$gh->patch' );
-create_fork($gh, $owner, $repo, $orgname)
- unless fork_exists($gh, $orgname, $repo);
-
-clone_branch_patch_push($owner, $repo, $orgname, $branch, $patch, $comment);
-
-my $url = create_pull_request($gh, $owner, $repo, {
- title => $comment,
- body => $body,
- head => "$orgname:$branch",
- base => $base,
-});
+my $url = $gh->forward(
+ subject => $comment,
+ body => $body,
+);
isnt( $url, undef, 'pull request' );
diag $url;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/pkg-perl-tools.git
More information about the Pkg-perl-cvs-commits
mailing list