ddts-rev version 0.9.4
Bonjour,
- nouvelle option : stats
affiche des statistiques sur les descriptions disponibles ;
- ajout d'un mode verbeux :
- quand debug vaut 1 ou 2, la même quantité de message est affichée,
avec la valeur 1, les courriels sont envoyés au traducteur, avec 2 ils
sont envoyé au relecteur,
- l'ancien niveau 2, est le niveau 3 actuel ;
- correction d'un bogue qui traine depuis la version 0.7 : les espaces
entre « Description(.*): » et la description courte étaient supprimés,
ils ne le sont plus ;
- modification du code pour qu'il soit un peu plus compact.
Pour info :
Je suis en train de modifier le script pour pouvoir l'utiliser avec les
fichiers de traduction wml, po, etc.
Nicolas
--
#! /usr/bin/perl
use strict;
### Config part
# where to put all the files
# Things you MUST change
my $home="/home/nico/Mail/rel/ddts/";
my $mail_from='Nicolas Bertolissio <nico.bertol@wanadoo.fr>';
my $mail_begin="Bonjour,\n\n"
."Tu trouveras en attachement un fichier diff entre la version que tu as\n"
."soumise au ddts et une version corrigée par mes soins de la description\n"
."de ce paquet. Si tu es d'accord avec les corrections, merci de renvoyer\n"
."une version corrigée au ddts. Dans le cas contraire, n'hésite pas à me\n"
."contacter.\n";
my $mail_end="\na+\n\nNicolas\n";
# Things you can change
my $debug=1; # level of verbosity 0..1
my $desc_ok="DescOk.txt"; # filename for ok description list
my $comment=">> "; # comment string
my $linenumber="ligne %d :"; # new comment line, must contain %d
my $sendnew="no"; # if set to "yes", send the new description
my $selfsend="yes"; # if set to "yes", you will be sent a copy of outgoing mails
my $mail_title="[relecture] %s"; # must contain %s
my $mail_enc="8bits";
my $mail_charset="iso-8859-1";
my $todo="todo"; # extention of files waiting for a review (*)
my $rev="relu"; # extention of files you already reviewed
my $new="newmail"; # extention of newly created mail files (*)
my $mail="mail"; # extention of ready to be sent mail files
my $sent="mailSent"; # extention of mails sent (*)
# files in category marked with (*) are automatically generated.
# Don't edit them, change there name before it.
### End of the config part
=head1 NAME
ddts-rev - a tool to ease the work of reviewer of ddts
=head1 SYNOPSIS
ddts-rev [parse|mail|clean]
=head1 DESCRIPTION
This program helps the reviewer of package description translation with the ddts.
Here is the basical review process if you use this tool:
=over 4
=item o You get a daily report from the ddts, containing changed translations.
Pass this mail to the standard input of this script, providing the I<parse> option.
It will create two files called I<pkg-name> and I<pkg-name.todo> for each translation
in the mail. The first one is the unchanged translation, for internal use.
The second is a template to ease your review.
=item o You do your review
For that, rename I<pkg-name.todo> to I<pkg-name.relu>. Then, change the description
found there, and add any comments you want in line starting with:
'>> '
=item o You're done with the review and want to send your work to translators back.
Call the script with the I<mail> option. It will make a diff of your version and
the translators one. If the two versions are equal, nothing will be done. Else,
the script will send a mail in mime format with three parts:
=over 4
=item - the comments you've put in the comment lines
=item - the version resulting of your review
If the variable $sendnew is set to "yes"
=item - the diff between your version and the translator one.
=back
Then, the script will show you the resulting mail, and prompt you if you want to
send it or not. Be carfull with sending mails. Please make sure you are really
done with the review before.
Lastly, the script will save the sent mail to I<pkg-name.mailSent> to make sure
the mail won't be sent several times if you run the script several times.
=item o clean your workspace
Calling the script with the I<clean> option removes all temp files like *~ ones,
or the ones created internally. If I<pkg-name.todo> and I<pkg-name.relu> both
exists, the script will remove the first. So, be carfull when using this option...
=item o stats gives statistics
Print some statistics about the descriptions review process
=back
=cut
my $version="0.9.4";
if (! -d $home) {
mkdir $home || die "Can't create $home. Is the script configured?\n";
}
sub parse_report {
my $pkg; # package name
my $translator; # translator address
my $desc; # english description
my $trans; # translated description
my $lang; # language translated into
my $nonamecount=0; # extention number for noname files
my $reportId; # Message-Id field
my $reportDate; # Date of ddts report
# Read the mail header
# Get the 'Message-Id:' field so we can use 'In-Reply-To:' when sending email
# Get teh 'Date:' field for use in unamed descriptions filename
while (<>) {
last if (m,^$,);
if (m,^message-id: ,i) {
chomp($reportId = $');
$debug && print "Message-Id: $reportId\n";
}
if (m,^date: ,i) {
chomp($reportDate = $');
$debug && print "Date: $reportDate\n"
}
}
# Read all packages
while (<>) {
# Read the translator name
chomp($translator=$_);
$debug && print "Translator: $translator\n";
last if $translator eq "";
# Read the package name
chomp($pkg=<>);
$debug && print "Package: $pkg\n";
# Read the english description
if (<> =~ m,^Description: *(.*)$,) {
$desc="$1\n";
$desc .= $_ while (($_ = <>) =~ m,^ ,);
}
$debug>2 && print "Description: $desc\n";
# Read the translated description
if (m,^Description-(..)(_..)?: *(.*)$,) {
$lang="$1$2";
$trans="$3\n";
$trans .= $_ while (($_ = <>) =~ m,^ ,);
}
$debug>2 && print "Description-$lang: $trans\n";
if (m,^$,) {
# Search for package name if not provided by ddts
if ($pkg eq "") {
my $shortdesc=$desc;
$shortdesc =~ s/\n.*//mg;
$debug && print "short description: $shortdesc\n";
open APT, "apt-cache search '$shortdesc'|" || die "Unable to run apt-cache: $!\n" ;
chomp ($pkg = <APT>);
close APT || die "Unable to run apt-cache: $!\n";
$pkg =~ s/^([^ ]*) .*$/$1/;
if ($pkg ne "") {
print "I guess '$shortdesc' referes to '$pkg'\n";
} else {
$pkg="noname-$reportDate-".$nonamecount++;
print "I can't guess '$shortdesc', output file named '$pkg'\n";
}
}
if ($pkg eq "" ||
$translator eq "" ||
$desc eq "" ||
$trans eq "" ||
$lang eq "") {
die "Parse error: empty line before the package is well defined.\n"
."Are you sure I'm parsing a repport from the ddts?\n"
.undef($pkg).": $pkg";
}
warn "$home/$pkg.$todo overwritten...\n" if -e "$home/$pkg.$todo";
# Outputs the package
open PKG, ">$home/$pkg" || die "Can't open $home/$pkg\n";
open TODO, ">$home/$pkg.$todo" || die "Can't open $home/$pkg.$todo\n";
my $str = "Translator: $translator\n"
."ddts Id: $reportId\n"
."Description: $desc"
."Description-$lang: $trans";
$debug>2 && print "$str\n";
print PKG "$str\n";
print TODO "$str\n";
close PKG || die "Can't write '$home/$pkg': $!\n";
close TODO || die "Can't write '$home/$pkg.$todo': $!\n";
# Move rev to rev.old
if (-e "$home/$pkg.$rev") {
print "Moving $pkg.$rev -> $pkg.$rev.old\n";
rename "$home/$pkg.$rev", "$home/$pkg.$rev.old";
}
# Remove the mailSent
if (-e "$home/$pkg.$sent") {
print "removing $pkg.$sent\n";
unlink "$home/$pkg.$sent";
}
# clears the variables
$pkg=$translator=$desc=$trans=$lang = "";
}
# stop when encountering the signature
last if m,^-- ?$,;
}
}
sub make_mails {
my $boundary;
my $BCount=0;
opendir (PKGLIST,$home) || die "Cannot read the content of $home: $!\n";
chdir $home || die "Can't chdir to $home: $!\n";
open OK, ">$home/$desc_ok" || die "Can't create $desc_ok: $!";
foreach (readdir(PKGLIST)) {
next if /\.$todo$/;
next if /\.$rev$/;
next if /\.diff$/;
next if /\.$new$/;
next if /\.$mail$/;
next if /\.$sent$/;
my $pkg = $_;
if (-e "$home/$pkg.$rev" && -e "$home/$pkg") {
if (-e "$home/$pkg.$sent") {
print "$pkg.$sent exists. I won't send the same mail twice\n";
next;
}
$boundary="----------=_".scalar(time)."-$$-".$BCount++;
# get translator name and report id
open PKG, "$home/$pkg" || die "Can't read $pkg: $!\n";
chomp(my $translator=<PKG>);
$translator =~ s/Translator: //;
$debug && print "Translator: $translator\n";
chomp(my $reportid=<PKG>);
$reportid =~ s/ddts Id: //;
$debug && print "ddts Id: $reportid\n";
open TMP, ">$home/$pkg.tmp" || die "Can't create $pkg.tmp: $!\n";
print TMP while <PKG>;
close TMP || die "Can't write $pkg.tmp: $!\n";
close PKG || die "Can't close $pkg: $!\n";
# build the mail
my $mail = "From: $mail_from\n"
."To: ".($debug>1?$mail_from:$translator)."\n";
$mail .= "Cc: $mail_from\n" if ($selfsend eq "yes");
$mail .= "Subject: ".sprintf ($mail_title, $pkg)."\n"
."In-Reply-To: $reportid\n"
."Mime-Version: 1.0\n"
."Content-Type: multipart/mixed; boundary=\"$boundary\"\n"
."Content-Disposition: inline\n"
."Content-Transfer-Encoding: $mail_enc\n"
."User-Agent: ddts review helper\n\n\n"
."--$boundary\n"
."Content-Type: text/plain; charset=$mail_charset\n"
."Content-Disposition: inline\n"
."Content-Transfer-Encoding: $mail_enc\n\n"
.$mail_begin;
open REV, "$home/$pkg.$rev" || die "Can't open $pkg.$rev: $!";
<REV>; <REV>;
# Prepare the diff and add the new version to the mail
open NEW,">$home/$pkg.new" || die "Can't create $pkg.new: $!";
my $linecount=0;
my $lastline=0;
while (<REV>) {
if (m,^$comment,) {
if ($linecount!=$lastline) {
$lastline=$linecount;
$mail .= "\n".sprintf($linenumber, $linecount)."\n";
}
$mail .= $';
} else {
print NEW ;
$linecount++;
}
}
close NEW || die "Can't write $pkg.new: $!\n";
close REV || die "Can't close $pkg.$rev: $!\n";
$mail .= $mail_end;
if ($sendnew eq "yes") {
$mail .= "\n\n"
."--$boundary\n"
."Content-Type: text/plain; charset=$mail_charset\n"
."Content-Disposition: attachment; filename=\"$pkg.new\"\n\n";
open NEW, "$home/$pkg.new" || die "Can't open $pkg.new: $!\n";
$mail .= $_ while <NEW>;
close NEW || die "Can't close $pkg.new: $!\n";
}
$mail .= "\n\n"
."--$boundary\n"
."Content-Type: text/plain; charset=$mail_charset\n"
."Content-Disposition: attachment; filename=\"$pkg.diff\"\n\n";
rename "$home/$pkg", "$home/$pkg.tmp1";
rename "$home/$pkg.tmp", "$home/$pkg";
if (!system "diff -u $home/$pkg $home/$pkg.new > $home/$pkg.diff") {
# empty diff
print OK $pkg."\n";
} else {
# puts the diff
open DIFF, "$home/$pkg.diff" || die "Can't open $pkg.diff: $!\n";
$mail .= $_ while <DIFF>;
close DIFF || die "Can't close $pkg.diff: $!\n";
# Ends the mime stuff
$mail .= "--$boundary--\n\n";
print "Here is the mail:\n$mail\nDo you want to send it [y/N] ?\n";
if (<> =~ m/^[yY]/) {
open SENT, ">$home/$pkg.$sent" || die "Can't create $pkg.$sent: $!\n";
print SENT $mail;
close SENT || die "Can't write $pkg.$sent: $!\n";
open SENDMAIL,"| /usr/lib/sendmail -t -oi -oem" || die "Can't run sendmail: $!\n";
print SENDMAIL $mail;
close SENDMAIL || die "Can't run sendmail: $!\n";
print "Mail sent\n";
} else {
open MAIL, ">$home/$pkg.$new" || die "Can't create $pkg.$new: $!\n";
print MAIL $mail;
close MAIL || die "Can't write $pkg.$new: $!";
print "Mail saved as $pkg.$new\n";
}
}
rename "$home/$pkg", "$home/$pkg.tmp";
rename "$home/$pkg.tmp1", "$home/$pkg";
$debug>2 || unlink "$home/$pkg.new";
$debug>2 || unlink "$home/$pkg.diff";
$debug>2 || unlink "$home/$pkg.tmp";
}
}
close OK || die "Can't write $desc_ok: $!";
closedir PKGLIST || die "Cannot read the content of $home: $!\n";
}
sub clean {
opendir (PKGLIST,$home) || die "Cannot read the content of $home: $!\n";
foreach (readdir(PKGLIST)) {
if (/~$/ ||
/\.new$/ ||
/\.diff$/ ||
/\.tmp$/) {
print "Remove $_\n";
unlink "$home/$_";
}
if (! /\./) {
my $pkg = $_;
if (-e "$home/$pkg.$rev" && -e "$home/$pkg.$todo") {
print "Remove $pkg.$todo\n";
unlink "$home/$pkg.$todo";
}
}
}
closedir PKGLIST || die "Cannot read the content of $home: $!\n";
}
sub statistics {
my $count_pkg=0;
my $count_todo=0;
my $count_relu=0;
my $count_new=0;
my $count_mail=0;
my $count_sent=0;
my $count_ok=0;
opendir (PKGLIST,$home) || die "Cannot read the content of $home: $!\n";
foreach (readdir(PKGLIST)) {
next if /\.$todo$/;
next if /\.$rev$/;
next if /\.diff$/;
next if /\.$new$/;
next if /\.$mail$/;
next if /\.$sent$/;
my $pkg = $_;
if ((-e "$home/$pkg.$rev" || -e "$home/$pkg.$todo") && -e "$home/$pkg") {
$count_pkg++;
$count_todo++ if (-e "$home/$pkg.$todo");
$count_new++ if (-e "$home/$pkg.$new");
$count_mail++ if (-e "$home/$pkg.$mail");
$count_relu++ if (-e "$home/$pkg.$rev");
$count_sent++ if (-e "$home/$pkg.$sent");
}
}
closedir PKGLIST || die "Cannot read the content of $home: $!\n";
if (-e "$home/$desc_ok") {
open OK, "$home/$desc_ok" || die "Can't open $desc_ok: $!\n";
$count_ok++ while (<OK>);
close OK || die "Can't close $desc_ok: $!\n";
}
printf ("new mail: %5d\n", $count_new);
printf (" to send: %5d\n", $count_mail);
printf (" sent: %5d\n", $count_sent);
printf (" ok: %5d\n", $count_ok);
print (" -----------\n");
printf ("reviewed: %5d\n", $count_relu);
printf (" todo: %5d\n", $count_todo);
print ("===============\n");
printf (" total: %5d\n", $count_pkg);
}
my $cmd=shift;
if ($cmd eq "parse") {
parse_report();
} elsif ($cmd eq "mail") {
make_mails();
} elsif ($cmd eq "clean") {
clean();
} elsif ($cmd eq "stats") {
statistics();
} else {
my $me=$0;
$me=~s,^.*?/([^/]*)$,$1,;
die "Usage $me [parse|mail|clean]\n"
." parse: read a ddts from the standard input and change the files in $home\n"
." mail: create the pkg.newmail files which you should edit and send\n"
." clean: remove : \n"
." - *~\n"
." - the $todo when a $rev exists\n"
." - all tmp files (.diff, .newi, .tmp)\n"
."\n$me version $version\n";
}
=head1 AUTHORS
until version 0.7: Martin Quinson <Martin.Quinson@ens-lyon.fr>
present maintainer: Nicolas Bertolissio <nico.bertol@wanadoo.fr>
=cut
Reply to: