| Fedora-App-ReviewTool documentation | Contained in the Fedora-App-ReviewTool distribution. |
Fedora::App::ReviewTool::Command::submit - [submitter] submit a srpm for review
Handles the various routine parts of submitting a package for review.
TODO/FIXME!
Chris Weyl <cweyl@alumni.drew.edu>
Copyright (c) 2009 Chris Weyl <cweyl@alumni.drew.edu>
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the
Free Software Foundation, Inc.
59 Temple Place, Suite 330
Boston, MA 02111-1307 USA
| Fedora-App-ReviewTool documentation | Contained in the Fedora-App-ReviewTool distribution. |
############################################################################# # # A submit command for Fedora::App::ReviewTool # # Author: Chris Weyl (cpan:RSRCHBOY), <cweyl@alumni.drew.edu> # Company: No company, personal work # Created: 01/07/2009 03:10:20 PM PST # # Copyright (c) 2009 Chris Weyl <cweyl@alumni.drew.edu> # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # ############################################################################# package Fedora::App::ReviewTool::Command::submit; use Moose; use MooseX::Types::Path::Class qw{ File }; use Archive::RPM; use DateTime; use IO::Prompt; use Path::Class; use Template; use namespace::clean -except => 'meta'; extends qw{ MooseX::App::Cmd::Command }; with 'Fedora::App::ReviewTool::Config'; with 'Fedora::App::ReviewTool::Bugzilla'; with 'Fedora::App::ReviewTool::Koji'; with 'Fedora::App::ReviewTool::Submitter'; our $VERSION = '0.10'; sub _sections { qw{ base bugzilla koji submit } } # FIXME I'm pretty sure this is the wrong way to do it :) has '+logger' => ( traits => [ 'NoGetopt' ] ); has depends_on => ( traits => [ 'Getopt' ], is => 'rw', isa => 'Str', default => q{}, cmd_flag => 'depends-on', cmd_aliases => [ 'depends' ], documentation => 'bugs this review depends on', ); has blocks => ( is => 'rw', isa => 'Str', default => q{}, documentation => 'bugs this review blocks', ); has additional_comment => ( traits => [ 'Getopt' ], is => 'rw', isa => 'Str', cmd_flag => 'additional-comment', cmd_aliases => [ 'c' ], documentation => 'Additional comment to append to tix', ); has force => ( traits => [ 'Getopt' ], is => 'rw', isa => 'Bool', documentation => 'Force operation', default => 0, ); # death to aliases > 20! (not factorial, sadly) sub _alias { length $_[1] < 21 ? $_[1] : undef } sub _usage_format { return "usage: %c submit <srpm1> [<srpm2> ...] %o"; } sub run { my ($self, $opts, $args) = @_; # first things first. $self->enable_logging; $self->app->startup_checks; my $total = scalar @$args; my $i = 0; die "Pass srpms on the command line to submit.\n" unless @$args; SRPM_LOOP: for my $srpm_file (@$args) { $srpm_file = file $srpm_file; # make sure we were passed a srpm die "$srpm_file must exist, be readable and be a srpm!\n" unless -r "$srpm_file" && "$srpm_file" =~ /\.src\.rpm$/; my $srpm = Archive::RPM->new($srpm_file); $i++; my $info = $self->get_pkg_info_from_srpm($srpm); print "Working on: ($i of $total) " . $srpm_file->basename . "\n"; my $spec = $self->build_spec($srpm, $info); my $name = $info->{name}; my $test = $self->test; my $url = $info->{url}; # catch cpanspec/CPANPLUS::Dist::RPM issues die "$name has an invalid summary!\n" if $srpm->summary =~ /no summary found/i; print "Searching bugzilla; this may take some time...\n"; # check to ensure we haven't done this already if (my $bug = $self->find_bug_for_pkg($name)) { die "\n$name already has a review bug: $bug\n" unless $self->force; } print "No existing review bug for $name.\n"; if ($self->no_koji) { # koji scratch build (unless no_koji) print "Skipping koji scratch build\n"; } else { # kick off build and capture -- just let die if not success! my $start = DateTime->now; print "Starting koji scratch build.\n"; print "...this may take some time. We started at $start\n"; # FIXME the koji stuff all needs to be refactored! $self->koji_run_scratch($srpm_file); $info->{koji_uri} = $self->_koji_uri; $info->{koji_success} = $self->_koji_success; my $end = DateTime->now; my $dur = $start - $end; # FIXME we should probably use DateTime::Format::Duration here my ($min, $sec) = ($dur->minutes, $dur->seconds); print "Koji build done; we took $min minutes, $sec seconds.\n\n"; if (!$self->_koji_success) { die "KOJI SCRATCH FAILED! Correct and re-submit.\n\n " . $self->_koji_uri . "\n\n" ; } } # push to fedorapeople space # FIXME yeah, I'd rather use Net::SSH2, but ssh-agent is easy... print "Pushing package and spec to fedorapeople...\n"; $self->push_to_reviewspace($srpm_file, $spec); print "...done.\n\n"; my $baseuri = $self->baseuri; my $comment = $self->app->new_tix( srpm => "$baseuri" . $srpm->rpm->basename, spec => "$baseuri" . $spec->basename, koji => $self->_koji_uri, description => $self->repack($info->{description}), version => $Fedora::App::ReviewTool::VERSION, additional_comment => $self->additional_comment, ); my $sum = $info->{summary}; print $self->app->verbose_submit( bug => $info, body => $comment, ); unless ($self->yes || prompt 'Post for review? ', -YyNn1) { print "Not posting $name for review.\n"; next SRPM_LOOP; } # create bug, etc print "\nCreating bug...\n"; my $bug = $self->_bz->create_bug( product => $test ? 'Bugzilla' : 'Fedora', component => $test ? 'test' : 'Package Review', version => $test ? 'devel' : 'rawhide', assigned_to => 'nobody@fedoraproject.org', # easier than $test #summary => "Review Request: $name - $sum", summary => $self->gen_summary($srpm), comment => $comment, alias => $self->_alias($name), dependson => $self->depends_on, blocked => $self->blocks, bug_file_loc => "$url", ); print "...done.\n\nReview bug for $name is: $bug\n\n"; } return; } 1; __END__