[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

ddts-rev version 0.7



Hello,

Au programme des changements:
 - nouvelle procedure d'utilisation. Maintenant, on met les commentaires
   dans le meme fichier que la ou on fait la relecture. Comme ca, j'espere
   que Nico sera content, et qu'il l'utilisera. 
   
   De toute facon, Nico, si tu trouves encore que c'est pas pratique, je le
   remodifierais ;)

 - Maintenant, la documentation est incluse dans le script. En anglais,
   désolé. La preuve, je colle ce que ca fait quand on tape 
   
   perldoc -F `which ddts-rev`
   
   DDTS-REV(1)    User Contributed Perl Documentation    DDTS-REV(1)


SYNOPIS
       ddts-rev [parse|mail|clean]

DESCRIPTION
       This program helps the reviewer of package description
       translation with the ddts.  Here is the basical review
       process if you use this tool:

       o You get a daily report from the ddts, containing changed
       translations.
           Pass this mail to the standard input of this script,
           providing the parse option.  It will create two files
           called pkg-name and pkg-name.todo for each translation
           in the mail. The first one is the unchanged transla­
           tion, for internal use.  The second is a template to
           ease your review.

       o You do your review
           For that, rename pkg-name.todo to pkg-name.relu. Then,
           change the description found there, and add any com­
           ments you want between the lines

           --BEGIN COMMENTS [don t change this line]

           and

           --END COMMENTS [don t change this line]

       o You're done with the review and want to send your work
       to translators back.
           Call the script with the 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:

           - the comments you've put between the COMMENTS lines
           =item - the version resulting of your review
               Just in case the translator lost it's original
               work

           - the diff between your version and the translator
           one.

           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 pkg-
           name.mailSent to make sure the mail won't be sent sev­
           eral times if you run the script several times.

       o clean your workspace
           Calling the script with the clean option removes all
           temp files like *~ ones, or the ones created inter­
           nally. If pkg-name.todo and pkg-name.relu both exists,
           the script will remove the first. So, be carfull when
           using this option...

AUTHOR
       Martin Quinson <Martin.Quinson@ens-lyon.fr>



Voila, Mt.

-- 
Un clavier azerty en vaut deux.
#! /usr/bin/perl
use strict;
### Config part
# where to put all the files
# Things you MUST change
my $home="/home/mquinson/ddts";
my $mail_from='Martin Quinson <Martin.Quinson@ens-lyon.fr>';
my $mail_dflt="Hello,\n\n"
  ."Tu trouvera en attachement une version corrigée par mes soins de la description de ce paquet,\n"
  ."ainsi qu'un diff entre la version que tu as soumise et ma version. Si tu es d'accord avec les\n"
  ."corrections, merci de renvoyer la version corrigée au ddts. Dans le cas contraire, n'hesite pas\n"
  ."a me recontacter.\n\n"
  ."\nBye, Mt.\n";

# Things you can change
my $debug=1;

my $mail_title="[Relecture] description du paquet %s"; # must contain %s
my $mail_enc="8bits";
my $mail_charset="iso-8859-1";

my $todoext="todo";         # extention of files waiting for a review  (*)
my $revext="relu";          # extention of files you already reviewed
my $newmailext="newmail";   # extention of newly created mail files    (*)
my $mailext="mail";         # extention of ready to be sent mail files
my $sentmailext="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 between the lines
  
--BEGIN COMMENTS [don t change this line]
  
and

--END COMMENTS [don t change this line]

=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 between the COMMENTS lines
=item - the version resulting of your review
  
Just in case the translator lost it's original work

=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...
  
=back
  
=cut

my $version="0.7";

if (! -d $home) {
    mkdir $home || die "Can't create $home. Is the script configured ?\n";
}

sub parse_report {
    my $package;
    my $translator;
    my $desc;
    my $trans;
    my $lang;
    
    # Pass the mail header
    while (<>) {
	last if (m,^$,);
    }
    
    # Read all packages
    while (<>) {
	chomp;
	#    print "$_";
	# Read the translator name
	$translator=$_;
	$_=<>; chomp;
	$package=$_;
	last if $translator eq "";
	print "Translator: $translator\n" if $debug;
	print "Package: $package\n" if $debug;
	$_=<>;
	
	if (m,^Description: (.*)$,) {
	    $desc="$1\n";
	    while (<>) {
		if (m,^ ,) {
		    $desc .= $_;
		} else {
		    last;
		}
	    }
	}
	print "Description: $desc\n" if $debug;
	
	if (m,^Description-(..)(_..)?: (.*)$,) {
	    $lang="$1$2";
	    $trans="$3\n";
	    while (<>) {
		if (m,^ ,) {
		    $trans .= $_;
		} else {
		    last;
		}
	    }
	}
	
	if (m,^$,) {
	    if ($package eq "") {
		my $shortdesc=$desc;
		$shortdesc =~ s/\n.*//mg;
		open APT, "apt-cache search '$shortdesc'|";
		$package = <APT>;
		chomp($package);
		$package =~ s/^([^ ]*) .*$/$1/;
		print "I guess '$shortdesc' referes to '$package'\n";
	    }
	      
	    if ($package 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";
		}
	    
	    if (-e "$home/$package.$todoext") {
		warn "$home/$package.$todoext overwritten...\n"; 
	    }

	    # Outputs the package
	    open PKG, ">$home/$package" 
	      || die "Can't open $home/$package\n";
	    open TODO, ">$home/$package.$todoext" 
	      || die "Can't open $home/$package.$todoext\n";
	    
	    my $str = "Translator: $translator\n";
	    $str .= "Description:$desc";
	    $str .= "Description-$lang:$trans";
	    
	    print "$str\n" if $debug;
	    print PKG "$str\n";
	    print TODO "--BEGIN COMMENTS [don t change this line]\n"
	      .$mail_dflt
	      ."--END COMMENTS [don t change this line]\n"
	      ."$str\n";
	    
	    close PKG || die "Can't write '$home/$package': $!\n";
	    close TODO || die "Can't write '$home/$package.$todoext': $!\n";
	    
	    # Remove the mailSent
	    if (-e "$home/$package.$sentmailext") {
		print "removing $package.$sentmailext";
		unlink "$home/$package.$sentmailext";
	    }
	    
	    # Move revext to revext.old
	    if (-e "$home/$package.$sentmailext") {
		print "Moving $package.$revext -> $package.$revext.old";
		system ("mv $package.$revext $package.$revext.old");
	    }
	    
	    # clears the variables
	    $package=$translator=$desc=$trans=$lang = "";
	}
	
	
	# stop when encountering the signature
	last if m,^--$,;
	last if m,^-- $,;
    }
}

