On Thu, Jan 27, 2005 at 11:51:45AM +0100, Fabio Tranchitella wrote: > Il giorno mer, 26-01-2005 alle 22:01 +0100, Denis Barbier ha scritto: > > Hi Fabio, > > I would like to fix these bugs. Will you have time soon to provide a > > patch? Otherwise I will work on them. > > Hi Denis, > I've prepared the patch two weeks ago but I've missed to send it to > the bts, sorry. Here there is a patch for #288532, #292472 and #288533.
Ok, I made many cosmetic changes to the code, I believe it is more structured now. > Now podebconf-report-po: > - uses the DEBMAIL environment variable to override the submitter > of the emails (if available). > - allows the editing of mail headers (subject, from and whatever else), > - allows to set the reply-to field to a bug report in BTS (--bts) > - can send a bug against the package to warn the maintainer about > the outdated translations of the package (--report, very useful > in combination with --bts to track the replies of the translators) I renamed --report into --submit. The other visible change is that translation teams are no more Cc'ed but put in the To: field. The reason is that I did not know what to do if a Cc header was also present in mail comments. Can you please test http://people.debian.org/~barbier/tmp/po-debconf_0.8.19_all.deb ? Here is the podebconf-report-po script. Denis
#!/usr/bin/perl -w # podebconf-report-po, Send outdated debconf PO files to the last translator # Copyright (C) 2004, 2005 Fabio Tranchitella <[EMAIL PROTECTED]> # Denis Barbier <[EMAIL PROTECTED]> # # This program 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 2 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ## Release information my $PROGRAM = "podebconf-report-po"; my $VERSION = "0.06"; ## Loaded modules, require libmail-sendmail-perl use strict; eval q{use Mail::Sendmail;}; die "$PROGRAM: This program requires the libmail-sendmail-perl package.\n". "$PROGRAM: Aborting!\n" if $@; use MIME::Base64; use MIME::QuotedPrint; use Getopt::Long; use POSIX; ## Global variables my $HELP_ARG = 0; my $VERSION_ARG = 0; my $VERBOSE_ARG = 0; my $SUBMIT_ARG = 0; my $FORCE_ARG = 0; my $LANGUAGETEAM_ARG = 0; my $SMTP_ARG = ""; my $TEMPLATE_ARG = ""; my $DEFAULT_ARG = 0; my $PACKAGE_ARG = ""; my $FROM_ARG = (exists($ENV{'DEBEMAIL'}) ? $ENV{'DEBEMAIL'} : ""); my $BTS_ARG = ""; my $DEADLINE_ARG = ""; my $PODIR_ARG = ""; my @TOPDIRS = qw{../.. .. .}; my $PODIR = ''; my $EDITOR = '/usr/bin/sensible-editor'; ## Default templates my $comments = "# Lines beginning with a number sign are comments, they are removed when # sending mails. If a line is composed of a # followed by a 'Name: Value' # pair, it is interpreted as a mail header field and is passed to your mail # transport agent. You can edit/add/remove those header fields."; my $SUBJECT_TRANSLATOR = "Please update debconf PO translation for the package <package>"; my $BODY_TRANSLATOR = $comments. " # # From: <from> # Subject: <subject> # Reply-To: <reply-to> # # This mail will be sent to the following people: <filelist> Hi, you are noted as the last translator of the debconf translation for <package>. The English template has been changed, and now some messages are marked \"fuzzy\" in your translation or are missing. I would be grateful if you could take the time and update it. <reply> <deadline> Thanks, "; my $SUBJECT_SUBMIT = "debconf PO translations for the package <package> are outdated"; my $BODY_SUBMIT = $comments. " # # From: <from> # Subject: <subject> Package: <package> Version: N/A Severity: wishlist Tags: l10n The following debconf translations are outdated: <filelist> Translators, please send your translations to this bugreport. <deadline> Thanks, "; my $SUBJECT = ''; my $BODY = ''; ## Handle options GetOptions ( "help" => \$HELP_ARG, "version" => \$VERSION_ARG, "v|verbose" => \$VERBOSE_ARG, "f|force" => \$FORCE_ARG, "podir=s" => \$PODIR_ARG, "smtp=s" => \$SMTP_ARG, "template=s" => \$TEMPLATE_ARG, "default" => \$DEFAULT_ARG, "languageteam" => \$LANGUAGETEAM_ARG, "package=s" => \$PACKAGE_ARG, "deadline=s" => \$DEADLINE_ARG, "from=s" => \$FROM_ARG, "bts=s" => \$BTS_ARG, "submit" => \$SUBMIT_ARG ) or &Help_InvalidOption; &Help_PrintVersion if $VERSION_ARG; &Help_PrintHelp if $HELP_ARG; ## Try to find default editor $EDITOR = $ENV{'EDITOR'} if exists($ENV{'EDITOR'}); $EDITOR = $ENV{'VISUAL'} if exists($ENV{'VISUAL'}); ## Try to locate the PO directory if ($PODIR_ARG eq "") { foreach my $d (@TOPDIRS) { $PODIR = "$d/debian/po" if (-d "$d/debian/po"); } } else { $PODIR = $PODIR_ARG; } die "Directory po not found, exiting!\n" if $PODIR eq ""; die "Wrong argument: $PODIR is not a directory!\n" unless -d $PODIR; ## Try to find the maintainer e-mail address and the package name if ($PACKAGE_ARG eq "" or $FROM_ARG eq "") { my $CONTROL = ''; foreach my $d (@TOPDIRS) { $CONTROL = "$d/debian/control" if (-f "$d/debian/control"); } if ($CONTROL eq '') { foreach my $d (@TOPDIRS) { $CONTROL = "$d/debian/control.in" if (-f "$d/debian/control.in"); } } if (-f $CONTROL) { ## Only read the first stanza local $/ = "\n\n"; open (CNTRL, "< $CONTROL") or die "Unable to read $CONTROL: $!\n"; my $text = <CNTRL>; close (CNTRL) or die "Unable to close $CONTROL: $!\n"; if ($PACKAGE_ARG eq "" && $text =~ m/^Source: (.*)/m) { $PACKAGE_ARG = $1; } if ($FROM_ARG eq "" && $text =~ m/^Maintainer: (.*)/m) { $FROM_ARG = $1; } } } Verbose("Package: $PACKAGE_ARG\nMaintainer: $FROM_ARG"); if ($DEADLINE_ARG ne "") { $DEADLINE_ARG = "\nThe deadline for receiving the updated translation is $DEADLINE_ARG."; } my $REPLY = ''; if ($BTS_ARG =~ m/^\d+$/) { $BTS_ARG .= "[EMAIL PROTECTED]"; $REPLY = "Please respect the Reply-To: field and send your updated translation to\n$BTS_ARG."; } else { $REPLY = "Please send the updated file to me, or submit it as a wishlist bug\nagainst <package>."; } if ($SUBMIT_ARG) { $BODY = $BODY_SUBMIT; $SUBJECT = $SUBJECT_SUBMIT; } else { $BODY = $BODY_TRANSLATOR; $SUBJECT = $SUBJECT_TRANSLATOR; } ## Apply the values to the subject and to the body of the message $SUBJECT =~ s/<package>/$PACKAGE_ARG/g; $BODY =~ s/<reply>/$REPLY/g; $BODY =~ s/<reply-to>/$BTS_ARG/g; $BODY =~ s/\n# Reply-To: \n/\n/; $BODY =~ s/<subject>/$SUBJECT/g; $BODY =~ s/<package>/$PACKAGE_ARG/g; $BODY =~ s/<from>/$FROM_ARG/g; $BODY =~ s/\n<deadline>/$DEADLINE_ARG/g; ## Check every file with .po extension in $PODIR ... Verbose("Checking for PO files in $PODIR"); opendir(DIR, $PODIR); my $poFiles = {}; foreach my $poFile (grep(/\.po$/, readdir(DIR))) { local $/ = "\n\n"; $poFiles->{$poFile} = {}; my $outdated = 0; my $found_header = 0; open (PO, "< $PODIR/$poFile") or die "Unable to read $PODIR/$poFile: $!\n"; while (<PO>) { if ($found_header == 0 && m/msgid ""\nmsgstr/s) { $found_header = 1; if (m/^"Last-Translator: (.*?)(\\n)?"$/m) { $poFiles->{$poFile}->{translator} = $1 if $1 ne 'FULL NAME <[EMAIL PROTECTED]>'; } else { warn "Warning: $poFile: Unable to determine last translator. Skipping file!\n"; last; } if (m/^"Content-Type: .*; charset=(.*?)(\\n)?"$/m) { $poFiles->{$poFile}->{charset} = $1; } else { warn "Warning: $poFile: Unable to determine charset. Skipping file!\n"; last; } if ($LANGUAGETEAM_ARG && m/^"Language-Team: (.*?)(\\n)?"$/m) { $poFiles->{$poFile}->{team} = $1 if $1 ne 'LANGUAGE <[EMAIL PROTECTED]>'; } next; } # Ignore outdated msgids next unless m/^msgid /m; # Check for fuzzy or missing translations if (m/^#, .*fuzzy/m or m/\nmsgstr ""$/s) { $outdated = 1; last; } } close (PO) or die "Unable to close $PODIR/$poFile: $!\n"; delete $poFiles->{$poFile} unless $outdated; } closedir(DIR); if (keys %$poFiles) { print "Outdated files: ".join(' ', keys %$poFiles)."\n"; } else { print "No outdated files\n"; exit(0); } my $filelist = ''; if ($SUBMIT_ARG) { $filelist = join(' ', keys %$poFiles)."\n"; } else { foreach my $poFile (keys %$poFiles) { $filelist .= '### ' . $poFile . ': ' . $poFiles->{$poFile}->{translator}; $filelist .= ', ' . $poFiles->{$poFile}->{team} if defined($poFiles->{$poFile}->{team}); $filelist .= "\n"; } # Remove non-ASCII characters $filelist =~ s/[\x80-\xff]/?/g; } $BODY =~ s/<filelist>\n/$filelist/g; my %headers = (); if ($TEMPLATE_ARG eq "") { $BODY = &OpenEditor($EDITOR, $BODY) if not $DEFAULT_ARG; } else { $BODY = &ReadFile($TEMPLATE_ARG); } %headers = &ParseHeaders($BODY); $BODY = &RemoveHeaders($BODY); my @mails = (); if ($SUBMIT_ARG) { $BODY =~ s/<filelist>/$filelist/g; my %mail = ( From => $FROM_ARG, To => "[EMAIL PROTECTED]", Subject => $SUBJECT ); $mail{body} = encode_qp($BODY); @mails = (\%mail); } else { $BODY = encode_qp($BODY); foreach my $file (keys %$poFiles) { my $file_encoded = encode_base64(&ReadFile($PODIR . "/" . $file)); my %mail = ( From => $FROM_ARG, To => $poFiles->{$file}->{translator}, Subject => $SUBJECT ); $mail{To} .= ", ". $poFiles->{$file}->{team} if defined $poFiles->{$file}->{team}; my $boundary = "=" . time() . "="; $mail{'content-type'} = "multipart/mixed; boundary=\"$boundary\""; $mail{body} = <<_EOF_; --$boundary Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable $BODY --$boundary Content-Type: text/x-gettext; name="$file"; charset="$poFiles->{$file}->{charset}" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="$file" $file_encoded --$boundary-- _EOF_ push(@mails, \%mail); } } # Add mail headers foreach my $refmail (@mails) { foreach my $h (keys(%headers)) { $refmail->{$h} = $headers{$h}; } $refmail->{smtp} = $SMTP_ARG if ($SMTP_ARG ne ''); } if (!$FORCE_ARG) { if ($SUBMIT_ARG) { print "Ready to send the bug report against the package $PACKAGE_ARG, are you sure? [y/N] "; } else { print "Ready to send the emails, are you sure? [y/N] "; } my $line = <>; chop $line; exit(0) if ($line ne "Y" and $line ne "y"); } # Make Perl compiler quiet print $Mail::Sendmail::error . $Mail::Sendmail::error if 0; foreach my $mail (@mails) { sendmail(%{$mail}) || print "Couldn't send the email: $Mail::Sendmail::error\n"; } exit(0); ############################################################################### sub OpenEditor { my $editor = shift; my $body = shift; my $opts = ""; my $tmpnam = tmpnam(); open (OUT, "> $tmpnam") or die ("Couldn't write $tmpnam: $!\nExiting!\n"); print OUT $body; close(OUT) or die ("Couldn't close $tmpnam: $!\nExiting!\n"); $opts = "-f" if ($editor eq "vim"); system("$editor $opts $tmpnam"); $body = &ReadFile($tmpnam) if (-f $tmpnam); unlink($tmpnam); return $body; } sub ParseHeaders { my $body = shift; my %headers = (); while ($body =~ s/^#\s*([^\n]*)\n//s) { my $comment = $1; if ($comment =~ m/^([^:\n]+):\s*([^\n]+)\n$/) { $headers{$1} = $2; } } return %headers; } sub RemoveHeaders { my $body = shift; # First remove comments 1 while $body =~ s/^#[^\n]*\n//s; # Optional empty lines $body =~ s/^\s+//s; return $body; } sub ReadFile { my $file = shift; local $/ = undef; open(FILE, "< $file") or die ("Couldn't read $file: $!\nExiting!\n"); my $body = <FILE>; close(FILE) or die ("Couldn't close $file: $!\nExiting!\n"); return $body; } ## Handle invalid arguments sub Help_InvalidOption { print STDERR "Try `${PROGRAM} --help' for more information.\n"; exit 1; } ## Print the usage message and exit sub Help_PrintHelp { print <<_EOF_; Usage: ${PROGRAM} [OPTIONS] Send outdated debconf PO files to the last translators. Options: --help display this help and exit --version display version information and exit -v, --verbose display additional information -f, --force send the email without confirmation --podir=DIRECTORY specify where are located the PO files --smtp=SERVER specify SMTP server for mailing (default localhost) --template=TEMPLATE specify file to use it as template for the emails --default don't open the editor and use the template as is --package=PACKAGE specify the name of the package --from=MAINTAINER specify the name and the email address of the sender --deadline=DEADLINE specify the deadline for receiving the updated translations --languageteam send the email also to the Language Team --submit send a bug report against the package with a report of the outdated debconf translations --bts=BUGNUMBER specify the Debian bug number to set as reply-to _EOF_ exit 0; } ## Print the version text and exit sub Help_PrintVersion { print <<_EOF_; ${PROGRAM} $VERSION Copyright (C) 2004, 2005 Fabio Tranchitella and Denis Barbier. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. _EOF_ exit 0; } sub Verbose { my $msg = shift; return unless $VERBOSE_ARG; $msg =~ s/^/**${PROGRAM}: /mg; print STDERR $msg."\n"; }