diff options
author | Francois Marier <francois@debian.org> | 2010-08-05 20:52:16 -0400 |
---|---|---|
committer | Francois Marier <francois@debian.org> | 2010-08-05 20:52:16 -0400 |
commit | 9fcb3bc29dfd429f521c4e40452197dc364310c3 (patch) | |
tree | d343c4aeb67a1cc4b00dfebf873937aa9cccf12a /lib/CIL/Command/Am.pm | |
parent | 1515145646c5aa80eb4c298607ea33da731ab586 (diff) |
Imported Upstream version 0.07.00upstream/0.07.00
Diffstat (limited to 'lib/CIL/Command/Am.pm')
-rw-r--r-- | lib/CIL/Command/Am.pm | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/lib/CIL/Command/Am.pm b/lib/CIL/Command/Am.pm new file mode 100644 index 0000000..5b763ea --- /dev/null +++ b/lib/CIL/Command/Am.pm @@ -0,0 +1,140 @@ +## ---------------------------------------------------------------------------- +# cil is a Command line Issue List +# Copyright (C) 2008 Andrew Chilton +# +# This file is part of 'cil'. +# +# cil is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# This program 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 General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program. If not, see <http://www.gnu.org/licenses/>. +# +## ---------------------------------------------------------------------------- + +package CIL::Command::Am; + +use strict; +use warnings; + +use File::Slurp qw(read_file write_file); +use Email::Date qw(find_date); +use base qw(CIL::Command); + +## ---------------------------------------------------------------------------- + +sub name { 'am' } + +sub run { + my ($self, $cil, $args, $email_filename) = @_; + + unless ( -r $email_filename ) { + CIL::Utils::fatal("couldn't load email '$email_filename'"); + } + + my $msg_text = read_file($email_filename); + + my $email = Email::Simple->new($msg_text); + unless ( defined $email ) { + CIL::Utils::fatal("email file '$email_filename' didn't look like an email"); + } + + # extract some fields + my $subject = $email->header('Subject'); + my $from = $email->header('From'); + my $date = find_date($email)->datetime; + my $body = $email->body; + + # see if we can find any issue names in either the subject or the body + my @issue_names; + foreach my $text ( $subject, $body ) { + my @new = ( $text =~ /\b\#?([0-9a-f]{8})\b/gxms ); + push @issue_names, @new; + } + + CIL::Utils->msg("Found possible issue names in email: ", ( join(' ', @issue_names) || '[none]' )); + + my %issue; + foreach ( @issue_names ) { + my $i = eval { CIL::Issue->new_from_name($cil, $_) }; + next unless defined $i; + + $issue{$i->name} = $i; + } + + if ( keys %issue ) { + CIL::Utils->msg( "Found actual issues: " . (join(' ', keys %issue)) ); + + # create the new comment + my $comment = CIL::Comment->new('tmpname'); + $comment->Issue( '...' ); + $comment->CreatedBy( $from ); + $comment->Inserted( $date ); + # $comment->Updated( $date ); + $comment->Description( $body ); + + # display + CIL::Utils->display_comment($cil, $comment); + + # found at least one issue, so this might be a comment + my $issue; + if ( keys %issue == 1 ) { + $issue = (values %issue)[0]; + } + else { + if ( $args->{batch} ) { + CIL::Utils->fatal('Cannot add to an existing message (in batch mode) when there are multiple matched messages!'); + } + my $ans = CIL::Utils::ans('To which issue would you like to add this comment: '); + + # ToDo: decide whether we let them choose an arbitrary issue, for + # now quit unless they choose one from the list + return unless exists $issue{$ans}; + + # got a valid issue_name, so set the parent name + $issue = $issue{$ans}; + } + + # set the parent issue + $comment->Issue( $issue->name ); + + CIL::Utils->add_comment_loop($cil, undef, $issue, $comment); + } + else { + CIL::Utils->msg("Couldn't find reference to any issues in the email."); + + # no issue found so make up the issue first + my $issue = CIL::Issue->new('tmpname'); + $issue->Summary( $subject ); + $issue->Status($cil->DefaultNewStatus); + $issue->CreatedBy( $from ); + $issue->AssignedTo( CIL::Utils->user($cil) ); + $issue->Inserted( $date ); + $issue->Updated( $date ); + $issue->Description( $body ); + + # display + CIL::Utils->display_issue_full($cil, $issue); + + # then ask if the user would like to add it + CIL::Utils->msg("Couldn't find any likely issues, so this might be a new one."); + if ( $args->{batch} ) { + CIL::Utils->msg('Running in batch mode, so just adding mail as a new issue'); + } else { + my $ans = CIL::Utils::ans('Would you like to add this message as an issue shown above (y/n): '); + return unless $ans eq 'y'; + } + + CIL::Utils->add_issue_loop($cil, undef, $issue); + } +} + +1; +## ---------------------------------------------------------------------------- |