Thread: [Codestriker-commits] CVS update: codestriker/lib/Codestriker/TopicListeners Email.pm
Brought to you by:
sits
From: <si...@us...> - 2006-01-15 21:20:24
|
Created Codestriker topic at: http://codestriker.sourceforge.net/cgi-bin/codestriker.pl?topic=4859195&action=view User: sits Date: 06/01/15 13:20:06 Modified: . CHANGELOG README codestriker.conf doc codestriker.sgml lib Codestriker.pm lib/Codestriker/Action CreateTopic.pm EditComment.pm SubmitEditTopicProperties.pm SubmitNewComment.pm SubmitNewTopic.pm ViewTopicFile.pm ViewTopicProperties.pm lib/Codestriker/TopicListeners Email.pm Log: Created a new optional configuration parameter $repository_name_map in codestriker.conf. This allows for a user-defined repository name to be displayed in the codestriker UI, rather than the full repository URL. This can be useful for hiding potentially sensitive username/password information that might be a part of the repository URL. See the codestriker.conf file for more information. Submitted by Edwin Fine <edw...@ve...>. Index: CHANGELOG =================================================================== RCS file: /cvsroot/codestriker/codestriker/CHANGELOG,v retrieving revision 1.178 retrieving revision 1.179 diff -u -r1.178 -r1.179 --- CHANGELOG 7 Jan 2006 03:20:06 -0000 1.178 +++ CHANGELOG 15 Jan 2006 21:19:59 -0000 1.179 @@ -3,6 +3,14 @@ Version 1.9.2 +* Created a new optional configuration parameter $repository_name_map + in codestriker.conf. This allows for a user-defined repository name + to be displayed in the codestriker UI, rather than the full + repository URL. This can be useful for hiding potentially sensitive + username/password information that might be a part of the repository + URL. See the codestriker.conf file for more information. + Submitted by Edwin Fine <edw...@ve...>. + * Fixed problem with Subversion repositories on Win32, where Codestriker was unable to launch the svn program. Index: README =================================================================== RCS file: /cvsroot/codestriker/codestriker/README,v retrieving revision 1.49 retrieving revision 1.50 diff -u -r1.49 -r1.50 --- README 7 Sep 2004 21:56:20 -0000 1.49 +++ README 15 Jan 2006 21:19:59 -0000 1.50 @@ -1,5 +1,5 @@ Codestriker -Copyright (c) 2001, 2002, 2003, 2004 David Sitsky. All rights reserved. +Copyright (c) 2001 - 2006 David Sitsky. All rights reserved. si...@us... *** Please read the CHANGELOG file for details on changes *** Index: codestriker.conf =================================================================== RCS file: /cvsroot/codestriker/codestriker/codestriker.conf,v retrieving revision 1.78 retrieving revision 1.79 diff -u -r1.78 -r1.79 --- codestriker.conf 27 Jul 2005 10:50:57 -0000 1.78 +++ codestriker.conf 15 Jan 2006 21:19:59 -0000 1.79 @@ -161,6 +161,19 @@ 'clearcase:c:\\stuff\\view_name\\vob_name' ); +# A mapping of repository URLs to names. In any screen where a +# repository is displayed, if there is a mapping for the repository +# defined here, then the symbolic name will be displayed instead of +# its raw URL. This is useful when the URL contains sensitive +# username/password information, or the symbolic name is more +# meaningful to the end-user. If there is no mapping defined for a +# specific repository, its URL will be displayed. +$repository_name_map = +{ + '/home/sits/cvs' => 'Local CVS', + ':pserver:sits:pas...@cv...:/cvsroot' => 'SF CVS' +}; + # A mapping of repositories to filename viewers. Examples of such systems # would be CVSweb and ViewCVS, for local repositories. Mappings are # not required for remote CVSweb and ViewCVS repositories, as they are Index: codestriker.sgml =================================================================== RCS file: /cvsroot/codestriker/codestriker/doc/codestriker.sgml,v retrieving revision 1.50 retrieving revision 1.51 diff -u -r1.50 -r1.51 --- codestriker.sgml 19 Jun 2005 10:56:00 -0000 1.50 +++ codestriker.sgml 15 Jan 2006 21:20:04 -0000 1.51 @@ -7,9 +7,9 @@ <book> <bookinfo> <title>The Codestriker Guide</title> - <subtitle>Version 1.9.0</subtitle> + <subtitle>Version 1.9.2</subtitle> <legalnotice> - <para>Copyright (c) 2001, 2002, 2003, 2004</para> + <para>Copyright (c) 2001 - 2006</para> </legalnotice> <authorgroup> <author> @@ -517,6 +517,27 @@ </programlisting> </para> <para> + As explained by the comment in the codestriker.conf file, + sometimes there is a benefit for displaying a name instead of + a repository URL in the Codestriker UI. + <programlisting> +# A mapping of repository URLs to names. In any screen where a +# repository is displayed, if there is a mapping for the repository +# defined here, then the symbolic name will be displayed instead of +# its raw URL. This is useful when the URL contains sensitive +# username/password information, or the symbolic name is more +# meaningful to the end-user. If there is no mapping defined for a +# specific repository, its URL will be displayed. +$repository_name_map = +{ + '/home/sits/cvs' => 'Local CVS', + ':pserver:sits:pas...@cv...:/cvsroot' => 'SF CVS' +}; + + </programlisting> + </para> + + <para> During a review, it is sometimes beneficial to see the revision history of a file, such as information provided by CVSweb or ViewCVS. You can specify a mapping of repository Index: Codestriker.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker.pm,v retrieving revision 1.80 retrieving revision 1.81 diff -u -r1.80 -r1.81 --- Codestriker.pm 5 Oct 2005 07:56:10 -0000 1.80 +++ Codestriker.pm 15 Jan 2006 21:20:04 -0000 1.81 @@ -23,7 +23,8 @@ $allow_delete $allow_searchlist $default_file_to_view $allow_projects $antispam_email $VERSION $title $BASEDIR $metric_config $tmpdir @metric_schema $comment_state_metrics - $project_states $rss_enabled + $project_states $rss_enabled $repository_name_map $repository_url_map + @valid_repository_names ); # Version of Codestriker. @@ -306,6 +307,25 @@ { do "$BASEDIR/codestriker_test.conf"; } + + # Fill in $repository_name_map for those repository entries which don't have + # a mapping, with the same value as the repository value itself. + foreach my $repository (@valid_repositories) { + if (! exists $repository_name_map->{$repository}) { + $repository_name_map->{$repository} = $repository; + } + } + + # Define the equivalent list of valid repository names. + @valid_repository_names = (); + foreach my $repository (@valid_repositories) { + push @valid_repository_names, $repository_name_map->{$repository}; + } + + # Define the reverse mapping now for convenience. + foreach my $key (keys %${repository_name_map}) { + $repository_url_map->{$repository_name_map->{$key}} = $key; + } } # Returns the current time in a format suitable for a DBI timestamp value. Index: CreateTopic.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/CreateTopic.pm,v retrieving revision 1.28 retrieving revision 1.29 diff -u -r1.28 -r1.29 --- CreateTopic.pm 15 Feb 2005 10:11:50 -0000 1.28 +++ CreateTopic.pm 15 Jan 2006 21:20:05 -0000 1.29 @@ -57,15 +57,15 @@ # Set the default repository to select. if (! (defined $vars->{'default_repository'}) || $vars->{'default_repository'} eq "") { - if ($#Codestriker::valid_repositories != -1) { + if ($#Codestriker::valid_repository_names != -1) { # Choose the first repository as the default selection. $vars->{'default_repository'} = - $Codestriker::valid_repositories[0]; + $Codestriker::valid_repository_names[0]; } } # Indicate the list of valid repositories which can be choosen. - $vars->{'repositories'} = \@Codestriker::valid_repositories; + $vars->{'repositories'} = \@Codestriker::valid_repository_names; # Read the list of projects available to make that choice available # when a topic is created. Index: EditComment.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/EditComment.pm,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- EditComment.pm 1 Mar 2005 10:12:49 -0000 1.13 +++ EditComment.pm 15 Jan 2006 21:20:05 -0000 1.14 @@ -48,7 +48,7 @@ email=>$email, mode=>$mode, tabwidth=>$tabwidth, - repository=>$topic->{repository}, + repository=>$Codestriker::repository_name_map->{$topic->{repository}}, reload=>0, cache=>0); # Create the hash for the template variables. Index: SubmitEditTopicProperties.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/SubmitEditTopicProperties.pm,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- SubmitEditTopicProperties.pm 21 Nov 2004 05:00:08 -0000 1.10 +++ SubmitEditTopicProperties.pm 15 Jan 2006 21:20:05 -0000 1.11 @@ -33,7 +33,7 @@ my $cc = $http_input->get('cc'); my $topic_state = $http_input->get('topic_state'); my $bug_ids = $http_input->get('bug_ids'); - my $repository_url = $http_input->get('repository'); + my $repository_name = $http_input->get('repository'); my $projectid = $http_input->get('projectid'); # Check if this action is allowed, and that the state is valid. @@ -80,6 +80,13 @@ $cc = $topic->{cc}; } + # Make sure the repository value is correct. + my $repository_url = $Codestriker::repository_url_map->{$repository_name}; + if ($repository_url eq "") { + $feedback .= "Repository name \"$repository_name\" is unknown.\n" . + "Update your codestriker.conf file with this entry.\n"; + } + if ($feedback eq "") { if ($topic_state eq "Deleted") { $rc = $topic->delete(); Index: SubmitNewComment.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/SubmitNewComment.pm,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- SubmitNewComment.pm 13 Jun 2005 22:30:11 -0000 1.8 +++ SubmitNewComment.pm 15 Jan 2006 21:20:05 -0000 1.9 @@ -93,7 +93,7 @@ topic_title=>"Comment Submitted: " . "$topic->{title}", email=>$email, - repository=>$topic->{repository}, + repository=>$Codestriker::repository_name_map->{$topic->{repository}}, load_anchor=>$anchor, reload=>$reload, cache=>0); Index: SubmitNewTopic.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/SubmitNewTopic.pm,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- SubmitNewTopic.pm 16 Dec 2004 03:40:46 -0000 1.20 +++ SubmitNewTopic.pm 15 Jan 2006 21:20:05 -0000 1.21 @@ -36,7 +36,7 @@ my $topic_file = $http_input->get('fh_filename'); my $fh_mime_type = $http_input->get('fh_mime_type'); my $bug_ids = $http_input->get('bug_ids'); - my $repository_url = $http_input->get('repository'); + my $repository_name = $http_input->get('repository'); my $projectid = $http_input->get('projectid'); my $project_name = $http_input->get('project_name'); my $start_tag = $http_input->get('start_tag'); @@ -85,7 +85,7 @@ $http_response->generate_header(topic_title=>"Create New Topic", email=>$email, reviewers=>$reviewers, - cc=>$cc, repository=>$repository_url, + cc=>$cc, repository=>$repository_name, projectid=>$projectid, reload=>0, cache=>0); @@ -101,7 +101,7 @@ $error_vars->{'topic_description'} = $topic_description; $error_vars->{'topic_title'} = $topic_title; $error_vars->{'bug_ids'} = $bug_ids; - $error_vars->{'default_repository'} = $repository_url; + $error_vars->{'default_repository'} = $repository_name; $error_vars->{'repositories'} = \@Codestriker::valid_repositories; $error_vars->{'start_tag'} = $start_tag; $error_vars->{'end_tag'} = $end_tag; @@ -110,27 +110,25 @@ $error_vars->{'default_to_head'} = $default_to_head; my $repository = undef; + my $repository_url = undef; if (scalar(@Codestriker::valid_repositories)) { # Set the repository to the default if it is not entered. - if ($repository_url eq "" || scalar(@Codestriker::valid_repositories) == 1) { - $repository_url = $Codestriker::valid_repositories[0]; + if ($repository_name eq "" || scalar(@Codestriker::valid_repository_names) == 1) { + $repository_name = $Codestriker::valid_repository_names[0]; } # Check if the repository argument is in fact a configured # repository. - my $configured = 0; - foreach my $rep ( @Codestriker::valid_repositories ) { - $configured = 1 if $repository_url eq $rep; - } + $repository_url = $Codestriker::repository_url_map->{$repository_name}; - if ($configured) { - $repository = - Codestriker::Repository::RepositoryFactory->get($repository_url); + if (defined $repository_url) { + $repository = + Codestriker::Repository::RepositoryFactory->get($repository_url); } if (! defined $repository) { $feedback .= - "The repository value \"$repository_url\" is invalid.\n" . + "The repository value set for \"$repository_name\" is invalid.\n" . "Please correct this value in your codestriker.conf file, " . "and try again.\n"; } @@ -195,8 +193,10 @@ if ($rc == $Codestriker::DIFF_TOO_BIG) { $feedback .= "Generated diff file is too big.\n"; } elsif ($rc == $Codestriker::UNSUPPORTED_OPERATION) { - $feedback .= "Repository \"" . $repository->toString() . + $feedback .= "Repository \"" . $repository_name . "\" does not support tag retrieval, you have to use the text file upload.\n"; + } elsif ($rc != $Codestriker::OK) { + $feedback .= "Unexpected error $rc retrieving diff text.\n"; } # Seek to the beginning of the temporary file so it can be parsed. Index: ViewTopicFile.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/ViewTopicFile.pm,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- ViewTopicFile.pm 1 Mar 2005 10:12:49 -0000 1.11 +++ ViewTopicFile.pm 15 Jan 2006 21:20:05 -0000 1.12 @@ -100,7 +100,7 @@ mode=>$mode, tabwidth=>$tabwidth, fview=>$fview, - repository=>$topic->{repository}, + repository=>$Codestriker::repository_name_map->{$topic->{repository}}, reload=>0, cache=>1); # Render the HTML header. Index: ViewTopicProperties.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/ViewTopicProperties.pm,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- ViewTopicProperties.pm 1 Mar 2005 10:12:49 -0000 1.12 +++ ViewTopicProperties.pm 15 Jan 2006 21:20:05 -0000 1.13 @@ -95,8 +95,8 @@ # Indicate what repositories are available, and what the topic's # repository is. - $vars->{'topic_repository'} = $topic->{repository}; - $vars->{'repositories'} = \@Codestriker::valid_repositories; + $vars->{'topic_repository'} = $Codestriker::repository_name_map->{$topic->{repository}}; + $vars->{'repositories'} = \@Codestriker::valid_repository_names; # Indicate what projects are available, and what the topic's project is. my @projects = Codestriker::Model::Project->list(); Index: Email.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/TopicListeners/Email.pm,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- Email.pm 30 Jan 2005 00:48:11 -0000 1.14 +++ Email.pm 15 Jan 2006 21:20:06 -0000 1.15 @@ -218,7 +218,8 @@ # Check for repository change. if ($topic->{repository} ne $topic_orig->{repository}) { - $changes .= "The repository was changed to $topic->{repository}.\n"; + my $value = $Codestriker::repository_name_map->{$topic->{repository}}; + $changes .= "The repository was changed to $value.\n"; } # Check for description change. |
From: <si...@us...> - 2006-01-16 10:38:05
|
Created Codestriker topic at: http://codestriker.sourceforge.net/cgi-bin/codestriker.pl?topic=5581589&action=view User: sits Date: 06/01/16 02:37:46 Modified: . CHANGELOG lib/Codestriker/Action SubmitNewComment.pm lib/Codestriker/TopicListeners Email.pm Log: * If there is a problem when a comment is created, the error message will correctly display in the AJAX'ed window. An example here is if $mailhost is incorrectly configured. Index: CHANGELOG =================================================================== RCS file: /cvsroot/codestriker/codestriker/CHANGELOG,v retrieving revision 1.180 retrieving revision 1.181 diff -u -r1.180 -r1.181 --- CHANGELOG 16 Jan 2006 09:51:11 -0000 1.180 +++ CHANGELOG 16 Jan 2006 10:37:45 -0000 1.181 @@ -16,6 +16,10 @@ has now been fixed. Submitted by Edwin Fine <edw...@ve...>. +* If there is a problem when a comment is created, the error message + will correctly display in the AJAX'ed window. An example here is if + $mailhost is incorrectly configured. + * Fixed problem with Subversion repositories on Win32, where Codestriker was unable to launch the svn program. Index: SubmitNewComment.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/SubmitNewComment.pm,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SubmitNewComment.pm 15 Jan 2006 21:20:05 -0000 1.9 +++ SubmitNewComment.pm 16 Jan 2006 10:37:45 -0000 1.10 @@ -11,6 +11,7 @@ use strict; +use HTML::Entities (); use Codestriker::Model::Comment; use Codestriker::Model::File; use Codestriker::Model::Topic; @@ -72,17 +73,18 @@ # Tell the listener classes that a comment has just been created. my $listener_response = Codestriker::TopicListeners::Manager::comment_create($topic, $comment); - if ( $listener_response ne '') { - $http_response->error($listener_response); - } if (defined $format && $format eq "xml") { + my $response = $listener_response ne '' ? $listener_response : 'OK'; + print $query->header(-content_type=>'text/xml'); print "<?xml version=\"1.0\" encoding=\"UTF-8\" " . "standalone=\"yes\"?>\n"; print "<response><method>submitnewcomment</method>" . - "<result>OK</result></response>\n"; + "<result>" . HTML::Entities::encode($response) . + "</result></response>\n"; } else { + $http_response->error($listener_response) if $listener_response ne ''; # Display a simple screen indicating that the comment has been # registered. Clicking the Close button simply dismisses the # edit popup. Leaving it # up will ensure the next editing Index: Email.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/TopicListeners/Email.pm,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- Email.pm 15 Jan 2006 21:20:06 -0000 1.15 +++ Email.pm 16 Jan 2006 10:37:46 -0000 1.16 @@ -73,10 +73,8 @@ "The topic was created with the following files:\n\n" . join("\n",@filenames); - $self->_send_topic_email($topic, 1, "Created", 1, $from, $to, $cc, $bcc, - $notes); - - return ''; + return $self->_send_topic_email($topic, 1, "Created", 1, $from, $to, $cc, + $bcc, $notes); } sub topic_changed($$$$) { @@ -157,9 +155,9 @@ my @to_list = keys( %handled_addresses ); if ( @to_list ) { - $self->send_topic_changed_email($user_that_made_the_change, - $topic_orig, $topic,@to_list); - } + return $self->send_topic_changed_email($user_that_made_the_change, + $topic_orig, $topic,@to_list); + } return ''; } @@ -396,11 +394,9 @@ if ( $Codestriker::email_send_options->{comments_sent_to_topic_author} || $comment->{cc} ne "") { - if (!$self->doit(0, $comment->{topicid}, $from, $to, - join(', ',@cc_recipients), $bcc, - $subject, $body)) { - return "Failed to send topic creation email"; - } + return $self->doit(0, $comment->{topicid}, $from, $to, + join(', ',@cc_recipients), $bcc, + $subject, $body); } return ''; @@ -432,18 +428,18 @@ $self->doit($new, $topic->{topicid}, $from, $to, $cc, $bcc, $subject, $body); } -# Send an email with the specified data. Return false if the mail can't be -# successfully delivered, true otherwise. +# Send an email with the specified data. Return a non-empty message if the +# mail can't be successfully delivered, empty string otherwise. sub doit($$$$$$$$$) { my ($type, $new, $topicid, $from, $to, $cc, $bcc, $subject, $body) = @_; - return 1 if ($DEVNULL_EMAIL); + return '' if ($DEVNULL_EMAIL); my $smtp = Net::SMTP->new($Codestriker::mailhost); - defined $smtp || die "Unable to connect to mail server: $!"; + defined $smtp || return "Unable to connect to mail server: $!"; $smtp->mail($from); - $smtp->ok() || die "Couldn't set sender to \"$from\" $!, " . + $smtp->ok() || return "Couldn't set sender to \"$from\" $!, " . $smtp->message(); # $to has to be defined. @@ -454,7 +450,7 @@ for (my $i = 0; $i <= $#receiver; $i++) { if ($receiver[$i] ne "") { $smtp->recipient($receiver[$i]); - $smtp->ok() || die "Couldn't send email to \"$receiver[$i]\" $!, " . + $smtp->ok() || return "Couldn't send email to \"$receiver[$i]\" $!, " . $smtp->message(); } else { # Can't track down why, but sometimes an empty email address @@ -486,12 +482,12 @@ $smtp->datasend("\n"); $smtp->datasend($body); $smtp->dataend(); - $smtp->ok() || die "Couldn't send email $!, " . smtp->message(); + $smtp->ok() || return "Couldn't send email $!, " . smtp->message(); $smtp->quit(); - $smtp->ok() || die "Couldn't send email $!, " . smtp->message(); + $smtp->ok() || return "Couldn't send email $!, " . smtp->message(); - return 1; + return ''; } 1; |
From: <si...@us...> - 2006-05-22 11:37:23
|
User: sits Date: 06/05/22 04:34:17 Modified: bin codestriker.pl.base install.pl lib/Codestriker/TopicListeners Email.pm Log: Make email code handle unicode data correctly Index: codestriker.pl.base =================================================================== RCS file: /cvsroot/codestriker/codestriker/bin/codestriker.pl.base,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- codestriker.pl.base 19 May 2006 00:40:15 -0000 1.20 +++ codestriker.pl.base 22 May 2006 11:34:16 -0000 1.21 @@ -81,7 +81,7 @@ } # Make sure the STDOUT encoding is set to UTF8. -binmode STDOUT, ':utf8'; +# binmode STDOUT, ':utf8'; # Prototypes of subroutines used in this module. sub main(); Index: install.pl =================================================================== RCS file: /cvsroot/codestriker/codestriker/bin/install.pl,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- install.pl 18 Apr 2006 10:45:40 -0000 1.3 +++ install.pl 22 May 2006 11:34:16 -0000 1.4 @@ -73,6 +73,10 @@ name => 'Net::SMTP', version => '0' }, + { + name => 'MIME::QuotedPrint', + version => '0' + }, { name => 'DBI', version => '1.13' Index: Email.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/TopicListeners/Email.pm,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- Email.pm 16 Jan 2006 10:49:23 -0000 1.17 +++ Email.pm 22 May 2006 11:34:16 -0000 1.18 @@ -12,10 +12,12 @@ package Codestriker::TopicListeners::Email; -use Codestriker::TopicListeners::TopicListener; +use MIME::QuotedPrint qw(encode_qp); use Net::SMTP; use Sys::Hostname; +use Codestriker::TopicListeners::TopicListener; + # Separator to use in email. my $EMAIL_HR = "--------------------------------------------------------------"; # If true, just ignore all email requests. @@ -477,11 +479,23 @@ $smtp->datasend("In-Reply-To: $message_id\n"); } - $smtp->datasend("Subject: $subject\n"); + # Make sure the subject is appropriately encoded to handle UTF-8 + # characters. + # TODO: use Encode qw(encode); + # TODO: should be encode_qp(encode("UTF-8", $subject), '') + $smtp->datasend('Subject: =?UTF-8?Q?' . encode_qp($subject, '') . + '?=' . "\n"); + + # Set the content type to be text/plain with UTF8 encoding, to handle + # unicode characters. + $smtp->datasend("Content-Type: text/plain; charset=\"utf-8\"\n"); + $smtp->datasend("Content-Transfer-Encoding: quoted-printable\n"); # Insert a blank line for the body. $smtp->datasend("\n"); - $smtp->datasend($body); + + # TODO: should be $smtp->datasend(encode_qp(encode("UTF-8", $body))); + $smtp->datasend(encode_qp($body)); $smtp->dataend(); $smtp->ok() || return "Couldn't send email $!, " . smtp->message(); |
From: <si...@us...> - 2006-05-22 23:22:10
|
User: sits Date: 06/05/22 16:19:06 Modified: lib/Codestriker/Action ListTopicsRSS.pm SubmitNewComment.pm SubmitNewTopic.pm ViewTopicComments.pm lib/Codestriker/DB MySQL.pm lib/Codestriker/Model Comment.pm Project.pm Topic.pm lib/Codestriker/TopicListeners Email.pm Log: Initial UTF-8 support. Can now create topics with unicode titles and descriptions, can add unicode comments, and projects can have unicode titles and descriptions. Emails are also encoded appropriately. Something still outstanding is if the topic text itself is encoded. Index: ListTopicsRSS.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/ListTopicsRSS.pm,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ListTopicsRSS.pm 22 Dec 2004 00:19:07 -0000 1.2 +++ ListTopicsRSS.pm 22 May 2006 23:19:05 -0000 1.3 @@ -11,7 +11,7 @@ use strict; use Codestriker::Http::Template; -use Codestriker::Model::Topic; +use Codestriker::Model::Topic; use XML::RSS; # If the input is valid, list the appropriate topics. @@ -25,22 +25,22 @@ $http_response->error("This function has been disabled"); } - # Query the model for the specified data. - - my $mode = $http_input->get('mode'); - - my ( $sauthor, $sreviewer, $scc, $sbugid, - $sstate, $sproject, $stext, - $stitle, $sdescription, - $scomments, $sbody, $sfilename, - $sort_order) = Codestriker::Action::ListTopics::get_topic_list_query_params($http_input); - - # Query the model for the specified data. - my @topics = Codestriker::Model::Topic->query($sauthor, $sreviewer, $scc, $sbugid, - $sstate, $sproject, $stext, - $stitle, $sdescription, - $scomments, $sbody, $sfilename, - $sort_order); + # Query the model for the specified data. + + my $mode = $http_input->get('mode'); + + my ( $sauthor, $sreviewer, $scc, $sbugid, + $sstate, $sproject, $stext, + $stitle, $sdescription, + $scomments, $sbody, $sfilename, + $sort_order) = Codestriker::Action::ListTopics::get_topic_list_query_params($http_input); + + # Query the model for the specified data. + my @topics = Codestriker::Model::Topic->query($sauthor, $sreviewer, $scc, $sbugid, + $sstate, $sproject, $stext, + $stitle, $sdescription, + $scomments, $sbody, $sfilename, + $sort_order); # Display the data, with each topic title linked to the view topic screen. # If only a single project id is being searched over, set that id in the @@ -49,74 +49,74 @@ if ($sproject ne "") { @project_ids = split ',', $sproject; } - - # Print the header. Should really be application/rss+xml, except when - # people click on the link they get a pop-up asking for an application - # that knows how to show application/rss+xml. Very confusing, so we - # will just say it is xml, (which it is of coarse). The link tag in - # the template lists it as application/rss+xml. - print $query->header(-type=>'application/xml'); - - # Obtain a new URL builder object. - my $url_builder = Codestriker::Http::UrlBuilder->new($query); - - my $rss = new XML::RSS(version => '2.0'); - - my $this_url = - $url_builder->list_topics_url_rss($sauthor, $sreviewer, $scc, $sbugid, - $stext, $stitle, - $sdescription, $scomments, - $sbody, $sfilename, - [ split ',', $sstate] , \@project_ids); - - - $rss->channel(title=>$Codestriker::title, language=>"en",link=>$this_url); - - # For each topic, collect all the reviewers, CC, and bugs, and display it - # as a row in the table. Each bug should be linked appropriately. - foreach my $topic (@topics) { - - # do the easy stuff first, 1 to 1 mapping into the template. - my $link = - $url_builder->view_url($topic->{topicid}, -1, $mode, - $Codestriker::default_topic_br_mode); - - my $comment_link = $url_builder->view_comments_url($topic->{topicid}); - - my $description = $topic->{description}; - my $title = $topic->{title}; - - # Change to 1 to send out the list of files changes in the RSS description. - if (0) { - my (@filenames, @revisions, @offsets, @binary); - $topic->get_filestable( - \@filenames, - \@revisions, - \@offsets, - \@binary); - - $description .= "<p>" . join( "\n",@filenames); - } - - my @comments = $topic->read_comments(); - - $description .= "<p>Comments: " . scalar( @comments ) . ", "; - $description .= "State: " . $topic->{topic_state} . ", "; - $description .= "Author: " . Codestriker->filter_email($topic->{author}); - - $rss->add_item( - title=>$title, - permaLink=>$link, - description=>$description, - author=> Codestriker->filter_email($topic->{author}), - pubDate=>Codestriker->format_short_timestamp($topic->{creation_ts}), - category=>$topic->{project_name}, - comments=>$comment_link - ); - - } - - print $rss->as_string(); + + # Print the header. Should really be application/rss+xml, except when + # people click on the link they get a pop-up asking for an application + # that knows how to show application/rss+xml. Very confusing, so we + # will just say it is xml, (which it is of coarse). The link tag in + # the template lists it as application/rss+xml. + print $query->header(-type=>'application/xml'); + + # Obtain a new URL builder object. + my $url_builder = Codestriker::Http::UrlBuilder->new($query); + + my $rss = new XML::RSS(version => '2.0'); + + my $this_url = + $url_builder->list_topics_url_rss($sauthor, $sreviewer, $scc, $sbugid, + $stext, $stitle, + $sdescription, $scomments, + $sbody, $sfilename, + [ split ',', $sstate] , \@project_ids); + + + $rss->channel(title=>$Codestriker::title, language=>"en",link=>$this_url); + + # For each topic, collect all the reviewers, CC, and bugs, and display it + # as a row in the table. Each bug should be linked appropriately. + foreach my $topic (@topics) { + + # do the easy stuff first, 1 to 1 mapping into the template. + my $link = + $url_builder->view_url($topic->{topicid}, -1, $mode, + $Codestriker::default_topic_br_mode); + + my $comment_link = $url_builder->view_comments_url($topic->{topicid}); + + my $description = decode_utf8($topic->{description}); + my $title = decode_utf8($topic->{title}); + + # Change to 1 to send out the list of files changes in the RSS description. + if (0) { + my (@filenames, @revisions, @offsets, @binary); + $topic->get_filestable( + \@filenames, + \@revisions, + \@offsets, + \@binary); + + $description .= "<p>" . join( "\n",@filenames); + } + + my @comments = $topic->read_comments(); + + $description .= "<p>Comments: " . scalar( @comments ) . ", "; + $description .= "State: " . $topic->{topic_state} . ", "; + $description .= "Author: " . Codestriker->filter_email($topic->{author}); + + $rss->add_item( + title=>$title, + permaLink=>$link, + description=>$description, + author=> Codestriker->filter_email($topic->{author}), + pubDate=>Codestriker->format_short_timestamp($topic->{creation_ts}), + category=>decode_utf8($topic->{project_name}), + comments=>$comment_link + ); + + } + + print $rss->as_string(); } 1; Index: SubmitNewComment.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/SubmitNewComment.pm,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- SubmitNewComment.pm 16 Jan 2006 10:37:45 -0000 1.10 +++ SubmitNewComment.pm 22 May 2006 23:19:05 -0000 1.11 @@ -105,7 +105,7 @@ my $vars = {}; $vars->{'view_topic_url'} = $view_topic_url; $vars->{'view_comments_url'} = $view_comments_url; - $vars->{'comment'} = $comments; + $vars->{'comment'} = $comment->{data}; my $template = Codestriker::Http::Template->new("submitnewcomment"); $template->process($vars); Index: SubmitNewTopic.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/SubmitNewTopic.pm,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- SubmitNewTopic.pm 19 May 2006 00:40:15 -0000 1.25 +++ SubmitNewTopic.pm 22 May 2006 23:19:05 -0000 1.26 @@ -10,6 +10,7 @@ package Codestriker::Action::SubmitNewTopic; use strict; +use Encode; use File::Temp qw/ tempfile /; use FileHandle; @@ -339,7 +340,7 @@ # Indicate to the user that the topic has been created and an email has # been sent. my $vars = {}; - $vars->{'topic_title'} = $topic_title; + $vars->{'topic_title'} = $topic->{title}; $vars->{'email'} = $email; $vars->{'topic_url'} = $topic_url; $vars->{'reviewers'} = $reviewers; Index: ViewTopicComments.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Action/ViewTopicComments.pm,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- ViewTopicComments.pm 2 Jun 2005 11:31:00 -0000 1.16 +++ ViewTopicComments.pm 22 May 2006 23:19:05 -0000 1.17 @@ -10,6 +10,7 @@ package Codestriker::Action::ViewTopicComments; use strict; + use Codestriker::Http::Template; use Codestriker::Http::Render; use Codestriker::Model::Comment; Index: MySQL.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/DB/MySQL.pm,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- MySQL.pm 28 Sep 2004 22:15:18 -0000 1.6 +++ MySQL.pm 22 May 2006 23:19:05 -0000 1.7 @@ -46,7 +46,10 @@ # Not all versions of MySQL upport transactions. Its easiest for now to # just enable AUTO_COMMIT. - return $self->_get_connection(1, 1); + my $dbh = $self->_get_connection(1, 1); + $dbh->do("SET NAMES 'utf8'"); + $dbh->do("SET character_set_results='utf8'"); + return $dbh; } # Return the mapping for a specific type. Index: Comment.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Model/Comment.pm,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- Comment.pm 21 Feb 2005 11:25:26 -0000 1.20 +++ Comment.pm 22 May 2006 23:19:05 -0000 1.21 @@ -10,6 +10,7 @@ package Codestriker::Model::Comment; use strict; +use Encode qw(decode_utf8); use Codestriker::DB::DBI; @@ -130,7 +131,7 @@ $self->{filenumber} = $filenumber; $self->{filenew} = $filenew; $self->{author} = $author; - $self->{data} = $data; + $self->{data} = decode_utf8($data); $self->{date} = $timestamp; $self->{version} = $version; $self->{db_creation_ts} = $creation_ts; @@ -301,7 +302,7 @@ while (@data = $select_comment->fetchrow_array()) { my $comment = Codestriker::Model::Comment->new(); $comment->{topicid} = $topicid; - $comment->{data} = $data[0]; + $comment->{data} = decode_utf8($data[0]); $comment->{author} = $data[1]; $comment->{fileline} = $data[2]; $comment->{filenumber} = $data[3]; Index: Project.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Model/Project.pm,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- Project.pm 30 Sep 2004 10:27:09 -0000 1.4 +++ Project.pm 22 May 2006 23:19:05 -0000 1.5 @@ -10,6 +10,7 @@ package Codestriker::Model::Project; use strict; +use Encode qw(decode_utf8); use Codestriker::DB::DBI; @@ -93,8 +94,8 @@ while (@data = $select->fetchrow_array()) { my $project = {}; $project->{id} = $data[0]; - $project->{name} = $data[1]; - $project->{description} = $data[2]; + $project->{name} = decode_utf8($data[1]); + $project->{description} = decode_utf8($data[2]); $project->{version} = $data[3]; $project->{state} = _state_id_to_string($data[4]); if (!defined $state || $project->{state} eq $state) @@ -135,8 +136,8 @@ if ($success) { # Populate return object. $project->{id} = $id; - $project->{name} = $name; - $project->{description} = $description; + $project->{name} = decode_utf8($name); + $project->{description} = decode_utf8($description); $project->{version} = $version; $project->{state} = _state_id_to_string($state); } Index: Topic.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/Model/Topic.pm,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- Topic.pm 15 Feb 2005 09:00:04 -0000 1.43 +++ Topic.pm 22 May 2006 23:19:05 -0000 1.44 @@ -10,6 +10,7 @@ package Codestriker::Model::Topic; use strict; +use Encode qw(decode_utf8); use Codestriker::DB::DBI; use Codestriker::Model::File; @@ -202,6 +203,11 @@ Codestriker::DB::DBI->release_connection($dbh, $success); + # Mark the user fields as UTF8. + $self->{title} = decode_utf8($title); + $self->{description} = decode_utf8($description); + $self->{document} = decode_utf8($document); + die $dbh->errstr unless $success; } @@ -321,12 +327,12 @@ # successful. if ($success) { $self->{author} = $author; - $self->{title} = $title; + $self->{title} = decode_utf8($title); $self->{bug_ids} = join ', ', @bugs; $self->{reviewers} = join ', ', @reviewers; $self->{cc} = join ', ', @cc; - $self->{description} = $description; - $self->{document} = $document; + $self->{description} = decode_utf8($description); + $self->{document} = decode_utf8($document); $self->{creation_ts} = $creationtime; $self->{modified_ts} = $modifiedtime; $self->{topic_state} = $Codestriker::topic_states[$state]; @@ -634,11 +640,11 @@ } # Update the topic object's properties. - $self->{title} = $new_title; + $self->{title} = decode_utf8($new_title); $self->{author} = $new_author; $self->{repository} = $new_repository; $self->{project_id} = $new_projectid; - $self->{description} = $new_description; + $self->{description} = decode_utf8($new_description); $self->{modified_ts} = $modified_ts; $self->{topic_state} = $new_state; $self->{topic_state_id} = $new_stateid; Index: Email.pm =================================================================== RCS file: /cvsroot/codestriker/codestriker/lib/Codestriker/TopicListeners/Email.pm,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- Email.pm 22 May 2006 11:34:16 -0000 1.18 +++ Email.pm 22 May 2006 23:19:06 -0000 1.19 @@ -14,7 +14,9 @@ use MIME::QuotedPrint qw(encode_qp); use Net::SMTP; +use MIME::Base64; use Sys::Hostname; +use Encode qw(encode); use Codestriker::TopicListeners::TopicListener; @@ -481,9 +483,8 @@ # Make sure the subject is appropriately encoded to handle UTF-8 # characters. - # TODO: use Encode qw(encode); - # TODO: should be encode_qp(encode("UTF-8", $subject), '') - $smtp->datasend('Subject: =?UTF-8?Q?' . encode_qp($subject, '') . + $smtp->datasend('Subject: =?UTF-8?Q?' . + encode_qp(encode("UTF-8", $subject), '') . '?=' . "\n"); # Set the content type to be text/plain with UTF8 encoding, to handle @@ -494,8 +495,9 @@ # Insert a blank line for the body. $smtp->datasend("\n"); - # TODO: should be $smtp->datasend(encode_qp(encode("UTF-8", $body))); - $smtp->datasend(encode_qp($body)); + # Encode the mail body using quoted-printable to handle unicode + # characters. + $smtp->datasend(encode_qp(encode("UTF-8", $body))); $smtp->dataend(); $smtp->ok() || return "Couldn't send email $!, " . smtp->message(); |