sub make_mails {
    my $boundary;
    my $BCount=0;
    
    die "Cannot read the content of $home: $! \n"
      unless opendir (PKGLIST,$home);
    
    chdir $home || die "Can't chdir to $home: $!\n";
    foreach (readdir(PKGLIST)) {
	next if /\.$todoext$/;
	
	next if /\.$revext$/;
	
	next if /\.diff$/;
	
	next if /\.$newmailext$/;
	next if /\.$mailext$/;
	next if /\.$sentmailext$/;
	my $pkg = $_;
	
	if (-e "$pkg.$revext" && -e "$pkg") {
	    if (-e "$pkg.$sentmailext") {
		print "$pkg.$sentmailext exists. I won't send the same mail two times\n";
		next;
	    }
	    $boundary="----------=_".scalar(time)."-$$-".$BCount++;
	    # get translator name
	    open PKG, "$pkg" || die "Can't read $pkg\n";
	    my $translator = <PKG>;
	    chomp($translator);
	    $translator =~ s/Translator: //;
	    close PKG;
	    
	    # build the mail
	    my $mail = "From: $mail_from\n";
	    if ($debug) {
		$mail .= "To: $mail_from\n";
	    } else {
		$mail .= "To: $_\n";
	    }
	    $mail .= "Subject: ";
	    $mail .= sprintf $mail_title,$pkg;
	    $mail .= "\nMime-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";
	    open REV, "$pkg.$revext";
	    while (<REV>) {
		last if /^--BEGIN COMMENTS \[don t change this line\]$/;
	    }
	    while (<REV>) {
		last if /^--END COMMENTS \[don t change this line\]$/;
		$mail .= $_;
	    }
	    $mail .= "\n\n"
	          ."--$boundary\n"
	      ."Content-Type: text/plain; charset=$mail_charset\n"
	      ."Content-Disposition: attachment; filename=\"$pkg.new\"\n\n";
  
	    # Prepare the diff and add the new version to the mail
	    open TMP,">$pkg.new";
	    while (<REV>) {
		print TMP $_;
		$mail .= $_;
	    }
	    close REV;
	    close TMP;
	    
	    $mail .= "\n\n"
	      ."--$boundary\n"
	      ."Content-Type: text/plain; charset=$mail_charset\n"
	      ."Content-Disposition: attachment; filename=\"$pkg.diff\"\n\n";
	    if (!system "diff -u $pkg $pkg.new > $pkg.diff") {
		# empty diff
		unlink "$pkg.diff";
		unlink "$pkg.new";
	    } else {
		# puts the diff
		open DIFF, "$pkg.diff";
		while (<DIFF>) {
		    $mail .= "$_";
		}
		close DIFF;
		
		# 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, ">$pkg.$sentmailext";
		    print SENT $mail;
		    close SENT 
		      || die "Can't save the mail to $pkg.$sentmailext: $!\n";
		    
		    open SENDMAIL,"| /usr/lib/sendmail -t -oi -oem";
		    print SENDMAIL $mail;
		    close SENDMAIL 
		      || die "Can't run sendmail: $!\n";
		    
		    print "Mail sent\n";
		} else {
		    print "As you want. Nothing sent\n";
		}
	    }
	    unlink "$pkg.new" unless $debug>1;
	    unlink "$pkg.diff" unless $debug>1;
	}
    }
}

sub clean { 
    die "Cannot read the content of $home: $! \n"
      unless opendir (PKGLIST,$home);
    foreach (readdir(PKGLIST)) {
	if (/~$/ ||
	    /\.new$/ ||
	    /\.diff$/) {
		print "Remove $_\n";
		unlink "$home/$_";
	    }
	if (! /\./) {
	    my $pkg = $_;
	    if (-e "$home/$pkg.$revext" && -e "$home/$pkg.$todoext") {
		print "Remove $pkg.$todoext\n";
		unlink "$home/$pkg.$todoext";
	    }
	}
    }
}    


my $cmd=shift;
if ($cmd eq "parse") {
    parse_report();
} elsif ($cmd eq "mail") {
    make_mails();
} elsif ($cmd eq "clean") {
    clean();
} 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 $todoext when a $revext exists\n"
      ."           - all tmp files (.diff, .new)\n"
      ."\n$me version $version\n";
}

=head1 AUTHOR

Martin Quinson <Martin.Quinson@ens-lyon.fr>
  
=cut

Reply to: