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

Deja la nouvelle version du script pour simplifier la vie des relecteurs de ddts



Salut, version 0.6.
Changement: si le nom du paquet n'est pas donné par le ddts, appelle
apt-cache pour le trouver. Comme ca, ca marche meme tant que le ddts est
cassé si vous avez apt qui pointe sur le bon endroit...

Bye, Mt.
#! /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='PLEASE PUT YOU ADDRESS HERE';
my $mail_dflt="Hello,\n\n"
  ."Voici ma relecture de ta traduction de description de paquet.\n"
  ."N'hesite pas à me contacter si certaines corrections te paraissent discutables.\n"
  ."Sinon, merci de renvoyer la version corrigée au ddts.\n"
  ."\nBye, Mt.\n";

# Things you can change
my $debug=0;

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
my $version="0.6";
die "Please configure the script before\n" 
  if $mail_from eq "PLEASE PUT YOU ADDRESS HERE";

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 "$str\n";
	    
	    close PKG || die "Can't write '$home/$package': $!\n";
	    close TODO || die "Can't write '$home/$package.$todoext': $!\n";
	    
	    # 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 (!system "diff -u $pkg $pkg.$revext > $pkg.diff") {
		# empty diff
		unlink "$pkg.diff";
		unlink "$pkg.$newmailext" if (-e "$pkg.$newmailext");
		unlink "$pkg.$revext"     if (-e "$pkg.$revext");
		unlink "$pkg.$todoext"    if (-e "$pkg.$todoext");
	    } else {
		$boundary="----------=_".scalar(time)."-$$-".$BCount++;
		open PKG, "$pkg" || die "Can't read $pkg\n";
		$_ = <PKG>;
		chomp;
		s/Translator: //;
		open MAIL, ">$pkg.$newmailext";
		print  MAIL "To: $_\n";
		print  MAIL "From: $mail_from\n";
		print  MAIL "Subject: ";
		printf MAIL $mail_title,$pkg;
		print  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$mail_dflt\n\n"
		  ."--$boundary\n"
		  ."Content-Type: text/plain; charset=$mail_charset\n"
		  ."Content-Disposition: attachment; filename=\"$pkg.diff\"\n\n";
		  
		
		# puts the diff
		open DIFF, "$pkg.diff";
		while (<DIFF>) {
		    print MAIL "$_";
		}
		
		# Ends the mime stuff
		print MAIL "--$boundary--\n\n";
		
		close DIFF;
		close MAIL || die "Can't write $pkg.newmailext\n";
		close PKG;
	    }
	}
	
    }
	     
}
 
sub send_mails {
    die "Cannot read the content of $home: $! \n"
      unless opendir (PKGLIST,$home);
    print "ACHTUNG: I am now sending mails to the translators.\n"
      ." I will send these files:\n";
    foreach (readdir(PKGLIST)) {
	next unless /\.$mailext$/;
	print "   - $_\n";
    }
    print "\nIf you made something wrong, you have a 15 seconds to press CTRL C\n";
    sleep 15;

    # Do the job
    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 unless /\.$mailext$/;
	
	my $pkg = $_;
	$pkg =~ s/\.$mailext$//;
	
	open SENDMAIL, "| /usr/lib/sendmail -t -oi -oem";
	open MAIL, "$pkg.$mailext";
	open SENTMAIL, ">$pkg.$sentmailext";
	while (<MAIL>) {
	    print SENDMAIL $_;
	    print SENTMAIL $_;
	}   
	close SENDMAIL || die "Can't fork sendmail: $!\n";
	close SENTMAIL || die "Can't copy mail to $pkg.$sentmailext: $!\n";
	close MAIL;
	unlink "$pkg.$mailext";
	print "Send file $pkg.$mailext\n";
    }
    print "done\n";
}

my $cmd=shift;
if ($cmd eq "parse") {
    parse_report();
} elsif ($cmd eq "mail") {
    make_mails();
} elsif ($cmd eq "send") {
    send_mails();
} else {
    my $me=$0;
    $me=~s,^.*?/([^/]*)$,$1,;
    die "Usage $me [parse|mail|send]\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"
      ."  send:  send the pkg.mail files (which are edited version of pkg.newmail)\n"
      ."\n$me version $version\n";
}

Reply to: