ddtc-0.17.2/0000755000000000000000000000000012657270721007416 5ustar ddtc-0.17.2/Common.pm0000644000000000000000000000413507710757424011213 0ustar package Ddtc::Common; use strict; use Exporter; use vars qw(@ISA @EXPORT); @ISA = qw(Exporter); @EXPORT = qw( __ set_debug get_debug inc_debug dec_debug debug warning suicide ); my $debug; # debug level BEGIN { eval 'use Locale::gettext'; if ($@) { *gettext = sub { shift }; *textdomain = sub { "" }; *LC_MESSAGES = sub { 5 }; } eval { require POSIX; import POSIX qw(setlocale); }; if ($@) { *setlocale = sub { 1 }; } } no strict; setlocale(LC_MESSAGES, ""); use strict; textdomain("ddtc"); sub __($) { gettext(shift); } # set debug level sub inc_debug() { $debug++ if $debug < 9 }; # increase debug level sub dec_debug() { $debug-- if $debug > 0 }; # decrease debug level sub set_debug($) { $debug = $_[0] > 9 ? 9 : $_[0] < 0 ? 0 : shift; # set debug level }; # get debug level sub get_debug() { return $debug }; # get debug level # write debug messages sub debug ($;$@) { return unless $debug >= shift; # debug level my $text = shift || ""; $text = sprintf ($text, @_) if @_; my @text = split("\n", $text); @text = ("") unless @text; my $line = (caller(0))[2]; # get calling line my $sub = (caller(1))[3] || ''; # get calling sub name foreach (@text) { print "debug ($sub\:$line) " unless $debug < 3; print "$_\n"; } } # write error message and die sub suicide ($;@) { my $text = shift || ""; $text = sprintf ($text, @_) if @_; my @text = split("\n", $text); @text = ("") unless @text; my $line = (caller(0))[2]; # get calling line my $sub = (caller(1))[3] || ''; # get calling sub name foreach (@text) { $debug < 3 ? print __("ERROR ") : print "suicide ($sub\:$line) "; print "$_\n"; } exit -1; } # write warning message sub warning ($;@) { my $text = shift || ""; $text = sprintf ($text, @_) if @_; my @text = split("\n", $text); @text = ("") unless @text; my $line = (caller(0))[2]; # get calling line my $sub = (caller(1))[3] || ''; # get calling sub name foreach (@text) { $debug < 3 ? print __("WARNING ") : print "warning ($sub\:$line) "; print "$_\n"; } } 1; ddtc-0.17.2/misc/0000755000000000000000000000000010132043723010333 5ustar ddtc-0.17.2/misc/bash_completion0000644000000000000000000000077107656511573013455 0ustar # This is a bash completion rule _ddtc() { COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} # current word if [[ "$cur" == -* ]]; then COMPREPLY=( $( compgen -W '-q -v -s -n -l -V -h --quiet --verbose --mail-self --nomail-self --lang --version --help' -- $cur ) ) else COMPREPLY=( $( compgen -W 'parse mail fix clean stats section sget get review getbug btsclose notification status listtranslatedpackages noneveraguide neveraguide noguide guide' -- $cur ) ) fi return 0 } complete -F _ddtc ddtc ddtc-0.17.2/misc/ddtcrc0000644000000000000000000000065607724713470011550 0ustar # This is a sample .ddtcrc config file base_dir l10n/ddtc # base directory: $HOME/l10n/ddtc/ comment && # comment lines look like: &&my comment # instead of standard: >>my comment language fr # language I'm translating to/reviewing mail_out work@my.office.com # address sending messages to the ddts mail_in me@my.isp.org # address receiving ddts messages mail_charset iso-8859-15 # Europe with euro charset ddtc-0.17.2/misc/procmailrc0000644000000000000000000000063010132043723012410 0ustar # This is a procmail rule to automaticaly pass your incomming mail to ddtc, it # also save mails in a mailbox called `ddts' and put errors in `ddts-errors' ##### deal with mails from/to the ddts # save outgoing :0: * ^To: pdesc@ddtp.debian.org ddts # backup :0 c: * ^From: pdesc@ddtp.debian.org ddts # pass to ddtc standard input :0 wA: | ddtc parse # If we are here, an error occured :0 A: ddts-errors ddtc-0.17.2/misc/vim/0000755000000000000000000000000010132044505011125 5ustar ddtc-0.17.2/misc/vim/syntax/0000755000000000000000000000000007746320315012470 5ustar ddtc-0.17.2/misc/vim/syntax/ddtpCli.vim0000644000000000000000000000751007721657431014600 0ustar " Vim syntax file " Language: DDTP files - client version " Maintainer: Lorenzo Cappelletti " Last Change: Tue, 5 Aug 2003 21:47:34 +0200 " " For copyright statement and stuff, see included file ddtpCom.vim " Common definitions runtime syntax/ddtpCom.vim " Atomic description syntax region ddtpCliAtom fold keepend transparent \ start=/^# package:/ \ end=/^$/ \ contains=ddtpCliHeader,ddtpCliOr,@ddtpCliXx " Pseudo-header syntax region ddtpCliHeader fold keepend transparent contained \ start=/^/ \ end=/^\(# -\)\?Description: /me=s-1 \ contains=ddtpCliHeaderKey syntax match ddtpCliHeaderKey contained \ /^# \(package\|translator\|ddts id\|bug number\|reviewer\)[^:]*/hs=s+2 \ nextgroup=ddtpComHeaderArg " Original description syntax region ddtpCliOr fold keepend transparent contained \ start=/^\(# -\)\?Description: / \ end=/^\([>+]>[a-z+-][+-]\)\?Description-\l\l\|^$/me=s-1 \ contains=ddtpCliOrSynp,ddtpCliOrDesc syntax region ddtpCliOrSynp keepend transparent contained \ start=/^\(# -\)\?Description: / \ end=/^[ #]/me=e-1 \ contains=ddtpComSynpKey,ddtpComTodo, \ddtpCliDiffRemoved,@ddtpComErrSynp " Synopsis syntax region ddtpCliOrDesc fold keepend transparent contained \ start=/^ \|#\( -Description\)\@!/ \ end=/^$/ \ contains=ddtpCliOrPara,ddtpComDot " Description syntax region ddtpCliOrPara fold transparent contained \ start=/^[ #][^\.]/ \ skip=/^#/ \ end=/ \.$/me=e-2 \ contains=@ddtpCliComm,ddtpCliDiffRemoved, \@ddtpComErrPara " Paragraphs " Generic translation syntax region ddtpCliXx fold keepend transparent contained \ start=/^\([>+]>[a-z+-][+-]\)\?Description-\l\l/ \ end=/^$/me=s-1 \ contains=ddtpCliXxSynp,ddtpCliXxDesc,@ddtpCliDiff syntax region ddtpCliXxSynp transparent contained \ start=/^\([>+]>[a-z+-][+-]\)\?Description-\l\l.*/ \ end=/^\([>+]>[a-z+-][+-]Description-\l\l.*$\)\@!/ \ contains=ddtpComSynpKey,ddtpComTodo,@ddtpCliDiff, \@ddtpComErrSynp " Synopsis syntax region ddtpCliXxDesc fold keepend transparent contained \ start=/^\(\([>+]>[a-z+-][+-]\)\?Description-\l\l.*$\)\@!/ \ end=/^$/ \ contains=ddtpCliXxPara,ddtpComDot " Description syntax region ddtpCliXxPara fold contained \ start=/\(^ \.\)\@!/ \ skip=/^[#>+]/ \ end=/ \.$/me=e-2 \ contains=@ddtpCliComm,ddtpComTodo,@ddtpCliDiff, \@ddtpComErrPara " Paragraph " Comments syntax match ddtpCliCommServ /^>[^>].*$/ contained " Server syntax match ddtpCliCommPerm /^>>[^a-z+-][^+-].*$/ contained " Permanent syntax cluster ddtpCliComm contains=ddtpCliCommServ,ddtpCliCommPerm " Diff syntax match ddtpCliDiffRemoved /^# -.*/ contained syntax match ddtpCliDiffRemoved /^>>--.*/ contained syntax match ddtpCliDiffAddedA /^>>a+.*/ contained syntax match ddtpCliDiffAddedB /^>>b+.*/ contained syntax match ddtpCliDiffAddedC /^>>c+.*/ contained syntax match ddtpCliDiffAddedX /^>>[d-z+]+.*/ contained syntax match ddtpCliDiffSelected /^+>[a-z+-][+-].*/ contained contains=ddtpCliDiffSelectedHeader syntax match ddtpCliDiffSelectedHeader /^+>[a-z+-][+-]/ contained syntax cluster ddtpCliDiff contains=ddtpCliDiff.* " Localized versions runtime syntax/ddtpCli??.vim runtime syntax/ddtpCli????.vim syntax cluster ddtpCliXx contains=ddtpCli.. " Highlighting highlight ddtpCliDiffAddedA ctermfg=Magenta \ guifg=Magenta highlight ddtpCliDiffAddedB ctermfg=Yellow \ guifg=Yellow highlight ddtpCliDiffAddedC ctermfg=LightBlue \ guifg=LightBlue highlight def link ddtpCliHeaderKey ddtpComHeaderKey highlight def link ddtpCliCommServ ddtpComCommServ highlight def link ddtpCliCommPerm ddtpComCommPerm highlight def link ddtpCliDiffAddedX diffAdded highlight def link ddtpCliDiffRemoved diffRemoved highlight def link ddtpCliDiffSelectedHeader Type " Folding if !exists("ddts_nofolding") set foldmethod=syntax 1,$foldopen! endif let b:current_syntax = "ddtc" ddtc-0.17.2/misc/vim/syntax/ddtpComIt.vim0000644000000000000000000000213007716121716015071 0ustar " Vim syntax file " Language: DDTP files - common defs for Italian version of Client syntax " Maintainer: Lorenzo Cappelletti " Last Change: " For copyright statement and stuff, see file ddtpCom.vim syntax match ddtpComItErrE /[AaEeIiOUu]['`]\|o`/ contained " Wrong accents syntax match ddtpComItErrE /\( p\)\@/ contained " Menù syntax match ddtpComItErrMispells /\c\/ contained " Fittizio syntax match ddtpComItErrMispells /\c\/ contained " Un altro syntax match ddtpComItErrMispells /\c\/ contained " Off-line syntax cluster ddtpComItErr contains=ddtpComErrWSpaceMultiSent,ddtpComErrWSpacePunct,ddtpComItErr.* highlight def link ddtpComItErrE ddtpComErr highlight def link ddtpComItErrQuotes ddtpComErr highlight def link ddtpComItErrMispells ddtpComErr ddtc-0.17.2/misc/vim/syntax/ddtpCom.vim0000644000000000000000000001176607746320025014610 0ustar " Vim syntax file " Language: DDTP files - common definitions " Maintainer: Lorenzo Cappelletti " Last Change: Tue, 5 Aug 2003 19:46:14 +0200 " " This is a hack of the ddts and ddtc syntax files from DDTP - the Debian " Description Translation Project. " " Original work based on the script of Fabio Bonelli , " Emanuele Aina , and Nicolas Bertolissio " . " " Contributions: " Matteo Cortese " Cristian Rigamonti " This script checks the ddts_nofolding variable to disable the folding " method based on the syntax regions. " To deal with complex DDTP's file syntaxes and to achieve a high " customization, the scripts are deeply modular. Since there are two types " of syntax, one from the server and one from the client, there are also " two entry files, which in turn include other files. " " ddtpSrv.vim " \ " \-- ddtpSrvXx.vim ------\ " \ \ " \-- ddtpCom.vim ddtpComXx.vim " / / " /-- ddtpCliXx.vim ------/ " / " ddtpCli.vim " " ddtp(Cli|Srv).vim : entry points for server and client syntax, respectively. " ddtpCom.vim : shared definitions for ddtp(Cli|Srv).vim. " ddtp(Cli|Srv)Xx.vim: Xx language specific highlighting (ddtp(Cli|Srv)Xx_XX.vim " is also possibile). " ddtpComXx.vim : shared definitions for ddtp(Cli|Srv)??.vim " " Hence, you can customize the highlighting for your language by: " - creating three new files named ddtp(Cli|Srv|Com)Xx.vim or " ddtp(Cli|Srv|Com)Xx_XX.vim; " - copying the "Generic translation" block ddtp(Cli|Srv|Com)Xx from " ddtp(Cli|Srv|Com).vim files; " - substituting "Xx" for your 2-letter langauge id; " - defining customized syntax match rules (see other langauges as an example); " - using/modifing ddtpCom.vim if you want to share your syntax rules with " other languages. " For version 5.x: clear all syntax items " For version 6.x: quit when a syntax file was already loaded if version < 600 syntax clear elseif exists("b:current_syntax") finish endif " We use some color definition of diff.vim source $VIMRUNTIME/syntax/diff.vim " Case-sensitive syntax case match " Pseudo-header syntax match ddtpComHeaderArg /: .*$/ contained contains=ddtpComEmail " Email syntax match ddtpComEmail /[-<\.+_a-zA-Z0-9]\+@[-\.a-zA-Z0-9>]\+/ contained contains=ddtpComEmailSym syntax match ddtpComEmailSym /[<@>]/ contained " Synopsis syntax match ddtpComSynpKey \ /^Description\(-\l\l\(_\u\u\)\?\)\?: / \ nextgroup=ddtpComErrLongSynp \ contained " Todo syntax match ddtpComTodo // contained " Splitting dot syntax match ddtpComDot \ /^ \.$/ \ contained " Generic Errors syntax cluster ddtpComErrSynp contains=ddtpComErrWSpaceTab,ddtpComErrWSpaceMultiWord, \ddtpComErrWSpaceTrailing,ddtpComErrLongSynp syntax cluster ddtpComErrPara contains=ddtpComErrDescDot,ddtpComErrWSpaceTab,ddtpComErrWSpaceMultiWord, \ddtpComErrWSpaceLeading,ddtpComErrWSpaceTrailing,ddtpComErrLongDesc syntax match ddtpComErrSynpTrailingDot /\.\s*$/ contained " Trailing dot in synopsis syntax match ddtpComErrDescDot /^ \.\zs.\+/ contained " Garbage after desc dot syntax match ddtpComErrWSpaceTab /\t/ contained " Tabs not allowed syntax match ddtpComErrWSpaceLeading /^[^ #>+]/ contained " No leading whitespaces syntax match ddtpComErrWSpaceTrailing / \+$/ contained " Trailing whitespaces syntax match ddtpComErrWSpaceMultiWord /\(\>\|[,;:]\) \zs \+/ contained " Multiple whitespaces between words syntax match ddtpComErrWSpaceMultiWord /[.!?] \zs \+/ contained syntax match ddtpComErrWSpaceMultiSent /[^ ] \zs \+/ contained " Multiple whitesapces between sentences syntax match ddtpComErrWSpacePunct / \+[:,;?!]/ contained " No whitespaces before punctuations syntax match ddtpComErrLongSynp /.*/ms=s+80 contained syntax match ddtpComErrLongDesc /^[ #].*/ms=s+80 contained " Highlighting highlight ddtpComEmail ctermfg=DarkBlue \ guifg=DarkBlue highlight ddtpComEmailSym ctermfg=DarkMagenta \ guifg=DarkMagenta highlight ddtpComCommPerm ctermfg=Grey ctermbg=DarkBlue \ guifg=Grey guibg=DarkBlue highlight def link ddtpComHeaderKey Identifier highlight def link ddtpComHeaderArg NonText highlight def link ddtpComSynpKey Keyword highlight def link ddtpComTodo Todo highlight def link ddtpComDot Type highlight def link ddtpComCommServ Comment highlight def link ddtpComErr Error highlight def link ddtpComErrLongDesc ddtpComErr highlight def link ddtpComErrLongSynp ddtpComErr highlight def link ddtpComErrDescDot ddtpComErr highlight def link ddtpComErrSynpTrailingDot ddtpComErr highlight def link ddtpComErrWSpaceTab ddtpComErr highlight def link ddtpComErrWSpaceLeading ddtpComErr highlight def link ddtpComErrWSpaceTrailing ddtpComErr highlight def link ddtpComErrWSpaceMultiSent ddtpComErr highlight def link ddtpComErrWSpaceMultiWord ddtpComErr highlight def link ddtpComErrWSpacePunct ddtpComErr ddtc-0.17.2/misc/vim/syntax/ddtpSrvIt.vim0000644000000000000000000000210207721401103015107 0ustar " Vim syntax file " Language: DDTP files - Italian version for Server syntax " Maintainer: Lorenzo Cappelletti " Last Change: " For copyright statement and stuff, see file ddtpCom.vim runtime syntax/ddtpComIt.vim syntax region ddtpSrvIt fold keepend transparent \ start=/^Description-it\|^# new translation:/ \ end=/# \(Package(s)\|packages\|changed translation\|This package\)/me=s-1 \ contains=ddtpSrvItSynp,ddtpSrvItDesc,ddtpSrvCommServ \ contained syntax match ddtpSrvItSynp transparent \ /^Description-it\(_\u\u\)\?: .*/ \ contains=ddtpComSynpKey,ddtpComTodo,@ddtpComErrSynp,@ddtpComItErr,ddtpComErrSynpTrailingDot \ contained " Synopsis syntax region ddtpSrvItDesc fold keepend transparent \ start=/^[ #]\( new translation:\)\@!/ \ end=/^$/ \ contains=ddtpSrvItPara,ddtpComDot \ contained " Description syntax region ddtpSrvItPara fold transparent \ start=/^[ #>][^\.]/ \ skip=/^[#>+]/ \ end=/ \.$/me=e-2 \ contains=@ddtpSrvComm,ddtpComTodo,@ddtpSrvDiff,@ddtpComErrPara,@ddtpComItErr \ contained " Paragraph ddtc-0.17.2/misc/vim/syntax/ddtpSrv.vim0000644000000000000000000001227207721403421014630 0ustar " Vim syntax file " Language: DDTP files - server version " Maintainer: Lorenzo Cappelletti " Last Change: Tue, 5 Aug 2003 19:46:14 +0200 " " For copyright statement and stuff, see included file ddtpCom.vim " Common definitions runtime syntax/ddtpCom.vim " Atomic description syntax region ddtpSrvAtom fold keepend transparent \ start=/^# \(Package(s)\|packages\|changed translation\|This package\)/ \ end=/^# \(Package(s)\|packages\|changed translation\|This package\)/me=s-1 \ contains=ddtpSrvHeader,ddtpSrvOr,@ddtpSrvXx " Pseudo-header syntax region ddtpSrvHeader fold keepend transparent contained \ start=/^/ \ end=/^Description: \|^# orignal description:/me=s-1 \ contains=ddtpSrvHeaderKey,ddtpSrvCommServSect,ddtpSrvCommServOldDesc syntax match ddtpSrvHeaderKey contained \ /^\(From\|BTSCLOSE\)[^:]*/ \ nextgroup=ddtpComHeaderArg syntax match ddtpSrvHeaderKey contained \ /^# \([Pp]ackage\|[Tt]ranslator\|Reviewer\|Bug\)[^:]*/hs=s+2 \ nextgroup=ddtpComHeaderArg " Original description syntax region ddtpSrvOr fold keepend transparent contained \ start=/^Description: \|^# origi\?nal description:/ \ end=/^Description-\l\l\|^# new translation:\|^$/me=s-1 \ contains=ddtpSrvOrSynp,ddtpSrvOrDesc,ddtpSrvCommServ syntax match ddtpSrvOrSynp transparent contained \ /^Description: .*/ \ contains=ddtpComSynpKey,ddtpComTodo,@ddtpComErrSynp " Synopsis syntax region ddtpSrvOrDesc fold keepend transparent contained \ start=/^[ #]\( origi\?nal description:\)\@!/ \ end=/^$/ \ contains=ddtpSrvOrPara,ddtpComDot " Description syntax region ddtpSrvOrPara fold transparent contained \ start=/^[ #][^\.]/ \ skip=/^#/ \ end=/ \.$/me=e-2 \ contains=@ddtpSrvComm,@ddtpComErrPara " Paragraphs " Generic translation syntax region ddtpSrvXx fold keepend transparent contained \ start=/^Description-\l\l\|^# new translation:/ \ end=/^# \(Package(s)\|packages\|changed translation\|This package\)/me=s-1 \ contains=ddtpSrvXxSynp,ddtpSrvXxDesc,ddtpSrvCommServ syntax match ddtpSrvXxSynp transparent contained \ /^Description-\l\l\(_\u\u\)\?: .*/ \ contains=ddtpComSynpKey,ddtpComTodo,@ddtpComErrSynp " Synopsis syntax region ddtpSrvXxDesc fold keepend transparent contained \ start=/^[ #]\( new translation:\)\@!/ \ end=/^$/ \ contains=ddtpSrvXxPara,ddtpComDot " Description syntax region ddtpSrvXxPara fold transparent contained \ start=/^[ #][^\.]/ \ skip=/^#/ \ end=/ \.$/me=e-2 \ contains=@ddtpSrvComm,ddtpComTodo,@ddtpComErrPara " Paragraph " Comments syntax cluster ddtpSrvComm contains=ddtpSrvCommPerm,ddtpSrvCommServ syntax match ddtpSrvCommPerm contained \ /^##.*$/ " Permanent syntax match ddtpSrvCommServ contained \ /^#[^#].*$\|^#$/ \ contains=ddtpSrvCommServSect,ddtpSrvDiff " Server syntax match ddtpSrvCommServSect /^# changed translation from .*/hs=s+2 \ contains=ddtpComEmail \ contained " changed translation syntax match ddtpSrvCommServSect /^# \(origi\?nal\|new\|old\|old translated\) description/hs=s+2 \ contained " Description syntax match ddtpSrvCommServSect /^# \(new\|old\) translation/hs=s+2 \ contained " Translation syntax match ddtpSrvCommServSect /^# ppart translation, please check it! It needs your help/hs=s+2 \ contained " PPart syntax match ddtpSrvCommServSect /^# This package description has passed the review process/hs=s+2 \ contained " Passed review " Old description syntax region ddtpSrvCommServOldDesc fold keepend transparent contained \ start=/^# old description/hs=s+2 \ end=/^ new description/me=s-1 \ contains=ddtpSrvCommServSect,ddtpSrvDiff " Diff syntax region ddtpSrvDiff fold keepend transparent contained \ start=/^# diff old-new \(translation\|description\):/ \ end=/^# \(new description\|old translation\):/me=s-1 \ contains=ddtpSrvDiffPrefix,ddtpSrvDiffHeader,ddtpSrvDiffText,ddtpSrvCommServSect, \ddtpSrvDiffAdded,ddtpSrvDiffRemoved,ddtpSrvDiffLine,ddtpSrvDiffFile, \ddtpSrvDiffNewFile syntax match ddtpSrvDiffPrefix /^#/ \ contained syntax match ddtpSrvDiffHeader /^# diff old-new \(translation\|description\)/hs=s+2 \ contained syntax match ddtpSrvDiffText /.*/ms=s+2 \ contained syntax match ddtpSrvDiffAdded / +.*/ \ contained syntax match ddtpSrvDiffRemoved / -.*/ \ contained syntax match ddtpSrvDiffLine / @.*/ \ contained syntax match ddtpSrvDiffFile / +++ .*/ \ contained syntax match ddtpSrvDiffNewFile / --- .*/ \ contained " Localized versions runtime syntax/ddtpSrv??.vim runtime syntax/ddtpSrv????.vim syntax cluster ddtpSrvXx contains=ddtpSrv.. " Highlighting highlight ddtpSrvCommServSect ctermfg=Magenta \ guifg=Magenta highlight def link ddtpSrvHeaderKey ddtpComHeaderKey highlight def link ddtpSrvCommServ ddtpComCommServ highlight def link ddtpSrvCommPerm ddtpComCommPerm highlight def link ddtpSrvDiffHeader ddtpSrvCommServSect highlight def link ddtpSrvDiffAdded diffAdded highlight def link ddtpSrvDiffRemoved diffRemoved highlight def link ddtpSrvDiffLine diffLine highlight def link ddtpSrvDiffFile diffFile highlight def link ddtpSrvDiffPrefix ddtpSrvDiffFile highlight def link ddtpSrvDiffNewFile diffNewFile " Folding if !exists("ddtpSrv_nofolding") set foldmethod=syntax 1,$foldopen! endif let b:current_syntax = "ddtpSrv" ddtc-0.17.2/misc/vim/syntax/ddtpCliIt.vim0000644000000000000000000000211507722407362015066 0ustar " Vim syntax file " Language: DDTP files - Italian version for Client syntax " Maintainer: Lorenzo Cappelletti " Last Change: " For copyright statement and stuff, see file ddtpCom.vim runtime syntax/ddtpComIt.vim syntax region ddtpCliIt fold keepend transparent contained \ start=/^\([>+]>[a-z+-][+-]\)\?Description-it/ \ end=/^$/me=s-1 \ contains=ddtpCliItSynp,ddtpCliItDesc syntax region ddtpCliItSynp transparent contained \ start=/^\([>+]>[a-z+-][+-]\)\?Description-it.*/ \ end=/^\([>+]>[a-z+-][+-]Description-it.*$\)\@!/ \ contains=ddtpComSynpKey,ddtpComTodo,@ddtpCliDiff,@ddtpComErrSynp, \@ddtpComItErr,ddtpComErrSynpTrailingDot " Synopsis syntax region ddtpCliItDesc fold keepend transparent contained \ start=/^\(\([>+]>[a-z+-][+-]\)\?Description-it.*$\)\@!/ \ end=/^$/ \ contains=ddtpCliItPara,ddtpComDot " Description syntax region ddtpCliItPara fold transparent contained \ start=/\(^ \.\)\@!/ \ skip=/^[#>+]/ \ end=/ \.$/me=e-2 \ contains=@ddtpCliComm,ddtpComTodo,@ddtpCliDiff, \@ddtpComErrPara,@ddtpComItErr " Paragraph ddtc-0.17.2/misc/vim/README0000644000000000000000000000167610132044505012017 0ustar INSTALL ======= unzip and copy the content of the syntax/ folder in your ~/.vim/syntax/ folder (you may have to create it if it does not already exist) and add the content of the scripts.vim file to your ~/.vim/scripts.vim file (you may also have to create it if it does not already exist). CUSTOMISATION ============= If you have a few syntax colorizations specific to your own language (such as frequently mispelled words or wrong accents), you can create a couple of syntax files to suit your needs. Just fire up vim, type ":help syntax", and use ddtp{Com,Cli,Srv}It.vim (which serve the Italian language) as a start place. You can also use filenames such as ddtp{Com,Cli,Srv}XxXx.vim (e.g., PrBr for pr_BR) if you need to. They will be automatically loaded from within ddtp{Cli,Srv}.vim. Thanks to Lorenzo Cappelletti for this good job. -- Nicolas Bertolissio Sat, 09 Oct 2004 22:25:36 +0200 ddtc-0.17.2/misc/vim/scripts.vim0000644000000000000000000000065707746312705013362 0ustar augroup filetypedetect " DDTP - server if getline(1) =~ '^# Package(s):' \ || getline(2) =~ '^# Package(s):' \ || getline(2) =~ '^# Bug-Nr.:' \ || getline(3) =~ '^# Bug-Nr.:' \ || getline(1) =~ '^# packages:' \ || getline(2) =~ '^# packages:' setfiletype ddtpSrv endif " DDTP - client if getline(1) =~ '^# package:' \ || getline(2) =~ '^# package:' setfiletype ddtpCli endif augroup END ddtc-0.17.2/Menu.pm0000644000000000000000000001274607716364522010675 0ustar package Ddtc::Menu; use strict; use Exporter; use Term::ReadLine; use Term::ANSIColor; use Ddtc::Common; use vars qw(@ISA); @ISA = qw(Exporter); # new # # create new menu with title and redraw # # input: # title # title color # default letter color # default text color # output: # Menu object sub new($$;$$$) { shift; # class debug 3; debug 4, "title: " .($_[0] || "")."\n" ."letter_color: ".($_[0] || "")."\n" ."text_color: ".($_[0] || "")."\n" ."title_color: ".($_[0] || "")."\n"; my $self = bless []; # $self->[0] = [undef, undef]; $self -> title ( shift) if @_; $self -> letter_color(0, shift); $self -> text_color (0, shift); $self -> title_color ( shift); $self -> add("_ _", sub { 1 }); return $self; } # title # # get / set menu title # # input: # Menu object # menu title [ set ] # output # menu title sub title($;$) { my $self = shift; debug 3; debug 4, "title: ".($_[0] || "")."\n"; $self->[0][2] = shift if @_; # set if value provided return undef unless defined $self->[0][2]; debug 4, "title: ".$self->[0][2]."\n"; $self->[0][2]; } # letter # # get / set letter # # input: # Menu object # item number # string [ set ] # output # letter sub letter($$;$){ my $self = shift; my $item = shift; debug 3; debug 4, "item: ".$item."\n" ."string: ".($_[0] || "")."\n"; if (@_) { # set if value provided $_ = shift; /_(.)/; $self->[$item][0] = $1 || undef; } return undef unless exists $self->[$item][0]; debug 4, "letter: ".$self->[$item][0]."\n"; $self->[$item][0]; } # text # # get / set text # # input: # Menu object # item number # string [ set ] # output # text sub text($$;$){ my $self = shift; my $item = shift; debug 3; debug 4, "item: ".$item."\n" ."string: ".($_[0] || "")."\n"; if (@_) { # set if value provided $_ = shift; s/_._//; s/_//; $self->[$item][1] = $_ || undef; } return undef unless exists $self->[$item][1]; debug 4, "text: ".($self->[$item][1] || "")."\n"; $self->[$item][1]; } # exec # # get / set command # # input: # Menu object # item number # code reference [ set ] # output # code reference sub exec($$;$){ my $self = shift; my $item = shift; debug 3; debug 4, "item: ".$item."\n" ."code: ".($_[0] || "")."\n"; $self->[$item][2] = shift if @_; # set if value provided return undef unless exists $self->[$item][2]; debug 4, "code: ".$self->[$item][2]."\n"; $self->[$item][2]; } # letter_color # # get / set letter title # # input: # Menu object # item number # menu title_color [ set ] # output # menu title_color sub letter_color($$;$){ my $self = shift; my $item = shift || 0; debug 3; debug 4, "item: ".$item."\n" ."color: ".($_[0] || "")."\n"; $self->[$item][3] = shift if @_; # set if value provided return 'clear' unless defined $self->[$item][3] || defined $self->[0][3]; debug 4, "color: ".($self->[$item][3] || $self->[0][3])."\n"; $self->[$item][3] || $self->[0][3]; } # text_color # # get / set text title # # input: # Menu object # item number # menu text_color [ set ] # output # menu text_color sub text_color($$;$){ my $self = shift; my $item = shift || 0; debug 3; debug 4, "item: ".$item."\n" ."color: ".($_[0] || "")."\n"; $self->[$item][4] = shift if @_; # set if value provided return 'clear' unless defined $self->[$item][4] || defined $self->[0][4]; debug 4, "color: ".($self->[$item][4] || $self->[0][4])."\n"; $self->[$item][4] || $self->[0][4]; } # title_color # # get / set menu title # # input: # Menu object # menu title_color [ set ] # output # menu title_color sub title_color($;$){ my $self = shift; debug 3; debug 4, "color: ".($_[0] || "")."\n"; $self->[0][5] = shift if @_; # set if value provided return 'clear' unless defined $self->[0][5]; debug 4, "color: ".$self->[0][5]."\n"; $self->[0][5]; } # print # # print menu # # input: # Menu object sub print($) { my $self = shift; debug 3; debug 0, "\n " .color($self -> title_color) . ($self -> title ) .color('clear' )."\n"; for (my $i = 0; $i < @{ $self }; $i++) { next unless defined $self -> text($i); debug 0, color($self -> letter_color($i)) . ($self -> letter ($i)) .color('clear' ) .color($self -> text_color ($i))." " . ($self -> text ($i)) .color('clear' )."\n"; } } # add # # add item to menu # # input: # Menu object # string # sub reference sub add($$$;$$) { my $self = shift; my $string = shift; my $sub = shift; my $i = @{ $self }; debug 3; debug 4, "item: ".$i."\n" ."string: ".$string."\n" ."code: ".$sub."\n"; $self -> letter ($i, $string); $self -> text ($i, $string); $self -> exec ($i, $sub); $self -> letter_color($i, shift) if @_; $self -> text_color ($i, shift) if @_; return $self; } # execute # # execute menu # # input: # reference of menu hash # terminal object sub execute($$) { my $self = shift; my $term = shift; debug 3; $self -> print; my $letters = ""; for (my $i = 0; $i < @{ $self }; $i++) { next unless defined $self -> letter($i); $letters .= $self -> letter($i); } my $prompt = $letters; $prompt =~ s/\W//g; while(1) { my $l; until ($l && ($l =~ /^[$letters]?$/)) { $l = $term -> readline("$prompt\: "); defined $l ? chomp $l : print "\n"; } for (my $i = 0; $i < @{ $self }; $i++) { next unless $self -> letter($i); next unless $l eq $self -> letter($i); return &{ $self -> exec($i) }; } } } 1; ddtc-0.17.2/po/0000755000000000000000000000000012657270720010033 5ustar ddtc-0.17.2/po/fr.po0000644000000000000000000004031607746322012011001 0ustar # ddtc fr.po # # Copyright (C) 2003 Nicolas Bertolissio # This file is distributed under the same license as the ddtc package. # Nicolas Bertolissio, 2003 # msgid "" msgstr "" "Project-Id-Version: ddtc 0.10.4\n" "Report-Msgid-Bugs-To: Nicolas Bertolissio \n" "POT-Creation-Date: 2003-10-25 00:12+0200\n" "PO-Revision-Date: 2003-08-13 09:41+0200\n" "Last-Translator: Nicolas Bertolissio \n" "Language-Team: French translators \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-15\n" "Content-Transfer-Encoding: 8bit\n" #: ../ddtc:247 ../ddtc:287 ../ddtc:334 ../ddtc:544 ../ddtc:546 #, c-format msgid "Cannot read the contents of `%s': %s\n" msgstr "Impossible de lire le contenu de « %s » : %s\n" #: ../ddtc:431 msgid "" "Email address not defined! Please define your environment EMAIL variable or " "use `mail_out' and/or `mail_in' in your .ddtcrc configuration file, see " "ddtcrc(5).\n" msgstr "" "Adresse électronique non définie ! Veuillez définir la variable " "d'environnement EMAIL ou utiliser « mail_out » ou « mail_in » dans votre " "fichier de configuration .ddtcrc, voir ddtcrc(5).\n" #: ../ddtc:441 msgid "" "No language provided, please either set the `language' variable in your ." "ddtcrc configuration file, or use the --lang or -l option.\n" msgstr "" "Langue non définie, veuillez définir la variable « language » dans votre " "fichier de configuration .ddtcrc, ou utilisez l'option « --lang » ou « -" "l ».\n" #: ../ddtc:453 #, c-format msgid "" "Please check ddtc configuration.\n" "Cannot create `%s': %s\n" msgstr "" "Veuillez vérifier la configuration de ddtc.\n" "Impossible de créer « %s » : %s\n" #: ../ddtc:469 msgid "" "No charset defined, please set the `mail_charset' variable in your .ddtcrc " "configuration file, see ddtcrc(5).\n" msgstr "" "Jeu de caractères non défini, veuillez définir la variable « mail_charset » " "dans votre fichier de configuration .ddtcrc, voir ddtcrc(5).\n" #: ../ddtc:490 #, c-format msgid "Cannot move `%s' -> `%s': %s\n" msgstr "Impossible de déplacer « %s » vers « %s » : %s\n" #: ../ddtc:503 #, c-format msgid "Cannot remove `%s': %s\n" msgstr "Impossible de supprimer « %s » : %s\n" #: ../ddtc:516 ../ddtc:528 #, c-format msgid "Cannot create `%s': %s\n" msgstr "Impossible de créer « %s » : %s\n" #: ../ddtc:517 ../ddtc:530 #, c-format msgid "Cannot write `%s': %s\n" msgstr "Impossible d'écrire dans « %s » : %s\n" #: ../ddtc:662 #, c-format msgid "" "Unknown sdiff instruction: %s.\n" "This is a BUG, please report it to ddtc package maintainer\n" msgstr "" "Instruction sdiff inconnue : %s.\n" "Ceci est un BOGUE, veuillez le signaler au responsable du paquet ddtc.\n" #: ../ddtc:714 ../ddtc:718 msgid "Unable to run apt-cache: maybe you are not on a Debian system!\n" msgstr "" "Impossible de lancer apt-cache : peut-être n'êtes-vous pas sur un système " "Debian !\n" #: ../ddtc:721 #, c-format msgid "I guess `%s' referes to `%s'\n" msgstr "Je devine que « %s » se réfère à « %s »\n" #: ../ddtc:727 #, c-format msgid "I can't guess `%s', output file named `%s'\n" msgstr "Impossible de trouver « %s », fichier nommé « %s »\n" #: ../ddtc:751 ../ddtc:817 ../ddtc:908 #, c-format msgid "" "%s, skipped, malformed data:\n" "%s%s" msgstr "" "%s, ignoré, données mal formées :\n" "%s%s" #: ../ddtc:752 ../ddtc:818 ../ddtc:909 msgid "no name" msgstr "sans nom" #: ../ddtc:753 ../ddtc:819 ../ddtc:910 msgid "Missing description\n" msgstr "description manquante\n" #: ../ddtc:754 ../ddtc:820 ../ddtc:911 msgid "Missing translation\n" msgstr "traduction manquante\n" #: ../ddtc:886 #, c-format msgid "ok: %s\n" msgstr "correct : %s\n" #: ../ddtc:918 #, c-format msgid "" "collision detected, %s exists, try to rename it into %s\n" "%s skipped\n" msgstr "" "collision détectée, %s existe, essayez de le renommer %s\n" "%s ignoré\n" #: ../ddtc:922 #, c-format msgid "" "collision detected, %s exists, try to remove it and rename %s into %s.\n" "%s skipped\n" msgstr "" "collision détectée, %s existe, essayez de le supprimer et de renommer %s %" "s.\n" #: ../ddtc:960 ../ddtc:966 #, c-format msgid "parsed already %s\n" msgstr "déjà analysé : %s\n" #: ../ddtc:1110 #, c-format msgid "package: %s\n" msgstr "paquet : %s\n" #: ../ddtc:1118 #, c-format msgid "reviewer: %s\n" msgstr "relecteur : %s\n" #: ../ddtc:1126 #, c-format msgid "translator: %s\n" msgstr "traducteur : %s\n" #: ../ddtc:1133 #, c-format msgid "bug number: %s\n" msgstr "numéro de rapport : %s\n" #: ../ddtc:1197 ../ddtc:1230 #, c-format msgid "Unable to convert charset from %s to %s\n" msgstr "Impossible de convertir le jeu de caractères de %s vers %s\n" #: ../ddtc:1263 #, c-format msgid "" "Unknown line:\n" "%s\n" msgstr "" "Ligne inconnue :\n" "%s\n" #: ../ddtc:1298 #, c-format msgid "Cannot parse mime stream: %s\n" msgstr "Impossible d'analyser le flux MIME : %s\n" #: ../ddtc:1303 msgid "" "This is NOT a multipart mime message. Please make sure you've provided the " "whole message to STDIN including the headers and encoded mime parts.\n" msgstr "" "Ceci n'est pas un message MIME en plusieurs parties. Veuillez vérifier que " "vous avez fourni à l'entrée standard la totalité du message y compris les en-" "têtes et les parties MIME codées.\n" #: ../ddtc:1350 #, c-format msgid "fixed: %s\n" msgstr "corrigé : %s\n" #: ../ddtc:1399 msgid "Number of paragraphs differs in description and translation\n" msgstr "" "Le nombre de paragraphes est différent entre la description et la " "traduction\n" #: ../ddtc:1417 #, c-format msgid "" "Line %s, not allowed:\n" "%s\n" "%s\n" msgstr "" "Ligne %s, caractère interdit :\n" "%s\n" "%s\n" #: ../ddtc:1422 #, c-format msgid "" "Line %s, dot starts non-empty line:\n" "%s\n" " ^\n" msgstr "" "Ligne %s, point débutant une ligne non-vide :\n" "%s\n" " ^\n" #: ../ddtc:1431 #, c-format msgid "" "Line %s too long:\n" "%s\n" "%s^\n" msgstr "" "Ligne %s trop longue :\n" "%s\n" "%s^\n" #: ../ddtc:1583 #, c-format msgid "translation skipped: %s\n" msgstr "traduction ignorée : %s\n" #: ../ddtc:1592 #, c-format msgid "translation: %s\n" msgstr "traduction : %s\n" #: ../ddtc:1623 #, c-format msgid "review skipped: %s\n" msgstr "relecture ignorée : %s\n" #: ../ddtc:1637 #, c-format msgid "review (ok): %s\n" msgstr "relecture (correcte) : %s\n" #: ../ddtc:1640 #, c-format msgid "review (bug): %s\n" msgstr "relecture (erronée) : %s\n" #: ../ddtc:1647 ../ddtc:1942 msgid "Cannot send email" msgstr "Impossible d'envoyer le courriel" #: ../ddtc:1661 #, c-format msgid "sent: #%s\n" msgstr "nombre envoyé : %s\n" #: ../ddtc:1663 msgid "nothing to send\n" msgstr "rien à envoyer\n" #: ../ddtc:1684 msgid "Removing files...\n" msgstr "Suppression des fichiers...\n" #: ../ddtc:1793 #, c-format msgid "" "===== translations\n" " to do: %s\n" " to send: %s\n" " sent: %s\n" " accepted: %s\n" " %s\n" "translated: %s\n" msgstr "" "===== traductions\n" " à faire : %s\n" "à envoyer : %s\n" " envoyées : %s\n" "acceptées : %s\n" " %s\n" "traduites : %s\n" #: ../ddtc:1793 ../ddtc:1797 ../ddtc:1802 msgid "-" msgstr "-" #: ../ddtc:1797 #, c-format msgid "" "===== bug reports\n" " reports: %s\n" " fixed: %s\n" " %s\n" " opened: %s\n" msgstr "" "===== rapports de relecture\n" " rapports : %s\n" " corrigés : %s\n" " %s\n" " ouverts : %s\n" #: ../ddtc:1802 #, c-format msgid "" "===== reviews\n" " to do: %s\n" " to send: %s\n" " bugged: %s\n" " agreed: %s\n" " accepted: %s\n" " %s\n" " reviewed: %s\n" msgstr "" "===== relectures\n" " à faire : %s\n" "à envoyer : %s\n" " boguées : %s\n" " justes : %s\n" "acceptées : %s\n" " %s\n" " relues : %s\n" #: ../ddtc:1837 msgid "" "section\n" "missing section name, set to none\n" msgstr "" "section\n" "nom de section manquant, aucun utilisé\n" #: ../ddtc:1848 msgid "" "sget\n" "missing package name, command skipped\n" msgstr "" "sget\n" "nom de paquet manquant, commande ignorée\n" #: ../ddtc:1858 msgid "" "get\n" "missing number or package name, command skipped\n" msgstr "" "get\n" "nom de paquet manquant, commande ignorée\n" #: ../ddtc:1868 msgid "" "review\n" "missing number or package name, command skipped\n" msgstr "" "review\n" "nom de paquet manquant, commande ignorée\n" #: ../ddtc:1877 msgid "" "getbug\n" "missing bug number, command skipped\n" msgstr "" "getbug\n" "nom de paquet manquant, commande ignorée\n" #: ../ddtc:1886 msgid "" "btsclose\n" "missing bug number, command skipped\n" msgstr "" "btsclose\n" "nom de paquet manquant, commande ignorée\n" #: ../ddtc:1895 msgid "" "notification\n" "missing language, command skipped\n" msgstr "" "notification\n" "langue manquante, commande ignorée\n" #: ../ddtc:1944 #, c-format msgid "command sent to the server: %s\n" msgstr "commande envoyée au serveur : %s\n" #: ../ddtc:1983 #, c-format msgid "" "%s\n" "_yes\n" "_no" msgstr "" "%s\n" "_oui\n" "_non" #: ../ddtc:1987 ../ddtc:1991 msgid "yes" msgstr "oui" #: ../ddtc:1987 ../ddtc:1991 msgid "no" msgstr "non" #: ../ddtc:1997 msgid "" "Configuration\n" "_general\n" "_mail\n" "_colors\n" "_save and exit\n" "_X_exit and discard changes" msgstr "" "Configuration\n" "_générale\n" "_courriel\n" "cou_leurs\n" "_sauvegarder et quitter\n" "_X_annuler les modifications et quitter" #: ../ddtc:2004 #, c-format msgid "" "General configuration\n" "_base directory %s\n" "c_omment %s\n" "_clean regex %s\n" "_language %s\n" "_editor %s\n" "ddtc _bug %s\n" "_quit" msgstr "" "Configuration générale\n" "répertoire de _base %s\n" "_commentaire %s\n" "_regex de nettoyage %s\n" "_langue %s\n" "édit_eur %s\n" "rapports _ddtc %s\n" "_quitter" #: ../ddtc:2007 msgid "Send bugs in special format" msgstr "Envoyer les rapports au format spécial ddtc" #: ../ddtc:2012 #, c-format msgid "" "Mail configuration\n" "_outgoing %s\n" "_incoming %s\n" "_server %s\n" "_encoding %s\n" "_charset %s\n" "se_lf %s\n" "_quit" msgstr "" "Configuration du courriel\n" "é_mission %s\n" "_réception %s\n" "_serveur %s\n" "_codage %s\n" "_jeu de caractères %s\n" "_en copie %s\n" "_quitter" #: ../ddtc:2015 msgid "Send mails to oneself" msgstr "Se mettre en copie" #: ../ddtc:2020 #, c-format msgid "" "Color configuration\n" "t_itle %s\n" "_letter %s\n" "_text %s\n" "_quit" msgstr "" "Configuration de la couleur\n" "t_itre %s\n" "_lettre %s\n" "_texte %s\n" "_quitter" #: ../ddtc:2031 #, c-format msgid "`%s' already exists, keeping `%s' as base directory.\n" msgstr "« %s » existe déjà, répertoire de base « %s » conservé.\n" #: ../ddtc:2035 #, c-format msgid "Cannot move `%s' to `%s': %s\n" msgstr "Impossible de déplacer « %s » vers « %s » : %s\n" #: ../ddtc:2155 msgid "" "Edit translation\n" "_first file\n" "_choose\n" "at _random\n" "_last file\n" "_quit" msgstr "" "Éditer des traductions\n" "_premier fichier\n" "_choisir\n" "au _hasard\n" "_dernier fichier\n" "_quitter" #: ../ddtc:2163 ../ddtc:2225 ../ddtc:2287 msgid "no file to edit" msgstr "pas de fichier à éditer" #: ../ddtc:2183 ../ddtc:2245 #, c-format msgid "" "Edit %s\n" "_edit\n" "run _acheck\n" "set for _send\n" "_quit" msgstr "" "Éditer %s\n" "édit_er\n" "lancer _acheck\n" "_préparer pour l'envoi\n" "_quitter" #: ../ddtc:2196 ../ddtc:2258 ../ddtc:2320 msgid "no more file to edit" msgstr "plus de fichier à éditer" #: ../ddtc:2217 msgid "" "Edit review\n" "_first file\n" "_choose\n" "at _random\n" "_last file\n" "_quit" msgstr "" "Éditer des relectures\n" "_premier fichier\n" "_choisir\n" "au _hasard\n" "_dernier fichier\n" "_quitter" #: ../ddtc:2279 msgid "" "Edit bug report\n" "_first file\n" "_choose\n" "at _random\n" "_last file\n" "_quit" msgstr "" "Éditer des rapports de relecture\n" "_premier fichier\n" "_choisir\n" "au _hasard\n" "_dernier fichier\n" "_quitter" #: ../ddtc:2307 #, c-format msgid "" "Edit %s\n" "_edit\n" "run _acheck\n" "set as _fixed\n" "_quit" msgstr "" "Éditer %s\n" "édit_er\n" "lancer _acheck\n" "marquer _corrigé\n" "_quitter" #: ../ddtc:2343 msgid "" "Server command\n" "get descriptions of a _source package\n" "_get descriptions\n" "get _reviews\n" "set s_ection\n" "get a _bug report\n" "_close a bugreport\n" "_list translated packages\n" "get translation s_tatus\n" "_quit" msgstr "" "Commande du serveur\n" "recevoir les descriptions d'un paquet _source\n" "recevoir des _descriptions\n" "recevoir des _relectures\n" "choisir une s_ection\n" "_b_recevoir un rapport de relecture\n" "_clôturer un rapport de relecture\n" "_lister les paquets traduits\n" "recevoir l'é_tat des traductions\n" "_quitter" #: ../ddtc:2349 msgid "source package name: " msgstr "nom d'un paquet source : " #: ../ddtc:2352 ../ddtc:2355 msgid "package name or number: " msgstr "nom d'un paquet ou nombre : " #: ../ddtc:2358 msgid "section name: " msgstr "nom d'une section : " #: ../ddtc:2360 ../ddtc:2363 msgid "bug number: " msgstr "numéro de rapport de relecture : " #: ../ddtc:2381 msgid "" "Main menu\n" "_Mail descriptions to the server\n" "_Fix bugged descriptions\n" "_Clean obsolete files\n" "print _Statistics\n" "send _server command\n" "c_onfigure\n" "edit _translation\n" "edit _review\n" "edit _bug report\n" "_quit" msgstr "" "Menu principal\n" "_Envoyer les descriptions au serveur\n" "_Corriger les descriptions erronées\n" "S_upprimer les fichiers obsolètes\n" "Afficher les _Statistiques\n" "Envoyer une commande au _serveur\n" "_configuration\n" "éditer des _traductions\n" "éditer des _relectures\n" "_b_éditer des rapports de relecture\n" "_quitter" #: ../ddtc:2397 #, c-format msgid "%s version %s\n" msgstr "%s version %s\n" #: ../ddtc:2411 #, c-format msgid "" "Usage: %s [OPTIONS] COMMAND [ARGUMENTS]\n" "\n" "commands:\n" " parse extract the package descriptions from a ddts mail\n" " mail send descriptions back to the ddts\n" " fix create a fixed description from bugs\n" " clean remove obsolete files\n" " stats print statistics\n" " and server commands\n" "\n" "options:\n" " -q, --quiet quiet mode\n" " -v verbose, add more for more verbosity\n" " --verbose n set verbosity to n\n" " -s, --mail-self send mail copy to oneself\n" " -n, --nomail-self don't send mail copy to oneself\n" " -l, --lang xx_XX use xx_XX language extension\n" " -V, --version print version and exit\n" " -h, --help print this message and exit\n" "\n" "%s version %s\n" msgstr "" "Usage : %s [OPTIONS] COMMANDE [ARGUMENTS]\n" "\n" "commandes :\n" " parse extrait les descriptions d'un courriel du ddts\n" " mail renvoie les descriptions au ddts\n" " fix crée une version corrigée des descriptions\n" " clean supprimer les fichiers obsolètes\n" " stats affiche les statistiques\n" " ainsi que les commandes du serveur\n" "\n" "options :\n" " -q, --quiet mode silencieux\n" " -v bavard, répéter pour augmenter le bavardage\n" " --verbose n niveau de bavardage n\n" " -s, --mail-self s'envoyer des copies des courriels\n" " -n, --nomail-self ne pas s'envoyer des copies des courriels\n" " -l, --lang xx_XX utiliser la langue xx_XX\n" " -V, --version afficher la version et quitter\n" " -h, --help afficher ce message et quitter\n" "\n" "%s version %s\n" #: ../ddtc:2496 #, c-format msgid "Unknown command `%s'\n" msgstr "Commande inconnue « %s »\n" #: ../Common.pm:91 msgid "ERROR " msgstr "ERREUR " #: ../Common.pm:110 msgid "WARNING " msgstr "ATTENTION " #: ../Package.pm:84 #, c-format msgid "Cannot read `%s': %s\n" msgstr "Impossible de lire « %s » : %s\n" #: ../Package.pm:152 #, c-format msgid "" "%s: unknown line:\n" "%s\n" "This is a BUG, please report it to the maintainer.\n" msgstr "" "%s : ligne inconnue :\n" "%s\n" "Ceci est un BOGUE, veuillez le signaler au responsable du paquet.\n" #: ../Package.pm:156 #, c-format msgid "" "%s: malformed description file:\n" "no description found!\n" msgstr "" "%s : fichier de description invalide :\n" "Description non trouvée !\n" #: ../Package.pm:160 #, c-format msgid "" "%s: malformed description file:\n" "no translation and/or no language found!\n" msgstr "" "%s : fichier de description invalide :\n" "Traduction ou langue non trouvée !\n" ddtc-0.17.2/po/Makefile0000644000000000000000000000137207722444000011465 0ustar XGETTEXT = xgettext MSGFMT = msgfmt MSGMERGE = msgmerge LOCALEDIR = "usr/share/locale" .SUFFIXES: .po .mo .pot %.mo: %.po $(MSGFMT) -o $@ $< %.pox: %.po ddtc.pot $(MSGMERGE) -o $@ $^ LANG = $(basename $(shell ls *.po)) MO = $(addsuffix .mo,$(LANG)) POX = $(addsuffix .pox,$(LANG)) all: $(MO) update: $(POX) ddtc.pot: ../ddtc ../Package.pm ../Common.pm ../Menu.pm $(XGETTEXT)\ --copyright-holder="2001-2003 Nicolas Bertolissio"\ --msgid-bugs-address="Nicolas Bertolissio "\ --keyword=__\ --output=$@\ ../ddtc ../*.pm install: $(MO) for i in $(MO) ; do \ t=$(DESTDIR)/$(LOCALEDIR)/`basename $$i .mo`/LC_MESSAGES ;\ install -d $$t ;\ install -m 644 $$i $$t/ddtc.mo ;\ done clean: $(RM) $(MO) *~ ddtc.pot *.pox ddtc-0.17.2/ddtc0000755000000000000000000020363610132043621010253 0ustar #!/usr/bin/perl -w use strict; use File::Copy; use File::Path; use File::Spec::Functions; use Getopt::Long; use MIME::Parser; use Config::General; use Ddtc::Common; use Ddtc::Package; use Ddtc::Menu; use Algorithm::Diff qw(diff sdiff); use Text::Iconv; use Term::ReadLine; use Term::ANSIColor; # # Constants setting # use constant VERSION => "0.17"; # script version number use constant CONFFILE => ".ddtcrc"; # config file my %DDTS_CHARSETS = ( de => "ISO-8859-1", da => "ISO-8859-1", fr => "ISO-8859-1", it => "ISO-8859-1", nl => "ISO-8859-1", pl => "ISO-8859-2", hu => "ISO-8859-2", pt_BR => "ISO-8859-1", pt_PT => "ISO-8859-1", sk => "ISO-8859-2", sv_SE => "ISO-8859-1", ja => "euc-jp", uk => "koi8-u", ru => "koi8-r", cs => "ISO-8859-2", fi => "ISO-8859-1", es => "ISO-8859-1", eo => "UTF-8" ); my $Me = $0; # get command name with path $Me =~ s/.*\/([^\/]*)$/$1/; # keep script name # # Configuration # my $Base_dir; # ddts base directory my $Tr_dir; # directory for translations my $Rev_dir; # directory for reviews my $Bug_dir; # directory for bugs my $Todo_e; # file extension for files to review/translate my $Tr_e; # file extension for translated files my $Rev_e; # file extension for reviewed files my $Lok_e; # file extension for locally accepted files my $Bug_e; # file extension for bug report files my $Fix_e; # file extension for bugs fixed files my $Sent_e; # file extension for sent files my $Old_e; # file extension for old files my $Ok_e; # file extension for descriptions which passed the review process my $Mail_out; # outgoing mail address my $Mail_in; # incoming mail address my $Mail_server; # server mail address my $Mail_self; # send mails to myself also if set to `yes' my $Mail_enc; # mail encoding for mime my $Mail_charset; # mail charset for mime my $Comment; # comment string a space will be added my $Clean_re; # regexp for clean command my $Language; # language postfix my $Ddtc_bug; # create non standard ddts bug reports my $Editor; # editor my @Menu_colors; # menu colors my $Menu_title_color; # menu title color my $Menu_letter_color; # menu letter color my $Menu_text_color; # menu text color my $Term; # terminal # load_conf # # set global variables # # input: # config hash sub load_conf(%) { my %conf = @_; $Base_dir = $conf{'base_dir'}; # ddts base directory $Comment = $conf{'comment'}; # comment string a space will be added $Clean_re = $conf{'clean_regex'}; # regexp for clean command $Editor = $conf{'editor'}; # editor $Ddtc_bug = $conf{'ddtc_bug'}; # create non standard ddts bug reports $Language = $conf{'language'}; # language postfix $Mail_out = $conf{'mail_out'}; # outgoing mail address $Mail_in = $conf{'mail_in'}; # incoming mail address $Mail_server = $conf{'mail_server'}; # server mail address $Mail_enc = $conf{'mail_encoding'}; # mail encoding for mime $Mail_charset = $conf{'mail_charset'}; # mail charset for mime $Mail_self = $conf{'mail_self'}; # send mails to myself also if set to `yes' $Menu_title_color = $conf{'menu_title_color'}; # menu title color $Menu_letter_color = $conf{'menu_letter_color'}; # menu letter color $Menu_text_color = $conf{'menu_text_color'}; # menu text color @Menu_colors =($Menu_letter_color, $Menu_text_color, $Menu_title_color); # set directories $Base_dir = "$ENV{HOME}/$Base_dir" unless $Base_dir =~ /^\//; $Tr_dir = "$Base_dir/tr"; $Rev_dir = "$Base_dir/rev"; $Bug_dir = "$Base_dir/bug"; # set extentions $Todo_e = "todo"; $Tr_e = "tr"; $Rev_e = "rev"; $Lok_e = "lok"; $Bug_e = "bug"; $Fix_e = "fix"; $Sent_e = "sent"; $Old_e = "old"; $Ok_e = "ok"; # set incomming email address if not defined $Mail_in = $Mail_out unless $Mail_in; # set debug level set_debug ($conf{'debug'}); } my %conf = ( base_dir => 'ddts', comment => '>>', clean_regex => '~$|\.old$|\.bak$', editor => 'sensible-editor', ddtc_bug => 0, language => '', debug => 1, mail_out => $ENV{EMAIL} || $ENV{DEBEMAIL} || '', mail_in => '', mail_server => 'pdesc@ddtp.debian.org', mail_encoding => '8bit', mail_charset => 'iso-8859-1', mail_self => 1, menu_title_color => 'bold cyan', menu_letter_color => 'bold cyan', menu_text_color => 'cyan', ); if (-e catfile($ENV{HOME}, CONFFILE)) { my $config = new Config::General ( -ConfigFile => catfile($ENV{HOME}, CONFFILE), -AllowMultiOptions => 'no', -LowerCaseNames => 'yes', -UseApacheInclude => 'no', -MergeDuplicateOptions => 'yes', -AutoTrue => 'yes', -DefaultConfig => \%conf ); %conf = $config -> getall; } load_conf %conf; ################################################################################ # # standardise directories and file extentions # { if ((exists $conf{'tr_dir' }) || (exists $conf{'rev_dir' }) || (exists $conf{'bug_dir' }) || (exists $conf{'todo_ext'}) || (exists $conf{'tr_ext' }) || (exists $conf{'rev_ext' }) || (exists $conf{'lok_ext' }) || (exists $conf{'bug_ext' }) || (exists $conf{'fix_ext' }) || (exists $conf{'sent_ext'}) || (exists $conf{'old_ext' }) || (exists $conf{'ok_ext' })) { warning "Standardising directories and file extentions.\n"; sleep 3; $Tr_dir = $conf{'tr_dir'} || "tr"; $Rev_dir = $conf{'rev_dir'} || "rev"; $Bug_dir = $conf{'bug_dir'} || "bug"; $Todo_e = $conf{'todo_ext'} || "todo"; $Tr_e = $conf{'tr_ext'} || "tr"; $Rev_e = $conf{'rev_ext'} || "rev"; $Lok_e = $conf{'lok_ext'} || "lok"; $Bug_e = $conf{'bug_ext'} || "bug"; $Fix_e = $conf{'fix_ext'} || "fix"; $Sent_e = $conf{'sent_ext'} || "sent"; $Old_e = $conf{'old_ext'} || "old"; $Ok_e = $conf{'ok_ext'} || "ext"; $Tr_dir = "$Base_dir/$Tr_dir" unless $Tr_dir =~ /^\//; $Rev_dir = "$Base_dir/$Rev_dir" unless $Rev_dir =~ /^\//; $Bug_dir = "$Base_dir/$Bug_dir" unless $Bug_dir =~ /^\//; if (( $Tr_dir ne "$Base_dir/tr" ) || ($Rev_dir ne "$Base_dir/rev") || ($Bug_dir ne "$Base_dir/bug") || ( $Fix_e ne "fix" ) || ( $Bug_e ne "bug" ) || ( $Ok_e ne "ok" ) || ($Todo_e ne "todo") || ( $Tr_e ne "tr" ) || ( $Rev_e ne "rev" ) || ( $Lok_e ne "lok" ) || ($Sent_e ne "sent") || ( $Old_e ne "old" )) { warning "Moving directories...\n"; sleep 2; if ((-d $Tr_dir) && ( $Tr_dir ne "$Base_dir/tr" )) { warning "`$Tr_dir' to `$Base_dir/tr'\n"; suicide "`$Base_dir/tr already exists, please remove it and fix config file if requested\n" if -e "$Base_dir/tr"; move( $Tr_dir, "$Base_dir/tr" ) or suicide "move failed: $!"; } if ((-d $Rev_dir) && ($Rev_dir ne "$Base_dir/rev")) { warning "`$Rev_dir' to `$Base_dir/rev'\n"; suicide "`$Base_dir/rev already exists, please remove it and fix config file if requested\n" if -e "$Base_dir/rev"; move($Rev_dir, "$Base_dir/rev") or suicide "move failed: $!"; } if ((-d $Bug_dir) && ($Bug_dir ne "$Base_dir/bug")) { warning "`$Bug_dir' to `$Base_dir/bug'\n"; suicide "`$Base_dir/bug already exists, please remove it and fix config file if requested\n" if -e "$Base_dir/bug"; move($Bug_dir, "$Base_dir/bug") or suicide "move failed: $!"; } warning "Moving extentions...\n"; warning "Entering `$Base_dir/tr'.\n"; sleep 2; opendir (DIR, "$Base_dir/tr") or suicide __("Cannot read the contents of `%s': %s\n"), "$Base_dir/tr", $!; if ( $Old_e ne "old" ) { foreach (readdir(DIR)) { next unless s/\.$Old_e$//; warning "moving `$_.$Old_e' to `$_.old'\n"; move("$Base_dir/tr/$_.$Old_e", "$Base_dir/tr/$_.old") or suicide "move failed: $!"; } } if ( $Ok_e ne "ok" ) { foreach (readdir(DIR)) { next unless s/\.$Ok_e$//; warning "moving `$_.$Ok_e' to `$_.ok'\n"; move("$Base_dir/tr/$_.$Ok_e", "$Base_dir/tr/$_.ok") or suicide "move failed: $!"; } } if ($Sent_e ne "sent") { foreach (readdir(DIR)) { next unless s/\.$Sent_e$//; warning "moving `$_.$Sent_e' to `$_.sent'\n"; move("$Base_dir/tr/$_.$Sent_e", "$Base_dir/tr/$_.sent") or suicide "move failed: $!"; } } if ( $Tr_e ne "tr" ) { foreach (readdir(DIR)) { next unless s/\.$Tr_e$//; warning "moving `$_.$Tr_e' to `$_.tr'\n"; move("$Base_dir/tr/$_.$Tr_e", "$Base_dir/tr/$_.tr") or suicide "move failed: $!"; } } if ($Todo_e ne "todo") { foreach (readdir(DIR)) { next unless s/\.$Todo_e$//; warning "moving `$_.$Todo_e' to `$_.todo'\n"; move("$Base_dir/tr/$_.$Todo_e", "$Base_dir/tr/$_.todo") or suicide "move failed: $!"; } } closedir DIR; warning "Entering `$Base_dir/rev'.\n"; sleep 2; opendir (DIR, "$Base_dir/rev") or suicide __("Cannot read the contents of `%s': %s\n"), "$Base_dir/rev", $!; if ( $Old_e ne "old" ) { foreach (readdir(DIR)) { next unless s/\.$Old_e$//; warning "moving `$_.$Old_e' to `$_.old'\n"; move("$Base_dir/rev/$_.$Old_e", "$Base_dir/rev/$_.old") or suicide "move failed: $!"; } } if ( $Ok_e ne "ok" ) { foreach (readdir(DIR)) { next unless s/\.$Ok_e$//; warning "moving `$_.$Ok_e' to `$_.ok'\n"; move("$Base_dir/rev/$_.$Ok_e", "$Base_dir/rev/$_.ok") or suicide "move failed: $!"; } } if ( $Lok_e ne "lok" ) { foreach (readdir(DIR)) { next unless s/\.$Lok_e$//; warning "moving `$_.$Lok_e' to `$_.lok'\n"; move("$Base_dir/rev/$_.$Lok_e", "$Base_dir/rev/$_.lok") or suicide "move failed: $!"; } } if ($Sent_e ne "sent") { foreach (readdir(DIR)) { next unless s/\.$Sent_e$//; warning "moving `$_.$Sent_e' to `$_.sent'\n"; move("$Base_dir/rev/$_.$Sent_e", "$Base_dir/rev/$_.sent") or suicide "move failed: $!"; } } if ( $Rev_e ne "rev" ) { foreach (readdir(DIR)) { next unless s/\.$Rev_e$//; warning "moving `$_.$Rev_e' to `$_.rev'\n"; move("$Base_dir/rev/$_.$Rev_e", "$Base_dir/rev/$_.rev") or suicide "move failed: $!"; } } if ($Todo_e ne "todo") { foreach (readdir(DIR)) { next unless s/\.$Todo_e$//; warning "moving `$_.$Todo_e' to `$_.todo'\n"; move("$Base_dir/rev/$_.$Todo_e", "$Base_dir/rev/$_.todo") or suicide "move failed: $!"; } } closedir DIR; warning "Entering `$Base_dir/bug'.\n"; sleep 2; opendir (DIR, "$Base_dir/bug") or suicide __("Cannot read the contents of `%s': %s\n"), "$Base_dir/bug", $!; if ( $Old_e ne "old" ) { foreach (readdir(DIR)) { next unless s/\.$Old_e$//; warning "moving `$_.$Old_e' to `$_.old'\n"; move("$Base_dir/bug/$_.$Old_e", "$Base_dir/bug/$_.old") or suicide "move failed: $!"; } } if ( $Fix_e ne "fix" ) { foreach (readdir(DIR)) { next unless s/\.$Fix_e$//; warning "moving `$_.$Fix_e' to `$_.fix'\n"; move("$Base_dir/bug/$_.$Fix_e", "$Base_dir/bug/$_.fix") or suicide "move failed: $!"; } } if ( $Bug_e ne "bug" ) { foreach (readdir(DIR)) { next unless s/\.$Bug_e$//; warning "moving `$_.$Bug_e' to `$_.bug'\n"; move("$Base_dir/bug/$_.$Bug_e", "$Base_dir/bug/$_.bug") or suicide "move failed: $!"; } } closedir DIR; warning "File operations completed.\n"; } warning "Preparing new config file...\n"; $conf{'base_dir'} =~ s/$ENV{HOME}\/// if $conf{'base_dir'}; delete $conf{'base_dir'} if $Base_dir eq "$ENV{HOME}/ddts"; delete $conf{'comment'} if $Comment eq ">>"; delete $conf{'clean_regex'} if $Clean_re eq "~\$|\\.old\$|\\.bak\$"; delete $conf{'editor'} if $Editor eq "sensible-editor"; delete $conf{'ddtc_bug'} unless $Ddtc_bug; delete $conf{'language'} unless $conf{'language'}; delete $conf{'debug'} if $conf{'debug'} == 1; delete $conf{'mail_out'} if $Mail_out eq ($ENV{EMAIL} || $ENV{DEBEMAIL} || ''); delete $conf{'mail_in'} if $Mail_in eq $Mail_out; delete $conf{'mail_self'} if $Mail_self; delete $conf{'mail_encoding'} if $Mail_enc eq "8bit"; delete $conf{'mail_charset'} if $Mail_charset eq "iso-8859-1"; delete $conf{'menu_title_color'} if $Menu_title_color eq "bold cyan"; delete $conf{'menu_letter_color'} if $Menu_letter_color eq "bold cyan"; delete $conf{'menu_text_color'} if $Menu_text_color eq "cyan"; foreach (keys %conf) { next if $_ eq 'base_dir'; next if $_ eq 'comment'; next if $_ eq 'clean_regex'; next if $_ eq 'editor'; next if $_ eq 'ddtc_bug'; next if $_ eq 'language'; next if $_ eq 'debug'; next if $_ eq 'mail_out'; next if $_ eq 'mail_in'; next if $_ eq 'mail_self'; next if $_ eq 'mail_encoding'; next if $_ eq 'mail_charset'; next if $_ eq 'menu_title_color'; next if $_ eq 'menu_letter_color'; next if $_ eq 'menu_text_color'; delete $conf{$_}; } # save new config file my $config = new Config::General ((-ConfigHash => \%conf)); $config -> save_file(catfile($ENV{HOME}, CONFFILE)); warning "New config file saved.\n"; warning "Please restart ddtc.\n"; exit -1; } } # # standardise directories and file extentions # ################################################################################ # # Tests # # test_mail # # Stop if mail address is not defined # sub test_mail() { suicide __("Email address not defined! Please define your environment EMAIL variable or use `mail_out' and/or `mail_in' in your .ddtcrc configuration file, see ddtcrc(5).\n") unless ($Mail_out and $Mail_in); } # test_language # # Stop if language is not defined # sub test_language() { suicide __("No language provided, please either set the `language' variable in your .ddtcrc configuration file, or use the --lang or -l option.\n") unless $Language && ($Language ne ""); } # test_directories # # Stop if directories cannot be created # sub test_directories() { foreach ($Tr_dir, $Bug_dir, $Rev_dir) { next if (-d $_); mkpath ($_, 0, 0755) or suicide __("Please check ddtc configuration.\nCannot create `%s': %s\n"), $_, $!; } } # get_charset # # get charset # # output: # charset if different from ddts standard # empty string otherwise sub get_charset() { test_language; suicide __("No charset defined, please set the `mail_charset' variable in your .ddtcrc configuration file, see ddtcrc(5).\n") unless $DDTS_CHARSETS{$Language} || $Mail_charset; return $Mail_charset =~ /^$DDTS_CHARSETS{$Language}$/i ? "" : ".$Mail_charset"; } # # File management routines # # Move file sub move_file ($$) { my $old = shift; my $new = shift; debug 3; debug 4, "old filename: $old\n". "new filename: $new\n"; if (-e $old) { move ($old, $new) or suicide __("Cannot move `%s' -> `%s': %s\n"), $old, $new, $!; debug 4, "moved\n"; } } # Remove file sub remove_file ($) { my $file = shift; debug 3; debug 4, "filename: $file\n"; if (-e $file) { unlink $file or suicide __("Cannot remove `%s': %s\n"), $file, $!; debug 2, "$file " if get_debug == 2; debug 4, "removed\n"; } } # Touch file sub touch_file ($) { my $file = shift; debug 3; debug 4, "filename: $file\n"; open FILE, ">$file" or suicide __("Cannot create `%s': %s\n"), $file, $!; close FILE or suicide __("Cannot write `%s': %s\n"), $file, $!; } # Write file sub write_file ($$) { my $file = shift; my $data = shift; debug 3; debug 4, "filename: $file\n"; open FILE, ">$file" or suicide __("Cannot create `%s': %s\n"), $file, $!; print FILE $data; close FILE or suicide __("Cannot write `%s': %s\n"), $file, $!; } # List directory contents sub ls_dir ($;$) { my $dir = shift; my $regex = shift || '$'; my @files; debug 3; debug 4, "directory: $dir\n"; debug 4, "regex: $regex\n"; opendir (PKGLIST, $dir) or suicide __("Cannot read the contents of `%s': %s\n"), $dir, $!; @files = sort grep(/$regex/, readdir(PKGLIST)); closedir PKGLIST or suicide __("Cannot read the contents of `%s': %s\n"), $dir, $!; return (@files); } # uncomment # # remove comments # # input: # commented string # regex # output: # uncommented string sub uncomment ($$) { my @commented = split("\n", shift); my $comment = shift; my @data; debug 3; debug 4, "comment str: `$comment'\n"; debug 5, join("\n", @commented)."\n"; foreach (@commented) { next if /^($comment)/; push @data, $_; } debug 5, join("\n", @data)."\n"; wantarray ? @data : join("\n", @data)."\n"; } # ndiff # # Diff two descriptions # # input: # old description # new description # output: # diff sub ndiff ($$) { my @orig = split("\n", shift); my @dest = split("\n", shift); my @diff; debug 3; my @diffs = diff(\@orig, \@dest); my $o = 0; # index in @orig my $d = 0; # index in @dest foreach my $hunk (@diffs) { foreach (@{ $hunk }) { if ($_->[0] eq '-') { while ($o < $_->[1]) { push @diff, " $orig[$o++]"; $d++; } push @diff, "-$orig[$o++]"; } else { while ($d < $_->[1]) { push @diff, " $dest[$d++]"; $o++; } push @diff, "+$dest[$d++]"; } } } push @diff, " $dest[$d++]" while ($d < @dest); debug 5, join("\n", @diff)."\n"; wantarray ? @diff : join("\n", @diff)."\n"; } # superdiff # # Diff two descriptions, keeping short description before long one # # input: # old description # new description # output: # diff sub superdiff ($$) { my @orig = split("\n", shift); my @dest = split("\n", shift); my @sdiff; debug 3; my @sdiffs = sdiff(\@orig, \@dest); foreach (@sdiffs) { if ($_->[0] eq 'u') { push @sdiff, " ".$_->[1]; } elsif ($_->[0] eq '-') { push @sdiff, "-".$_->[1]; } elsif ($_->[0] eq '+') { push @sdiff, "+".$_->[2]; } elsif ($_->[0] eq 'c') { push @sdiff, "-".$_->[1]; push @sdiff, "+".$_->[2]; } else { suicide __("Unknown sdiff instruction: %s.\nThis is a BUG, please report it to ddtc package maintainer\n"), $_->[0]; } } debug 5, join("\n", @sdiff)."\n"; wantarray ? @sdiff : join("\n", @sdiff)."\n"; } # get_apt_name # # Get the package name through apt-cache # # input: # short description # output: # package name sub get_apt_name ($) { my $short = shift; $short =~ s/^Description: //; my $name; debug 3; debug 4, "short desc.: $short\n"; if (open APT, "apt-cache search '$short' |") { my @names; my $s = $short; $s =~ s/^\W+//; $s =~ s/\W+$//; $s =~ s/(\W)/\\$1/g; # escape non word characters while () { chomp $_; next unless m/$short/; push @names, $_; } if ((close APT ) && @names) { ($name, my $short) = split / - /, shift @names; while (@names) { (my $n, my $s) = split / - /, shift @names; next unless length($s) < length($short); $name = $n; $short = $s; } } elsif (not @names) { $name = undef; } else { $name = undef; warning __("Unable to run apt-cache: maybe you are not on a Debian system!\n"); } } else { $name = undef; warning __("Unable to run apt-cache: maybe you are not on a Debian system!\n"); } if (defined $name) { debug 1, __("I guess `%s' referes to `%s'\n"), $short, $name; } else { $name = "noname-$short"; $name =~ s/(\s)/_/g; $name =~ s/\//_/g; warning __("I can't guess `%s', output file named `%s'\n"), $short, $name; } return ($name); } # parse_translation # # Parse descriptions to translate # # input: # data structure sub parse_translation ($) { my $pkg = shift; debug 3; debug 4, "package: ".($pkg->name || "")."\n". "language: ".($pkg->language || "")."\n". "message id: ".($pkg->message_id || "")."\n"; unless ($pkg->description || $pkg->translation) { warning __("%s, skipped, malformed data:\n%s%s"), $pkg->name || __("no name"), $pkg->description ? "" : __("Missing description\n"), $pkg->translation ? "" : __("Missing translation\n"); return; } my $package = $pkg->name; move_file("$Tr_dir/$package.$Tr_e", "$Tr_dir/$package.$Old_e" ); move_file("$Tr_dir/$package.$Ok_e", "$Tr_dir/$package.$Sent_e"); move_file("$Tr_dir/$package.$Sent_e", "$Tr_dir/$package.$Old_e" ); my $new = new Ddtc::Package::; my $old = new Ddtc::Package::; $new->name ($pkg->name); $new->language ($pkg->language); $new->message_id ($pkg->message_id); unless ($old->get_file("$Tr_dir/$package.$Old_e")) { $old = bless {}; $old = undef; } my @desc; @desc = $old ? superdiff(uncomment($old->description, "#"), $pkg->description) : $pkg->old_description ? superdiff($pkg->old_description, $pkg->description) : superdiff("", $pkg->description) ; @desc = map { $_ = /^\ (.*)/? $1 :$_ } @desc; # remove head character unchanged line @desc = map { $_ = /^\-(.*)/?"# -$1":$_ } @desc; # comment removed line @desc = map { $_ = /^\+(.*)/? $1 :$_ } @desc; # remove head character added line $new->description (@desc); my @tran; @tran = $old ? superdiff(uncomment($old->translation, "#"), $pkg->translation) : $pkg->old_translation ? superdiff($pkg->old_translation, $pkg->translation) : superdiff("", $pkg->translation) ; @tran = map { $_ = /^\ (.*)/? $1 :$_ } @tran; # remove head character unchanged line @tran = map { $_ = /^\-(.*)/?"# -$1":$_ } @tran; # comment removed line @tran = map { $_ = /^\+(.*)/? $1 :$_ } @tran; # remove head character added line $new->translation (@tran); write_file("$Tr_dir/$package.$Todo_e", $new->header .$new->description .$new->translation); } # parse_review # # Parse descriptions to review # # input: # Ddtc object sub parse_review ($) { my $pkg = shift; debug 3; debug 4, "package: ".$pkg->name."\n". "language: ".$pkg->language."\n". "translator: ".$pkg->translator."\n". "message id: ".$pkg->message_id."\n"; unless ($pkg->description || $pkg->translation) { warning __("%s, skipped, malformed data:\n%s%s"), $pkg->name || __("no name"), $pkg->description ? "" : __("Missing description\n"), $pkg->translation ? "" : __("Missing translation\n"); return; } my $package = $pkg->name; move_file("$Rev_dir/$package.$Ok_e", "$Rev_dir/$package.$Sent_e"); move_file("$Rev_dir/$package.$Lok_e", "$Rev_dir/$package.$Sent_e"); move_file("$Rev_dir/$package.$Rev_e", "$Rev_dir/$package.$Sent_e"); move_file("$Rev_dir/$package.$Sent_e", "$Rev_dir/$package.$Old_e" ); my $new = new Ddtc::Package::; my $old = new Ddtc::Package::; $new->name ($pkg->name ); $new->language ($pkg->language ); $new->message_id ($pkg->message_id ); $new->translator ($pkg->translator ); $new->description ($pkg->description); $new->translation ($pkg->translation); unless ($old->get_file("$Rev_dir/$package.$Old_e")) { $old = bless {}; $old = undef; } write_file("$Rev_dir/$package", $new->header .$new->description .$new->translation); my @desc; @desc = $old ? superdiff(uncomment($old->description, "#"), $pkg->description) : $pkg->old_description ? superdiff($pkg->old_description, $pkg->description) : superdiff("", $pkg->description) ; @desc = map { $_ = /^\ (.*)/? $1 :$_ } @desc; # remove head character unchanged line @desc = map { $_ = /^\-(.*)/?"# -$1":$_ } @desc; # comment removed line @desc = map { $_ = /^\+(.*)/? $1 :$_ } @desc; # remove head character added line $new->description (@desc); my @tran; if ($old) { my $c = substr($Comment, 1); # remove first character of `$Comment' for selection my @data = uncomment($old->translation, $Comment); @data = map { $_ = /^\+$c(--|\+\+)(.*)/?$2:$_ } @data ; # remove header from selected lines my $data = join ("\n", @data); @tran = superdiff($data, $pkg->translation); } elsif ($pkg->old_translation) { @tran = superdiff($pkg->old_translation, $pkg->translation); } else { @tran = superdiff("", $pkg->translation) ; } @tran = map { $_ = /^\ (.*)/? $1 :$_ } @tran; # remove head character unchanged line @tran = map { $_ = /^\-(.*)/?"$Comment--$1":$_ } @tran; # comment removed line @tran = map { $_ = /^\+(.*)/?"$Comment++$1":$_ } @tran; # comment added line @tran = map { $_ = /^$Comment\+\+(.*)/? $1 :$_ } @tran unless grep (!/^$Comment\+\+/, @tran); # uncomment if new review $new->translation (@tran); write_file("$Rev_dir/$package.$Todo_e", $new->header .$new->description .$new->translation); if ($old && not(grep (/^$Comment/, $new->translation)) ) { move_file("$Rev_dir/$package.$Todo_e", "$Rev_dir/$package.$Rev_e"); debug 1, __("ok: %s\n"), $package; } } # parse_bug # # Parse bug report # # input: # Ddtc object sub parse_bug ($) { my $pkg = shift; debug 3; debug 4, "package: ".$pkg->name."\n". "language: ".$pkg->language."\n". "message id: ".$pkg->message_id."\n"; unless ($pkg->description || $pkg->translation) { warning __("%s, skipped, malformed data:\n%s%s"), $pkg->name || __("no name"), $pkg->description ? "" : __("Missing description\n"), $pkg->translation ? "" : __("Missing translation\n"); return; } my $package = $pkg->name; if (-e "$Bug_dir/$package.$Fix_e") { warning __("collision detected, %s exists, try to rename it into %s\n%s skipped\n"), "$package.$Fix_e", "$package.$Bug_e", $package; return; } if (-e "$Tr_dir/$package.$Tr_e") { warning __("collision detected, %s exists, try to remove it and rename %s into %s.\n%s skipped\n"), "$package.$Tr_e", "$package.$Fix_e.$Old_e", "$package.$Bug_e", $package; return; } move_file("$Tr_dir/$package.$Ok_e", "$Tr_dir/$package.$Sent_e"); my $i; my $l; my $old_review; my @diff; my $new = new Ddtc::Package::; my $bug = new Ddtc::Package::; my $sent = new Ddtc::Package::; unless ( $bug->get_file("$Bug_dir/$package.$Bug_e" )) { $bug = bless {}; $bug = undef; } unless ($sent->get_file("$Tr_dir/$package.$Sent_e")) { $sent = bless {}; $sent = undef; } $new->name ($pkg->name); $new->message_id ($pkg->message_id); if ($bug) { $new->bugs (($bug->bugs, $pkg->bugs)); $new->reviewers (($bug->reviewers, $pkg->reviewers)); } else { $new->bugs ($pkg->bugs); $new->reviewers ($pkg->reviewers); } $l = chr(96 + $new->bugs); # Check if already parsed if ($bug) { my $m = $pkg->bug(0); if (grep(/$m/, $bug->bugs )) { debug 1, __("parsed already %s\n"), $package; return; } } elsif ($sent) { my $m = $pkg->bug(0); if (grep(/$m/, $sent->bugs )) { debug 1, __("parsed already %s\n"), $package; return; } } move_file ("$Bug_dir/$package.$Bug_e", "$Bug_dir/$package.$Bug_e.$Old_e"); # Choose original description $new->old_description (""); $new->old_description ( $pkg->old_description) if $pkg->old_description; $new->old_description ($sent->description) if $sent; $new->old_description ( $bug->description) if $bug; @diff = superdiff(uncomment($new->old_description, "#"), $pkg->description); @diff = map { $_ = /^\ (.*)/? $1 :$_ } @diff; # remove head character unchanged line @diff = map { $_ = /^\-(.*)/?"# -$1":$_ } @diff; # comment removed line @diff = map { $_ = /^\+(.*)/? $1 :$_ } @diff; # remove head character added line $new->description (@diff); # Re-format review for superdiff my @review = $pkg->translation; @review = map { $_ = /^## \-#(.*)/?"$Comment\--$1":$_ } @review; @review = map { $_ = /^## \##(.*)/?"$Comment$l#$1":$_ } @review; @review = map { $_ = /^## \+#(.*)/?"$Comment$l+$1":$_ } @review; for ($i = 0; $i<@review; $i++) { $_ = $review[$i]; if (/^$Comment--/) { my $j; for ($j = $i-1; $j>=0; $j--) { next if ($review[$j] =~ /^$Comment/); next if ($review[$j] eq ""); $review[$j] = ""; last; } } } @review = grep (/^.+$/, @review); $new->translation (map { $_ = /^$Comment.\+(.*)/?$1:$_ } grep (!/^$Comment--/, $new->translation (@review))); $new->old_translation (map { $_ = /^$Comment\--(.*)/?$1:$_ } grep (!/^$Comment$l(#|\+)/, $new->old_translation (@review))); # Choose original translation $new->old_translation ( $pkg->old_translation) if $pkg->old_translation; $new->old_translation ($sent->translation) if $sent; @diff = superdiff($new->old_translation, $new->translation); @diff = map { $_ = /^\ (.*)/? $1 :$_ } @diff; # remove head character unchanged line @diff = map { $_ = /^\-(.*)/?"$Comment\--$1":$_ } @diff; # comment removed line @diff = map { $_ = /^\+(.*)/?"$Comment$l+$1":$_ } @diff; # comment added line @diff = map { $_ = /^$Comment..($Comment.*)/?$1:$_ } @diff; # commented line $new->translation (@diff); if ($bug) { my @tr = $new->translation; my @bg = $bug->translation; foreach (@tr) { next unless m/$Comment--(.*)/; for (my $i = 0; $i < @bg; $i++) { next unless $bg[$i] eq $1; $bg[$i] = "$Comment--$bg[$i]"; } } foreach (@bg) { next unless m/$Comment--(.*)/; for (my $i = 0; $i < @tr; $i++) { next unless $tr[$i] eq $1; $tr[$i] = "$Comment--$tr[$i]"; } } @diff = ndiff(join("\n", @tr), join("\n", @bg)); s/^.// foreach (@diff); $new->translation (@diff); } write_file("$Bug_dir/$package.$Bug_e", $new->header .$new->description .$new->translation); } # parse_reviewed # # set fully reviewed description ok # # input: # Ddtc object sub parse_reviewed ($) { my $pkg = shift; debug 3; my $package = $pkg->name; debug 4, "package: $package\n"; move_file( "$Tr_dir/$package.$Sent_e", "$Tr_dir/$package.$Ok_e"); move_file("$Rev_dir/$package.$Lok_e", "$Rev_dir/$package.$Ok_e"); } # get_data # # split attached file into package descriptions # # input: # mail # mime part # output: # list of Ddtc objects sub get_data ($$) { my $mail = shift; my $part = shift; my $data; # data # +-> 1 # +-> 2 # +-> Ddtc # +-> ... # +-> n my $message_id; chomp ($message_id = $mail -> head -> get ('Message-Id')); debug 3; debug 4, "message id: ".$message_id."\n"; my @names; my @lines = $part -> bodyhandle -> as_lines; my @copy = @lines; s/\n// foreach (@lines); while (@lines) { $_ = shift (@lines); debug 5, $_."\n"; if (/^# package\(?s?\)?: ?(\S+)?/i) { push @names, $1 || ''; $data->[@names] = new Ddtc::Package::; $data->[@names]->name ($1 || ''); $data->[@names]->message_id ($message_id); debug 1, __("package: %s\n"), $1 || ''; next; } if (/^# reviewer: (.*)/i) { my $n = MIME::Words::decode_mimewords($1); $data->[@names]->add_reviewer ($n); debug 1, __("reviewer: %s\n"), $n; next; } if (/^# translator: (.*)/i) { my $n = MIME::Words::decode_mimewords($1); $data->[@names]->translator ($n); debug 1, __("translator: %s\n"), $n; next; } if (/^# bug number: (\d+)/i) { $data->[@names]->add_bug ($1); debug 1, __("bug number: %s\n"), $1; next; } if (/^Description: (.*)/) { my @void; push @void, "Description: $1"; while (@lines) { $_ = shift (@lines); last unless /^( .*)/; push @void, $1; } unshift @lines, $_ if @lines; $data->[@names]->description (@void); unless ($data->[@names]->name) { $data->[@names]->name (get_apt_name(($data->[@names]->description)[0])); } debug 5, "description:\n". $data->[@names]->description; next; } if (/^# old description:/i) { $_ = shift (@lines); /^# Description: (.*)/; my @void; push @void, "Description: $1"; while (@lines) { $_ = shift (@lines); last unless /^# ( .*)/; push @void, $1; } unshift @lines, $_ if @lines; $data->[@names]->old_description (@void); debug 5, "old description\n". $data->[@names]->old_description; next; } if (/^Description-(..(?:_..)?)(?:\.([\w-]+))?: (.*)/) { $data->[@names]->language ($1); my $ddts_charset = $2 || $DDTS_CHARSETS{$1}; my @void; push @void, "Description-$1: $3"; while (@lines) { $_ = shift (@lines); next if (/^#\s*$/); # remove empty comments next if (/^# ppart translation, please check it! It needs your help:/); # remove ppart comments last unless /^(##)?( .*)/; push @void, (defined $1 ? "$1$2" : "$2" ); } unshift @lines, $_ if @lines; unless ($Mail_charset =~ /^$ddts_charset$/) { my $converter = Text::Iconv -> new ($ddts_charset, $Mail_charset); my $converted = $converter->convert(join("\n", @void)); if ($converted) { debug 4, "Charset converted from $ddts_charset to $Mail_charset\n"; @void = split("\n", $converted); } else { warning __("Unable to convert charset from %s to %s\n"), $ddts_charset, $Mail_charset; } } $data->[@names]->translation (@void); debug 5, "translation\n". "langage: ".$data->[@names]->language."\n". $data->[@names]->translation; next; } if (/^# translated description from the db:/i || /^# old translation:/i) { $_ = shift (@lines); /^# Description-(..(?:_..)?)(?:\.([\w-]+))?: (.*)/; $data->[@names]->language ($1) unless $data->[@names]->language; my $ddts_charset = $2 || $DDTS_CHARSETS{$1}; my @void; push @void, "Description-$1: $3"; while (@lines) { $_ = shift (@lines); last unless /^# ( .*)/; push @void, $1; } unshift @lines, $_ if @lines; unless ($Mail_charset =~ /^$ddts_charset$/) { my $converter = Text::Iconv -> new ($ddts_charset, $Mail_charset); my $converted = $converter->convert(join("\n", @void)); if ($converted) { debug 4, "Charset converted from $ddts_charset to $Mail_charset\n"; @void = split("\n", $converted); } else { warning __("Unable to convert charset from %s to %s\n"), $ddts_charset, $Mail_charset; } } $data->[@names]->old_translation (@void); debug 5, "old translation\n". "langage: ".$data->[@names]->language."\n". $data->[@names]->old_translation; next; } # Try to parse old bugs: if (/^# diff old-new description:/i) { unless ($data->[@names]->bugs) { ($_) = grep (/^btsclose: \d+/i, @copy); next unless defined $_; $data->[@names]->add_bug($1) if /^btsclose: (\d+)/i; } } if (/^# diff old-new translation:/i) { unless ($data->[@names]->bugs) { ($_) = grep (/^btsclose: \d+/i, @copy); next unless defined $_; $data->[@names]->add_bug($1) if /^btsclose: (\d+)/i; } } next if (/^# /); # skip comment next if (/^#$/); # skip comment next if (/^$/); # skip empty line next if (/^from: /i); # skip ddts command next if (/^btsclose: /i); # skip ddts command suicide __("Unknown line:\n%s\n"), $_; } shift @{ $data }; debug 4, scalar(@{ $data })." package(s) found\n"; return $data; } # parse_nop # # Parse no operation sub parse_nop () { } # parse # # Parse a message # # input: # Mime stream on STDIN sub parse () { my $parser; # MIME parser my $mail; # mail to parse my $subject; # mail subject debug 3; test_directories; $parser = new MIME::Parser:: ; $mail = $parser -> read(\*STDIN) or suicide __("Cannot parse mime stream: %s\n"), $!; $subject = $mail -> head -> get ('subject'); unless ($mail -> is_multipart) { $mail -> purge; suicide __("This is NOT a multipart mime message. Please make sure you've provided the whole message to STDIN including the headers and encoded mime parts.\n"); } debug 1, $subject."\n"; my $file; foreach my $part ($mail -> parts) { debug 4, ($part -> head -> mime_type)."\n"; next unless $part -> head -> mime_type eq "application/debian-dt"; my $file = $part -> head -> recommended_filename; next if $file =~ /^close-bug/; # skip bug closed my $data = get_data ($mail, $part); if ($subject =~ /reviewed/i) { # new reviewed descriptions parse_reviewed ($_) foreach (@{ $data }); } elsif ($file =~ /newreview/i) { # new descriptions to review parse_review ($_) foreach (@{ $data }); } elsif ($file =~ /^new(\..*)?/i) { # new descriptions to translate parse_translation ($_) foreach (@{ $data }); } else { # bug report parse_bug ($_) foreach (@{ $data }); } } $mail -> purge; } # fix # # Fix bugs # sub fix () { my $file; debug 3; test_directories; foreach (ls_dir($Bug_dir, "\\.$Fix_e\$")) { s/\.$Fix_e//; my $file = $_; my $c = substr($Comment, 1); # remove first character of `$Comment' for selection debug 1, __("fixed: %s\n"), $file; my $fix = new Ddtc::Package::; unless ($fix->get_file("$Bug_dir/$file.$Fix_e" )) { $fix = bless {}; $fix = undef; next; } my @data = $fix->translation; @data = grep (!/^$Comment/, @data); # remove not selected lines @data = map { $_ = /^\+$c(--|[a-z]\+)(.*)/?$2:$_ } @data ; # remove header from selected lines $fix->translation (@data); move_file ("$Tr_dir/$file.$Tr_e", "$Tr_dir/$file.$Old_e"); move_file ("$Bug_dir/$file.$Fix_e", "$Bug_dir/$file.$Fix_e.$Old_e"); write_file("$Tr_dir/$file.$Tr_e", $fix->header .$fix->description .$fix->translation); } return 1; } # check_format # # check line length # # input: # english description # translation # output: # ok on success # tab if \t found # nb para if scructures differ # too long if line length > 80 # _.+ if something follows a dot sub check_format ($$) { my @description = split("\n", shift); my @translation = split("\n", shift); my $count = 0; debug 3; my $c = substr($Comment, 1); # remove first character of `$Comment' for selection if (grep(/^ \.$/, @description) ne grep(/^(\+$c[+-]{2})? \.$/, @translation)) { warning __("Number of paragraphs differs in description and translation\n"); debug 5, "nb para\n"; return "nb para"; } foreach (@translation) { $count++; next if /^# /; next if /^$Comment/; s/^\+$c[+-]{2}//; # remove header from selected lines if (/\t/) { my $l = $_; s/\t.*/^/; s/[^^]/ /g; warning __("Line %s, not allowed:\n%s\n%s\n"), $count, $l, $_; debug 5, "tab\n"; return "tab"; } elsif (/^ \../) { warning __("Line %s, dot starts non-empty line:\n%s\n ^\n"), $count, $_; debug 5, "_.+\n"; return "_.+"; } s/^Description-[^:]+: //; next unless length($_) > 80; warning __("Line %s too long:\n%s\n%s^\n"), $count, $_, " "x80; debug 5, "too long\n"; return "too long"; } debug 5, "ok\n"; return "ok"; } # make_translation # # make the translation to send # # input: # package name # output: # data to send sub make_translation ($) { my $file = shift; debug 3; debug 4, "filename: $file\n"; my $new = new Ddtc::Package::; unless ($new->get_file("$Tr_dir/$file.$Tr_e")) { $new = bless {}; $new = undef; next; } my @diff; push @diff, "btsclose: $_" foreach ($new->bugs); push @diff, uncomment($new->description, "# "); push @diff, uncomment($new->translation, "# |$Comment"); my $ddts_charset = $DDTS_CHARSETS {$new->language}; if ($ddts_charset ne $Mail_charset) { @diff = map ($_ = /^(Description-$Language)(:.*)/?"$1.$Mail_charset$2":$_, @diff); } debug 5, join("\n", @diff)."\n"; return (join("\n", @diff)."\n"); } # make_review # # make the review to send to prevent parts from being updated # # input: # package name # output: # data to send sub make_review ($) { my $file = shift; debug 3; debug 4, "filename: $file\n"; my $pkg = new Ddtc::Package::; unless ($pkg->get_file("$Rev_dir/$file")) { $pkg = bless {}; $pkg = undef; next; } my $rev = new Ddtc::Package::; unless ($rev->get_file("$Rev_dir/$file.$Rev_e")) { $rev = bless {}; $rev = undef; next; } my $original = uncomment($pkg->description .$pkg->translation , "# "); my $reviewed = uncomment($rev->description .$rev->translation , "# "); my @diff; my $c = substr($Comment, 1); # remove first character of `$Comment' for selection my @data = split("\n", $reviewed); @data = grep ( !/^$Comment(--|\+\+)/, @data); # remove not selected lines @data = map { $_ = /^\+$c(--|\+\+)(.*)/?$2:$_ } @data ; # remove header from selected lines $reviewed = join ("\n", @data); if ($Ddtc_bug) { @diff = superdiff($original, $reviewed); @diff = map ($_ = /^\ (.*)/ ?"$1" :$_, @diff); @diff = map ($_ = /^\-(.*)/ ?"$1\n## -#$1":$_, @diff); @diff = map ($_ = /^\+$Comment(.*)/? "## ##$1":$_, @diff); @diff = map ($_ = /^\+(.*)/ ? "## +#$1":$_, @diff); @diff = split("\n", join("\n", @diff)); # split original/removed lines } else { @diff = @data; } my $ddts_charset = $DDTS_CHARSETS {$pkg->language}; if ($ddts_charset ne $Mail_charset) { @diff = map ($_ = /^(Description-$Language)(:.*)/?"$1.$Mail_charset$2":$_, @diff); } debug 5, join("\n", @diff)."\n"; return (join("\n", @diff)."\n"); } # mail # # Send mails # sub mail () { my $BCount = 0; my $nb_sent = 0; debug 3; test_mail; test_directories; my $mail = build MIME::Entity:: Type => "multipart/mixed", From => $Mail_out, To => (get_debug == 9 ? $Mail_out : $Mail_server), Cc => ($Mail_self ? $Mail_out : undef ), 'Reply-To:' => $Mail_in, 'User-Agent:' => "ddtc ".VERSION; my @tr_files; foreach (ls_dir($Tr_dir, "\\.$Tr_e\$")) { s/\.$Tr_e$//; # remove extension my $file = $_; # get package name my $pkg = new Ddtc::Package::; unless ($pkg->get_file("$Tr_dir/$file.$Tr_e")) { $pkg = bless {}; $pkg = undef; next; } my $ddts_charset = $DDTS_CHARSETS {$pkg->language}; $mail -> head -> replace (Subject => "nothing ".$pkg->language. ($Mail_charset =~ /^$ddts_charset$/i ?"":".$Mail_charset")." noguide") unless $mail -> head -> get ('Subject'); unless ("ok" eq check_format($pkg->description, $pkg->translation)) { warning __("translation skipped: %s\n"), $file; next; } attach $mail Data => make_translation($file), Charset => $Mail_charset, Encoding => $Mail_enc, Filename => $file; debug 1, __("translation: %s\n"), $file; push @tr_files, $file; } my @sent_files; my @lok_files; foreach (ls_dir($Rev_dir, "\\.$Rev_e\$")) { s/\.$Rev_e$//; my $file = $_; next unless (-e "$Rev_dir/$file"); next if (-e "$Rev_dir/$file.$Sent_e"); my $pkg = new Ddtc::Package::; unless ($pkg->get_file("$Rev_dir/$file")) { $pkg = bless {}; $pkg = undef; next; } my $rev = new Ddtc::Package::; unless ($rev->get_file("$Rev_dir/$file.$Rev_e")) { $rev = bless {}; $rev = undef; next; } my $ddts_charset = $DDTS_CHARSETS {$pkg->language}; $mail -> head -> replace (Subject => "nothing ".$pkg->language. ($Mail_charset =~ /^$ddts_charset$/i ?"":".$Mail_charset")." noguide") unless $mail -> head -> get ('Subject'); unless ("ok" eq check_format($rev->description, $rev->translation)) { warning __("review skipped: %s\n"), $file; next; } attach $mail Data => make_review($file), Charset => $Mail_charset, Encoding => $Mail_enc, Filename => $file; my $c = substr($Comment, 1); # remove first character of `$Comment' for selection my @rev = $rev->translation; @rev = grep ( !/^$Comment(--|\+\+)/, @rev); # remove not selected lines @rev = map { $_ = /^\+$c(--|\+\+)(.*)/?$2:$_ } @rev ; # remove header from selected lines if ($pkg->translation eq join("\n", @rev)."\n") { debug 1, __("review (ok): %s\n"), $file; push @lok_files, $file; } else { debug 1, __("review (bug): %s\n"), $file; push @sent_files, $file; } } if (@tr_files + @lok_files + @sent_files) { unless ($mail -> send) { suicide __("Cannot send email"); }; foreach (@tr_files) { move_file ("$Tr_dir/$_.$Tr_e", "$Tr_dir/$_.$Sent_e"); } foreach (@lok_files) { remove_file ("$Rev_dir/$_.$Rev_e"); move_file ("$Rev_dir/$_", "$Rev_dir/$_.$Lok_e"); } foreach (@sent_files) { move_file ("$Rev_dir/$_.$Rev_e", "$Rev_dir/$_.$Sent_e"); } debug 1, __("sent: #%s\n"), @tr_files + @lok_files + @sent_files; } else { debug 1, __("nothing to send\n"); } $mail -> purge; return 1; } # clean # # Clean obsolete files # sub clean () { debug 3; test_directories; inc_debug if get_debug == 1; # increase verbose level if 1 debug 2, __("Removing files...\n"); foreach (ls_dir($Tr_dir)) { next if /^\./; remove_file("$Tr_dir/$_") if /$Clean_re/; s/\.[^.]*$//; # remove extension if (-e "$Tr_dir/$_.$Todo_e") { remove_file("$Tr_dir/$_.$Todo_e") if (-e "$Tr_dir/$_.$Tr_e"); remove_file("$Tr_dir/$_.$Todo_e") if (-e "$Tr_dir/$_.$Sent_e"); } } foreach (ls_dir($Bug_dir)) { next if /^\./; remove_file("$Bug_dir/$_") if /$Clean_re/; remove_file("$Bug_dir/$_.$Bug_e") if (-e "$Bug_dir/$_.$Fix_e"); } foreach (ls_dir($Rev_dir)) { next if /^\./; remove_file("$Rev_dir/$_") if /$Clean_re/; s/\.[^.]*$//; # remove extension if (-e "$Rev_dir/$_.$Ok_e") { remove_file("$Rev_dir/$_"); remove_file("$Rev_dir/$_.$Todo_e"); remove_file("$Rev_dir/$_.$Rev_e"); remove_file("$Rev_dir/$_.$Sent_e"); remove_file("$Rev_dir/$_.$Lok_e"); } elsif (-e "$Rev_dir/$_.$Lok_e") { remove_file("$Rev_dir/$_"); remove_file("$Rev_dir/$_.$Todo_e"); remove_file("$Rev_dir/$_.$Rev_e"); remove_file("$Rev_dir/$_.$Sent_e"); } elsif (-e "$Rev_dir/$_.$Sent_e") { remove_file("$Rev_dir/$_.$Todo_e"); remove_file("$Rev_dir/$_.$Rev_e"); } elsif ((-e "$Rev_dir/$_.$Rev_e") && (-e "$Rev_dir/$_.$Todo_e")) { remove_file("$Rev_dir/$_.$Todo_e"); } if (!(-e "$Rev_dir/$_")) { remove_file("$Rev_dir/$_.$Todo_e"); remove_file("$Rev_dir/$_.$Sent_e"); } } dec_debug if get_debug == 2; # decrease verbose level back to 1 return 1; } # stats # # Print statistics # sub stats () { my $totr_c = 0; my $tr_c = 0; my $senttr_c = 0; my $oktr_c = 0; my $bug_c = 0; my $fix_c = 0; my $torev_c = 0; my $rev_c = 0; my $sentrev_c = 0; my $lokrev_c = 0; my $okrev_c = 0; debug 3; test_directories; foreach (ls_dir($Tr_dir)) { next if /^\./; $totr_c++ if /\.$Todo_e$/; $tr_c++ if /\.$Tr_e$/; $senttr_c++ if /\.$Sent_e$/; $oktr_c++ if /\.$Ok_e$/; } foreach (ls_dir($Bug_dir)) { next if /^\./; $bug_c++ if /\.$Bug_e$/; $fix_c++ if /\.$Fix_e$/; } foreach (ls_dir($Rev_dir)) { next if /^\./; $torev_c++ if /\.$Todo_e$/; $rev_c++ if /\.$Rev_e$/; $sentrev_c++ if /\.$Sent_e$/; $lokrev_c++ if /\.$Lok_e$/; $okrev_c++ if /\.$Ok_e$/; } my $sumtr = $tr_c + $senttr_c + $oktr_c; my $sumbug = $bug_c + $fix_c; my $sumrev = $rev_c + $sentrev_c + $lokrev_c + $okrev_c; my $l = 0; $l = $_>$l?$_:$l foreach ($sumtr, $sumbug, $sumrev); # get max $l = length $l; # get length for separators if ($sumtr + $totr_c) { debug 0, __("===== translations\n to do: %s\n to send: %s\n sent: %s\n accepted: %s\n %s\ntranslated: %s\n"), sprintf("%${l}d", $totr_c), sprintf("%${l}d", $tr_c), sprintf("%${l}d", $senttr_c), sprintf("%${l}d", $oktr_c), __("-")x$l, sprintf("%${l}d", $sumtr); } if ($sumbug) { debug 0, __("===== bug reports\n reports: %s\n fixed: %s\n %s\n opened: %s\n"), sprintf("%${l}d", $bug_c), sprintf("%${l}d", $fix_c), __("-")x$l, sprintf("%${l}d", $sumbug); } if ($sumrev + $torev_c) { debug 0, "\n" if $sumbug || ($sumtr + $totr_c); debug 0, __("===== reviews\n to do: %s\n to send: %s\n bugged: %s\n agreed: %s\n accepted: %s\n %s\n reviewed: %s\n"), sprintf("%${l}d", $torev_c), sprintf("%${l}d", $rev_c), sprintf("%${l}d", $sentrev_c), sprintf("%${l}d", $lokrev_c), sprintf("%${l}d", $okrev_c), __("-")x$l, sprintf("%${l}d", $sumrev); } return 1; } # ddts_command # # Send a command to the ddts # # input: # array of commands sub ddts_command (@) { debug 3; debug 4, "command: ".join(" ", @_)."\n"; test_mail; my $command = ""; $_ = " ".join(" ", @_)." "; # # check command syntax: # if (m/ (?i:section) /) { m/ (?i:section) (\w+) /; debug 4, "section ".($1 || "")."\n"; if ($1) { $command .= "section $1 "; } else { warning __("section\nmissing section name, set to none\n"); } } if (m/ (?i:sget) /) { m/ (?i:sget) ([\w+.-]+) /; debug 4, "sget ".($1 || "")."\n"; if ($1) { test_language; $command .= "sget $1 $Language".get_charset." "; } else { warning __("sget\nmissing package name, command skipped\n"); } } elsif (m/ (?i:get) /) { m/ (?i:get) ((?:\d+)|(?:[\w+.-]+)) /; debug 4, "get ".($1 || "")."\n"; if ($1) { test_language; $command .= "get $1 $Language".get_charset." "; } else { warning __("get\nmissing number or package name, command skipped\n"); } } elsif (m/ (?i:review) /) { m/ (?i:review) ((?:\d+)|(?:[\w+.-]+)) /; debug 4, "review ".($1 || "")."\n"; if ($1) { test_language; $command .= "review $1 $Language".get_charset." "; } else { warning __("review\nmissing number or package name, command skipped\n"); } } elsif (m/ (?i:getbug) /) { m/ (?i:getbug) ([ \d]+) /; debug 4, "getbug ".($1 || "")."\n"; if ($1) { $command .="getbug $1 "; } else { warning __("getbug\nmissing bug number, command skipped\n"); } } elsif (m/ (?i:btsclose) /) { m/ (?i:btsclose) ([ \d]+) /; debug 4,"btsclose ".($1 || "")."\n"; if ($1) { $command .= "btsclose $1 "; } else { warning __("btsclose\nmissing bug number, command skipped\n"); } } elsif (m/ (?i:notification) /) { m/ (?i:notification) ([\w+:-]+) /; debug 4, "notification ".($1 || "")."\n"; if ($1) { $command .= "notification $Mail_in $1 "; } else { warning __("notification\nmissing language, command skipped\n"); } } if (m/ (?i:listtranslatedpackages) /) { debug 4, "ListTranslatedPackages\n"; test_language; $command .= "listtranslatedpackages $Language "; } if (m/ (?i:status) /) { debug 4, "status\n"; test_language; $command .= "status $Language "; } if (m/ (?i:noneveraguide) /) { debug 4, "NoNeverAGuide\n"; $command .= "noneveraguide "; } elsif (m/ (?i:neveraguide) /) { debug 4, "NeverAGuide\n"; $command .= "neveraguide "; } if (m/ (?i:noguide) /) { debug 4, "NoGuide\n"; $command .= "noguide "; } elsif (m/ (?i:guide) /) { debug 4, "found Guide\n"; $command .= "guide "; } else { $command .= "noguide "; } return if $command eq "noguide "; my $mail = build MIME::Entity:: From => $Mail_out, To => (get_debug == 9 ? $Mail_out : $Mail_server), Cc => ($Mail_self ? $Mail_out : undef), Subject => $command, 'Reply-To:' => $Mail_in, 'User-Agent:' => "ddtc ".VERSION, Data => ""; unless ($mail -> send) { suicide __("Cannot send email"); }; debug 1, __("command sent to the server: %s\n"), $command; $mail -> purge; return 1; } # inter_config # # interactive configuration # sub inter_config() { debug 3; sub var_edit($$$) { my $menu = shift; my $format = shift; my $conf = shift; my $item = @{ $menu }; my $function = sub { $$conf = $Term -> readline("", $$conf); chomp $$conf; $menu -> text($item, sprintf($format, $$conf)); return 1; }; $menu -> add(sprintf($format, $$conf), $function); } sub var_yn($$$$) { my $menu = shift; my $format = shift; my $conf = shift; my $title = shift; my $item = @{ $menu }; my $function = sub { my @subs = (sub { 1 }, sub { 0 }); my @text = split (/\n/, sprintf(__("%s\n_yes\n_no"), $title)); my $submenu = new Ddtc::Menu:: (shift @text, @Menu_colors); $submenu -> add(shift @text, shift @subs) while @text; $$conf = $submenu -> execute($Term); $menu -> text($item, sprintf($format, $$conf?__("yes"):__("no"))); return 1; }; $menu -> add(sprintf($format, $$conf?__("yes"):__("no")), $function); } my %c = %conf; my @subs = (sub { "general" }, sub { "mail" }, sub { "color" }, sub { "save" }, sub { 0 }); my @text = split(/\n/, __("Configuration\n_general\n_mail\n_colors\n_save and exit\n_X_exit and discard changes")); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); $menu -> add(shift @text, shift @subs) while @text; while (my $res = $menu -> execute($Term)) { if ($res eq "general") { my @refs = \($c{'base_dir'}, $c{'comment'}, $c{'clean_regex'}, $c{'language'}, $c{'editor'}, $c{'ddtc_bug'}); my @text = split(/\n/, __("General configuration\n_base directory %s\nc_omment %s\n_clean regex %s\n_language %s\n_editor %s\nddtc _bug %s\n_quit")); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); var_edit($menu, shift @text, shift @refs) while @text > 2; var_yn ($menu, shift @text, shift @refs, __("Send bugs in special format")); $menu -> add(shift @text, sub { 0 }); while ($menu -> execute($Term)) { }; } elsif ($res eq "mail" ) { my @refs = \($c{'mail_out'}, $c{'mail_in'}, $c{'mail_server'}, $c{'mail_encoding'}, $c{'mail_charset'}, $c{'mail_self'}); my @text = split(/\n/, __("Mail configuration\n_outgoing %s\n_incoming %s\n_server %s\n_encoding %s\n_charset %s\nse_lf %s\n_quit")); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); var_edit($menu, shift @text, shift @refs) while @text > 2; var_yn ($menu, shift @text, shift @refs, __("Send mails to oneself")); $menu -> add(shift @text, sub { 0 }); while ($menu -> execute($Term)) { }; } elsif ($res eq "color") { my @refs = \($c{'menu_title_color'}, $c{'menu_letter_color'}, $c{'menu_text_color'}); my @text = split(/\n/, __("Color configuration\nt_itle %s\n_letter %s\n_text %s\n_quit")); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); var_edit($menu, shift @text, shift @refs) while @text > 1; $menu -> add(shift @text, sub { 0 }); while ($menu -> execute($Term)) { }; } elsif ($res eq "save") { my $old_base_dir = $Base_dir; load_conf %c; if (($old_base_dir ne $Base_dir) && (-e $Base_dir)) { warning __("`%s' already exists, keeping `%s' as base directory.\n"), $Base_dir, $old_base_dir; $c{'base_dir'} = $conf{'base_dir'}; load_conf %c; } elsif (($old_base_dir ne $Base_dir) && not(-e $old_base_dir)) { } elsif ($old_base_dir ne $Base_dir) { move($old_base_dir, $Base_dir) or suicide __("Cannot move `%s' to `%s': %s\n"), $old_base_dir, $Base_dir, $!; } # remove defaults $c{'base_dir'} =~ s/$ENV{HOME}\/// if $c{'base_dir'}; delete $c{'base_dir'} if $Base_dir eq "$ENV{HOME}/ddts"; delete $c{'comment'} if $Comment eq ">>"; delete $c{'clean_regex'} if $Clean_re eq "~\$|\\.old\$|\\.bak\$"; delete $c{'editor'} if $Editor eq "sensible-editor"; delete $c{'ddtc_bug'} unless $Ddtc_bug; delete $c{'language'} unless $c{'language'}; delete $c{'debug'} if $c{'debug'} == 1; delete $c{'mail_out'} if $Mail_out eq ($ENV{EMAIL} || $ENV{DEBEMAIL} || ''); delete $c{'mail_in'} if $Mail_in eq $Mail_out; delete $c{'mail_server'} if $Mail_server eq "pdesc\@ddtp.debian.org"; delete $c{'mail_self'} if $Mail_self; delete $c{'mail_encoding'} if $Mail_enc eq "8bit"; delete $c{'mail_charset'} if $Mail_charset eq "iso-8859-1"; delete $c{'menu_title_color'} if $Menu_title_color eq "bold cyan"; delete $c{'menu_letter_color'} if $Menu_letter_color eq "bold cyan"; delete $c{'menu_text_color'} if $Menu_text_color eq "cyan"; foreach (keys %c) { next if $_ eq 'base_dir'; next if $_ eq 'comment'; next if $_ eq 'clean_regex'; next if $_ eq 'editor'; next if $_ eq 'ddtc_bug'; next if $_ eq 'language'; next if $_ eq 'debug'; next if $_ eq 'mail_out'; next if $_ eq 'mail_in'; next if $_ eq 'mail_server'; next if $_ eq 'mail_self'; next if $_ eq 'mail_encoding'; next if $_ eq 'mail_charset'; next if $_ eq 'menu_title_color'; next if $_ eq 'menu_letter_color'; next if $_ eq 'menu_text_color'; delete $c{$_}; } # save new config file my $config = new Config::General ((-ConfigHash => \%c)); $config -> save_file(catfile($ENV{HOME}, CONFFILE)); $c{'base_dir'} ||= 'ddts'; $c{'comment'} ||= '>>'; $c{'clean_regex'} ||= '~$|\.old$|\.bak$'; $c{'editor'} ||= 'sensible-editor'; $c{'ddtc_bug'} ||= 0; $c{'language'} ||= ''; $c{'debug'} ||= 1; $c{'mail_out'} ||= $ENV{EMAIL} || $ENV{DEBEMAIL} || ''; $c{'mail_in'} ||= ''; $c{'mail_server'} ||= 'pdesc@ddtp.debian.org'; $c{'mail_encoding'} ||= '8bit'; $c{'mail_charset'} ||= 'iso-8859-1'; $c{'mail_self'} ||= 1; $c{'menu_title_color'} ||= 'bold cyan'; $c{'menu_letter_color'} ||= 'bold cyan'; $c{'menu_text_color'} ||= 'cyan'; %conf = %c; last; } } return 1; } # choose_file # # choose file # # input: # reference of file list sub choose_file(\@) { my $files = shift; debug 3; my $n = 0; foreach (@$files) { debug 0, (color($Menu_letter_color).$n.color('clear').color($Menu_text_color)." ".$$files[$n].color('clear')."\n"); $n++; } $n--; my $l; until ((defined $l) && ($l eq "")) { $l = $Term -> readline("0-$n\: "); chomp $l; return $$files[$l] if ($l =~ /^\d+$/) && (0<=$l) && ($l<=$n); } return undef; } # inter_trans # # edit translation # sub inter_trans () { debug 3; test_directories; my @subs = (sub { "first" }, sub { "choose" }, sub { "random" }, sub { "last" }, sub { 0 }); my @text = split (/\n/, __("Edit translation\n_first file\n_choose\nat _random\n_last file\n_quit")); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); $menu -> add(shift @text, shift @subs) while @text; my @files = ls_dir($Tr_dir, "\\.$Todo_e\$"); s/\.$Todo_e$// foreach (@files); unless (@files) { debug 0, __("no file to edit"); return 1; } while (my $res = $menu -> execute($Term)) { my $file; if ($res eq "first") { $file = $files[0]; } elsif ($res eq "choose") { $file = choose_file @files; } elsif ($res eq "random") { $file = $files[(scalar(@files)*rand()) % scalar(@files)]; } elsif ($res eq "last") { $file = $files[-1]; } else { next; } my @subs = (sub { "edit" }, sub { "acheck" }, sub { "send" }, sub { 0 }); my @text = split (/\n/, sprintf(__("Edit %s\n_edit\nrun _acheck\nset for _send\n_quit"), $file)); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); $menu -> add(shift @text, shift @subs) while @text; while (my $res = $menu -> execute($Term)) { if ($res eq "edit") { system ($Editor, "$Tr_dir/$file.$Todo_e"); } elsif ($res eq "acheck") { system ("acheck", "-t", "$Tr_dir/$file.$Todo_e"); } elsif ($res eq "send") { move_file ("$Tr_dir/$file.$Todo_e", "$Tr_dir/$file.$Tr_e"); @files = ls_dir($Tr_dir, "\\.$Todo_e\$"); s/\.$Todo_e$// foreach (@files); last if @files; debug 0, __("no more file to edit"); return 1; } } } return 1; } # inter_review # # edit review # sub inter_review () { debug 3; test_directories; my @subs = (sub { "first" }, sub { "choose" }, sub { "random" }, sub { "last" }, sub { 0 }); my @text = split (/\n/, __("Edit review\n_first file\n_choose\nat _random\n_last file\n_quit")); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); $menu -> add(shift @text, shift @subs) while @text; my @files = ls_dir($Rev_dir, "\\.$Todo_e\$"); s/\.$Todo_e$// foreach (@files); unless (@files) { debug 0, __("no file to edit"); return 1; } while (my $res = $menu -> execute($Term)) { my $file; if ($res eq "first") { $file = $files[0]; } elsif ($res eq "choose") { $file = choose_file @files; } elsif ($res eq "random") { $file = $files[(scalar(@files)*rand()) % scalar(@files)]; } elsif ($res eq "last") { $file = $files[-1]; } else { next; } my @subs = (sub { "edit" }, sub { "acheck" }, sub { "send" }, sub { 0 }); my @text = split (/\n/, sprintf(__("Edit %s\n_edit\nrun _acheck\nset for _send\n_quit"), $file)); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); $menu -> add(shift @text, shift @subs) while @text; while (my $res = $menu -> execute($Term)) { if ($res eq "edit") { system ($Editor, "$Rev_dir/$file.$Todo_e"); } elsif ($res eq "acheck") { system ("acheck", "-r", "$Rev_dir/$file.$Todo_e"); } elsif ($res eq "send") { move_file ("$Rev_dir/$file.$Todo_e", "$Rev_dir/$file.$Rev_e"); @files = ls_dir($Rev_dir, "\\.$Todo_e\$"); s/\.$Todo_e$// foreach (@files); last if @files; debug 0, __("no more file to edit"); return 1; } } } return 1; } # inter_bug # # edit bug report # sub inter_bug () { debug 3; test_directories; my @subs = (sub { "first" }, sub { "choose" }, sub { "random" }, sub { "last" }, sub { 0 }); my @text = split (/\n/, __("Edit bug report\n_first file\n_choose\nat _random\n_last file\n_quit")); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); $menu -> add(shift @text, shift @subs) while @text; my @files = ls_dir($Bug_dir, "\\.$Bug_e\$"); s/\.$Bug_e$// foreach (@files); unless (@files) { debug 0, __("no file to edit"); return 1; } while (my $res = $menu -> execute($Term)) { my $file; if ($res eq "first") { $file = $files[0]; } elsif ($res eq "choose") { $file = choose_file @files; } elsif ($res eq "random") { $file = $files[(scalar(@files)*rand()) % scalar(@files)]; } elsif ($res eq "last") { $file = $files[-1]; } else { next; } my @subs = (sub { "edit" }, sub { "acheck" }, sub { "fix" }, sub { 0 }); my @text = split (/\n/, sprintf(__("Edit %s\n_edit\nrun _acheck\nset as _fixed\n_quit"), $file)); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); $menu -> add(shift @text, shift @subs) while @text; while (my $res = $menu -> execute($Term)) { if ($res eq "edit") { system ($Editor, "$Bug_dir/$file.$Bug_e"); } elsif ($res eq "acheck") { system ("acheck", "-t", "$Bug_dir/$file.$Bug_e"); } elsif ($res eq "fix") { move_file ("$Bug_dir/$file.$Bug_e", "$Bug_dir/$file.$Fix_e"); @files = ls_dir($Bug_dir, "\\.$Bug_e\$"); s/\.$Bug_e$// foreach (@files); last if @files; debug 0, __("no more file to edit"); return 1; } } } return 1; } # inter_command # # send a server command in interactive mode # sub inter_command () { debug 3; my $section = ""; my $package = ""; my $bug_nb = ""; my @subs = (sub { "sget" }, sub { "get" }, sub { "review" }, sub { "section" }, sub { "getbug" }, sub { "btsclose" }, sub { ddts_command ("listtranslatedpackages") }, sub { ddts_command ("status") }, sub { 0 }); my @text = split (/\n/, __("Server command\nget descriptions of a _source package\n_get descriptions\nget _reviews\nset s_ection\nget a _bug report\n_close a bugreport\n_list translated packages\nget translation s_tatus\n_quit")); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); $menu -> add(shift @text, shift @subs) while @text; while (my $res = $menu -> execute($Term)) { if ($res eq "sget") { $package = $Term -> readline (__("source package name: ")); ddts_command (($section ? "section $section" : ""), "sget", $package); } elsif ($res eq "get") { $package = $Term -> readline (__("package name or number: ")); ddts_command (($section ? "section $section" : ""), "get", $package); } elsif ($res eq "review") { $package = $Term -> readline (__("package name or number: ")); ddts_command (($section ? "section $section" : ""), "review", $package); } elsif ($res eq "section") { $section = $Term -> readline (__("section name: ")); } elsif ($res eq "getbug") { $bug_nb = $Term -> readline (__("bug number: ")); ddts_command ("getbug", $bug_nb); } elsif ($res eq "btsclose") { $bug_nb = $Term -> readline (__("bug number: ")); ddts_command ("btsclose", $bug_nb); } } return 1; } # interactive # # run interactive mode # sub interactive () { debug 3; my @subs = (\&mail, \&fix, \&clean, \&stats, \&inter_command, \&inter_config, \&inter_trans, \&inter_review, \&inter_bug, sub { 0 }); my @text = split(/\n/, __("Main menu\n_Mail descriptions to the server\n_Fix bugged descriptions\n_Clean obsolete files\nprint _Statistics\nsend _server command\nc_onfigure\nedit _translation\nedit _review\nedit _bug report\n_quit")); my $menu = new Ddtc::Menu:: (shift @text, @Menu_colors); $menu -> add(shift @text, shift @subs) while @text; while ($menu -> execute($Term)) { }; } # print_version # # Print script version and exit # sub print_version () { debug 3; debug 0, __("%s version %s\n"), $Me, VERSION; exit; } # print_help # # Print help message and exit # sub print_help () { debug 3; debug 0, __("Usage: %s [OPTIONS] COMMAND [ARGUMENTS]\n\ncommands:\n parse extract the package descriptions from a ddts mail\n mail send descriptions back to the ddts\n fix create a fixed description from bugs\n clean remove obsolete files\n stats print statistics\n and server commands\n\noptions:\n -q, --quiet quiet mode\n -v verbose, add more for more verbosity\n --verbose n set verbosity to n\n -s, --mail-self send mail copy to oneself\n -n, --nomail-self don't send mail copy to oneself\n -l, --lang xx_XX use xx_XX language extension\n -V, --version print version and exit\n -h, --help print this message and exit\n\n%s version %s\n"), $Me, $Me, VERSION; exit; } # # Parse command line # { debug 3; my %commands = ( # command references 'parse' => \&parse, 'mail' => \&mail, 'fix' => \&fix, 'ask_trans' => \&ask_tr, 'ask_review' => \&ask_rev, 'clean' => \&clean, 'stats' => \&stats, 'interactive' => \&interactive, ); my @ddts_commands = ( # known server commands "section", "sget", "get", "review", "getbug", "btsclose", "notification ", "listtranslatedpackages", "status", "noneveraguide", "neveraguide", "noguide", "guide" ); Getopt::Long::Configure qw(permute bundling); # set standard gnu options (for potato perl) Getopt::Long::GetOptions ( 'verbose=i' => sub { set_debug $_[1] }, # verbose 'v+' => sub { inc_debug }, # incremental 'quiet|q' => sub { set_debug 0 }, # quiet 'version|V' => sub { print_version; exit 0 }, # version 'help|h' => sub { print_help; exit 0 }, # help 'mail-self!' => \$Mail_self, # mail-self negatable 's' => sub { $Mail_self = 1 }, # short 'n' => sub { $Mail_self = 0 }, # short no 'ddtc-bug!' => \$Ddtc_bug, # ddtc-bug negatable 'lang|l=s' => \$Language, # language ) or $ARGV[0] = ''; # set charset if not defined $Mail_charset = $Mail_charset ? $Mail_charset : $Language ? $DDTS_CHARSETS{$Language} : "ISO-8859-1" ; debug 4, "Configuration dump:\n". "base_dir $Base_dir\n". "comment $Comment\n". "ddtc_bug ".($Ddtc_bug ?"yes":"no")."\n". "debug ".get_debug."\n". "clean_re $Clean_re\n". "mail_addr $Mail_out\n". "mail_from $Mail_in\n". "mail_server ".$Mail_server."\n". "mail_self ".($Mail_self ?"yes":"no")."\n". "mail_enc $Mail_enc\n". "mail_charset $Mail_charset\n". "version ".VERSION."\n". "command ".join(" ", @ARGV)."\n"; my $command = shift @ARGV || ''; # get command $command ||= "parse" unless -t; if ((-t) && (-t STDOUT)) { $command ||= "interactive" if (-t) && (-t STDOUT); $Term = new Term::ReadLine ($Me); } if (defined $commands{$command}) { &{$commands{$command}}; # execute known command } elsif (grep (/^$command$/i, @ddts_commands)) { ddts_command $command, @ARGV; # send command to the server } elsif ($command) { debug 0, __("Unknown command `%s'\n"), $command;# unknown command print_help; } else { print_help; } } ddtc-0.17.2/Package.pm0000644000000000000000000001732107746315426011320 0ustar package Ddtc::Package; use strict; use Exporter; use IO::File; use MIME::Words; use Ddtc::Common; use vars qw(@ISA); @ISA = qw(Exporter); # Ddtc::Package data structure: # +-> name # +-> language # +-> message id # +-> translator # +-> reviewers # +-> reviewer 1 # +-> reviewer 2 # +-> ... # +-> bugs # +-> bug number 1 # +-> bug number 2 # +-> ... # +-> description # +-> short description # +-> line 1 # +-> line 2 # +-> ... # +-> translation # +-> short translation # +-> line 1 # +-> line 2 # +-> ... # +-> old description # +-> short description # +-> line 1 # +-> line 2 # +-> ... # +-> old translation # +-> short translation # +-> line 1 # +-> line 2 # +-> ... # new # # create new empty data structure # # output: # Ddtc object sub new ($) { shift; # class my $self = bless {}; return $self; } # get_file # # create data structure from a file # # input: # filename # output: # Ddtc object sub get_file ($$) { my $self = shift; # Ddtc object my $file = shift; # filename my @lines; debug 3; debug 4, "filename: $file\n"; return undef unless -e $file; # return error if file doesn't exist my $handle; # file handle $handle = new IO::File($file, '<') or suicide __("Cannot read `%s': %s\n"), $file, $!; @lines = $handle -> getlines; $handle -> close; chomp @lines; while (@lines) { $_ = shift @lines; debug 5, $_."\n"; if (/^# package:\s*(.*)/i) { $self->name ($1); debug 4, "package: $1\n"; next; } elsif (/^# ddts id:\s*(.*)/i) { $self->message_id ($1); debug 4, "message-id: $1\n"; next; } elsif (/^# translator:\s*(.*)/i) { my $n = MIME::Words::decode_mimewords($1); $self->translator ($n); debug 4, "translator: $n\n"; next; } elsif (/^# reviewer:\s*(.*)/i) { my $n = MIME::Words::decode_mimewords($1); $self->add_reviewer ($n); debug 4, "reviewer: $n\n"; next; } elsif (/^# bug number:\s*(\d+)/i || /^# bug nb:\s*(\d+)/i ) { $self->add_bug ($1); debug 4, "bug number: $1\n"; next; } elsif (/^(# -)?Description: (.*)/) { my @void; push @void, $_; while (@lines) { $_ = shift (@lines); last unless /^#? ./; push @void, $_; } unshift @lines, $_; $self->description (@void); debug 5, "description\n". $self->description; next; } elsif (/^(\S*?)Description-(..(_..)?): (.*)/) { $self->language ($2); my @void; push @void, $_; while (@lines) { $_ = shift (@lines); push @void, $_; } $self->translation (@void); debug 5, "translation\n". "language: ".$self->language."\n". $self->translation; next; } suicide __("%s: unknown line:\n%s\nThis is a BUG, please report it to the maintainer.\n"), $file, $_; } unless (exists $self->{'description'}) { suicide __("%s: malformed description file:\nno description found!\n"), $file; } unless (exists $self->{'language'} && exists $self->{'translation'} ) { suicide __("%s: malformed description file:\nno translation and/or no language found!\n"), $file; } return $self; } # name # # get / set package name # # input: # Ddtc object # package name [ set ] # output # package name sub name { my $self = shift; $self->{'name'} = shift if @_; # set if value provided return undef unless defined $self->{'name'}; $self->{'name'}; } # message_id # # get / set message id # # input: # Ddtc object # message id [ set ] # output # message id sub message_id { my $self = shift; $self->{'message id'} = shift if @_; # set if value provided return undef unless defined $self->{'message id'}; $self->{'message id'}; } # language # # get / set language # # input: # Ddtc object # language [ set ] # output # language sub language { my $self = shift; $self->{'language'} = shift if @_; # set if value provided return undef unless defined $self->{'language'}; $self->{'language'}; } # translator # # get / set translator address # # input: # Ddtc object # transaltor address [ set ] # output # transaltor address sub translator { my $self = shift; $self->{'translator'} = shift if @_; # set if value provided return undef unless defined $self->{'translator'}; $self->{'translator'}; } # reviewer # # get reviewer address # # input: # Ddtc object # reviewer index # output # reviewer address sub reviewer { my $self = shift; return undef unless defined $self->{'reviewers'}; @{ $self->{'reviewers'} }[shift]; } # reviewers # # get / set reviewer list # # input: # Ddtc object # reviewer list [ set ] # output # reviewer list sub reviewers { my $self = shift; my @revs = @_; $self->{'reviewers'} = \@revs if @_; # set if value provided return () unless defined $self->{'reviewers'}; @{ $self->{'reviewers'} }; } # add_reviewer # # add a reviewer address # # input: # Ddtc object # reviewer address sub add_reviewer { my $self = shift; push @{ $self->{'reviewers'} }, shift; } # bug # # get bug # # input: # Ddtc object # bug index # output # bug number sub bug { my $self = shift; return undef unless defined $self->{'bugs'}; @{ $self->{'bugs'} }[shift]; } # bugs # # get / set bug list # # input: # Ddtc object # bug list [ set ] # output # bug list sub bugs { my $self = shift; my @bugs = @_; $self->{'bugs'} = \@bugs if @_; # set if value provided return () unless defined $self->{'bugs'}; @{ $self->{'bugs'} }; } # add_bug # # add a bug number # # input: # Ddtc object # bug number [ set ] sub add_bug { my $self = shift; push @{ $self->{'bugs'} }, (shift); } # description # # get / set description # # input: # Ddtc object # description [ set ] # output # description sub description { my $self = shift; my @desc = @_; $self->{'description'} = \@desc if @_; # set if value provided return undef unless defined $self->{'description'}; wantarray ? @{ $self->{'description'} }: join("\n", @{ $self->{'description'} })."\n"; } # old_description # # get / set old description # # input: # Ddtc object # old description [ set ] # output # old description sub old_description { my $self = shift; my @desc = @_; $self->{'old description'} = \@desc if @_; # set if value provided return undef unless defined $self->{'old description'}; wantarray ? @{ $self->{'old description'} }: join("\n", @{ $self->{'old description'} })."\n"; } # translation # # get / set translation # # input: # Ddtc object # translation [ set ] # output # translation sub translation { my $self = shift; my @tran = @_; $self->{'translation'} = \@tran if @_; # set if value provided return undef unless defined $self->{'translation'}; wantarray ? @{ $self->{'translation'} }: join("\n", @{ $self->{'translation'} })."\n"; } # old_translation # # get / set old translation # # input: # Ddtc object # old translation [ set ] # output # old translation sub old_translation { my $self = shift; my @tran = @_; $self->{'old translation'} = \@tran if @_; # set if value provided return undef unless defined $self->{'old translation'}; wantarray ? @{ $self->{'old translation'} }: join("\n", @{ $self->{'old translation'} })."\n"; } # header # # make pseudo-header # # input: # Ddtc object # output # pseudo-header sub header { my $self = shift; my @h; push @h, "# package: ".$self->name; push @h, "# ddts id: ".$self->message_id; push @h, "# translator: ".$self->translator if $self->translator; if ($self->bugs) { for (my $i = 0; $i < ($self->bugs || 0); $i++) { push @h, "# bug number: ".$self->bug ($i)." ".chr(97+$i); push @h, "# reviewer: ".$self->reviewer($i); } } wantarray ? @h : join("\n", @h)."\n" ; } 1; ddtc-0.17.2/man/0000755000000000000000000000000012657270720010170 5ustar ddtc-0.17.2/man/ddtcrc.fr.5.pod0000644000000000000000000001162212225344430012701 0ustar #!/usr/bin/perl =encoding ISO8859-1 =head1 NOM .ddtcrc - fichier de configuration du script ddtc. =head1 DESCRIPTION C'est le fichier de configuration pour ddtc. S'il existe, il doit se trouver dans votre répertoire personnel (F<$HOME>). Ce fichier est optionnel à moins que vous ne vouliez pas utiliser les valeurs par défaut. Les lignes commençant par un dièse («EB<#>E») et les lignes vides sont ignorées. Les espaces au début et à la fin d'une ligne sont aussi ignorés ainsi que les tabulations. Si vous avez besoin d'espaces à la fin ou au début d'une valeur, vous pouvez utilisez des guillemets anglo-saxons («EB<">E»). Une ligne d'option débute par le nom de l'option suivi par sa valeur. Le signe égal est optionnel. Un commentaire commence par un dièse, il peut y avoir des espaces ou des tabulations devant le dièse. Quelques exemplesE: # cette ligne est ignorée option valeur option = valeur # ceci est un commentaire option "valeur avec espaces à la fin " Vous devez protéger le caractère dièse avec une barre oblique inversée («EB<\>E») si vous voulez l'utiliser dans une valeur. Les valeurs par défaut sont fournies entre crochets, elles devraient convenir pour la plupart des configurations. =head1 GÉNÉRALE =over 4 =item I répertoire de base, c'est un sous-répertoire de votre F<$HOME> à moins qu'un chemin absolu (c'est-à-dire commençant par «E/E») ne soit fourni [ddts]E; =item I chaîne introduisant les commentaires de relecture, un caractère espace lui sera ajouté [>>]E; =item I expression rationnelle pour supprimer les fichiers avec la commande I [~\$|\.old\$|\.bak\$]E; =item I extension de langue à utiliser pour demander de nouveaux documents à traduire ou à relire [vide]E; =item I éditeur de texte [/usr/bin/sensible-editor]E; =item I détermine si les relectures sont envoyées dans un format particulier pour éviter que le ddts ne mette à jour les parties de traduction. [no] AttentionE: si cette option est positionnée à «EBE» (oui), la possibilité d'accepter les modifications d'un relecteur en répondant simplement à un rapport de relecture ne fonctionne pas et toute équipe de traduction devrait utiliser ddtc. Demandez au coordinateur de votre équipe de traduction avant de positionner cette option. Pour la traduction en français («EfrE»), cette option doit être positionnée à «EBE»E; =back =head1 COURRIEL =over 4 =item I votre adresse électronique [la première parmi $ENV{EMAIL}, $ENV{DEBEMAIL}, vide sinon]E; =item I adresse électronique à laquelle vous voulez que le ddts réponde. C'est l'adresse qu'utilise le ddts pour vous identifier, vous B donc utiliser cette option si I a une valeur différente [I]E; =item I adresse électronique du serveur [desc@ddtp.debian.org]E; =item I codage du courriel pour MIME [8bit]E; =item I jeu de caractères du courriel pour MIME [le jeu utilisé par le ddts s'il est connu, à défaut ISO-8859-1]. =item I positionner à «EBE» (oui), si vous voulez recevoir une copie des courriels envoyés [yes]E; =back =head1 COULEURS DES MENUS Définit les couleurs du texte pour une meilleure présentation. Les couleurs reconnues sontE: B et B (normal), B (sombre), B (gras), B et B (souligné), B (clignotant), B (inversé), B (caché), B (noir), B (rouge), B (vert), B (jaune), B (bleu), B (mangenta), B (cyan), B (blanc), B (sur noir), B (sur rouge), B (sur vert), B (sur jaune), B (sur bleu), B (sur magenta), B (sur cyan), et B (sur blanc). La casse n'est pas significative. B et B sont équivalents, de même que B et B, utilisez celui qui vous semble le plus intuitif. Les I seules définissent la couleur des caractères, et les I définissent la couleur du fond. Notez que toutes les couleurs ne sont pas supportées par tous les types de terminaux, et certains terminaux peuvent ne supporter aucune de ces séquences. B, B et B en particulier sont souvent manquantes. =over 4 =item menu_title_color couleur utilisée pour le titre [bold cyan] =item menu_letter_color couleur utilisée pour la lettre à saisir [bold cyan] =item menu_text_color couleur utilisée pour la description [cyan] =back =head1 EXEMPLE Le fichier F est un exemple de fichier de configuration pour ddtc. =head1 VOIR AUSSI ddtc(1). =head1 AUTEUR Nicolas Bertolissio =cut ddtc-0.17.2/man/ddtc.1.pod0000644000000000000000000001657610064641677011773 0ustar #!/usr/bin/perl =head1 NAME ddtc - ddts client tool to help translators and reviewers. =head1 SYNOPSIS ddtc [OPTIONS] COMMAND [ARGUMENTS] =head1 DESCRIPTION This script helps both translators and reviewers with parsing mails from the ddts, splitting them into individual package files, sending reviews and patching buggy translations. Before sending back the translation or the review to the server, the script performs a few tests on it and does not sent it if one of the following succeeds: =over 4 =item - number of paragraphs is different in the description and its translation, =item - line length is more than 80 characters, =item - ItabE> character is found, =item - line starts with a dot (I<.>) followed by other characters. =back It can also be run in interactive mode if no command is provided. In this case, menus are displayed to prompt the user for commands. =head1 COMMANDS Here is the basic process: =over 4 =item - Receiving mail from the ddts Pass the whole mail (i.e. with header and Mime parts) you received from the ddts to the standard input of this script, providing the I command. If it finds descriptions to translate, it creates a F file for each of them in your F directory, diffing it with the preceding you have already translated if it exists. If it finds descriptions to review, it creates a F file for each of them in your F directory. If a preceding review exists, it diffs both and write the diff or set the description as reviewed if there is no difference. If it finds a bug report, it creates a F file in your F directory, it merges all bug reports to ease corrections. It also tries to detect collisions (see below). =item - Working with the files =over 4 =item - Translating Rename the F file in your F directory into F. Edit it with your favorite text editor. =item - Reviewing Rename the F file in your F directory into F. Do not edit the F file (with no extension), it is used internally by ddtc. Edit it with your favorite text editor. You can add comments that will be sent to the translator by adding lines beginning with `BE >' (your I<$Comment> variable contents followed by a mandatory space character). If a translation has already been reviewed and has been modified the script show you the differences between both versions. Lines beginning with `BE-->' correspond to your last version you reviewed, replace this by `B<+E-->' if you think the translator is still wrong. Lines beginning with `BE++>' are the new translator's version, replace this by `B<+E++>' if you agree with the translator. Of course, if you still disagree with the translator, you can add comments as indicated above. =item - Fixing bugs Rename the F file in your F directory into F. Edit it with your favorite text editor. It contains all changes and comments of the reviewers. Lines beginning with `BE>' are comments and doesn't have to be removed. Lines beginning with `BEX+>' are suggested corrections, replace this by `B<+EX+>' if you want to validate it. Lines beginning with `BE-->' are your last translation, replace this by `B<+E-->' if you don't want to accept suggested corrections. Run the script providing the I command. It creates a new F file in your F directory containing the unchanged lines and the lines you have selected. To prevent collisions (reviewers sending review based on a different version than yours), don't send fixed descriptions too often (once a day should be fine), retrieve your mails and parse them just before fixing, send the fixed description as soon as possible afterward. =back =item - Sending files back to the ddts Run the script providing the I command. It sends descriptions from F and F files back to the ddts renaming them into F and closing bugs if necessary. =item - Sending commands to the server Run the script providing the commands you want to be sent to the server. It checks the commands and send them to the server. Available commands: =over 4 =item section I
=item sget I =item get I =item get I =item review I =item review I =item getbug I =item btsclose I =item notification I =item listtranslatedpackages =item status =item noneveraguide =item neveraguide =item noguide =item guide =back In each set: I/I/I/I/I/I, I/I and I/I, only the first found command is used. The script automatically adds language, encoding and mail address (I) if requested, I is default. Due to server limitation, to avoid risk of deny of service attack, you cannot receive for more than 9 new documents at the same time. The script does not check for this, but the server will. For I, I, I, I and I you have either to define the I<$Language> variable in you F<.ddtcrc> configuration file, or to provide a language extension via the I<--lang> or I<-l> option. =item - Cleaning directories Run the script providing the I command. It removes unnecessary files in ddtc directories but temporary one as this directory should be a system wide temporary directory cleaned via system scheduled threads, but for debugging reason. =item - Getting statistics about my work Run the script providing the I command. It prints figures based on file counts, it may not be accurate if directory cleaning has not been made before. =back =head1 OPTIONS Verbosity level: =over 4 =item I<-q, --quiet> quiet mode =item I<-v> verbose, start at level I<$Debug + 1>, add more for more verbosity (see below) =item I<--verbose n> set verbosity level to I (see below) =back cc mails to one-self: =over 4 =item I<-s, --mail-self> send mails also to oneself =item I<-n, --nomail-self> don't send mails to oneself =back other: =over 4 =item I<-l, --lang> language extension to use when asking for new documents to translate or to review =item I<--ddtc-bug> send review in special format. Ask your language coordinator before using this option. =item I<--noddtc-bug> send review in standard format. =item I<-V, --version> print version and exit =item I<-h, --help> print usage and exit =back =head2 Verbosity Level =over 4 =item I<0> quiet only warnings and errors =item I<1> normal package names, reviewer/translator names and bugs numbers =item I<2> reserved for internal use =item I<3> debug normal names of subroutines =item I<4> debug verbose names and short arguments of subroutines =item I<5> debug very verbose names, arguments and return values of subroutines =item I<9> debug don't send mails same as 5 but send mails to oneself instead of ddts =back level 5 and 9 are really verbose, so you should direct the output to a file. =head1 SEE ALSO ddtcrc(5). http://ddtp.debian.org/ddtp-text/misc/ddts-faq.txt. http://ddtp.debian.org/ddtp-text/guides/guide.txt. http://ddtp.debian.org/ddtp-text/guides/review.txt. =head1 AUTHOR Nicolas Bertolissio =cut ddtc-0.17.2/man/ddtc.fr.1.pod0000644000000000000000000002163512225344361012360 0ustar #!/usr/bin/perl =encoding ISO8859-1 =head1 NOM ddtc - outils client du ddts pour aider les traducteurs et les relecteurs. =head1 SYNOPSIS ddtc [OPTIONS] COMMANDE [ARGUMENTS] =head1 DESCRIPTION Ce script aide à la fois les traducteurs et les relecteurs en analysant les courriels du ddts, en mettant chaque paquet dans des fichiers séparés, en envoyant les relectures et en corrigeant les traductions erronées. Avant de renvoyer une traduction ou une relecture au serveur, le script lui fait passer quelques tests et ne l'envoie pas si l'un des tests suivants est vérifiéE: =over 4 =item - nombre de paragraphes différent dans la description et sa traductionE; =item - ligne de plus de 80 caractèresE; =item - présence du caractère ItabE>E; =item - ligne commençant par un point (I<.>) suivi d'autres caractères. =back Il peut être utilisé en mode intéractif si aucune commande n'est fournie. Dans ce cas, des menus sont afficher pour permettre à l'utilisateur d'entrer les commandes. =head1 COMMANDES Voici le manière usuelle de procéderE: =over 4 =item - Recevoir du courriel du ddts Passez le courriel que vous recevez du ddts en entier (c'est-à-dire avec l'en-tête et les parties MIME) à l'entrée standard du script en utilisant la commande I (analyser). S'il trouve des descriptions à traduire, il crée un fichier F pour chacune d'elles dans votre répertoire F. Il indique les différences avec votre dernière traduction si elle existe. S'il trouve des descriptions à relire, il crée un fichier F pour chacune d'elles dans votre répertoire F. Si vous aviez déjà relu cette description, il indique les différences, et, s'il n'y en a pas, marque la description comme étant relue. S'il trouve un rapport de relecture (I), il crée un fichier F dans votre répertoire F et fusionne tous les rapports de relecture pour faciliter les corrections. Il essaye aussi de détecter les collisions (voir plus bas). =item - Travailler avec les fichiers =over 4 =item - Traduire Renommez le fichier F de votre répertoire F en F. Éditez-le avec votre éditeur de texte favori. =item - Relire Renommez le fichier F de votre répertoire F en F. Ne modifiez par le fichier F (sans extension), il est utilisé en interne par ddtc. Éditez-le avec votre éditeur de texte favori. Vous pouvez y ajouter des commentaires qui seront envoyés au traducteur en ajoutant des lignes commençant par «EBEE>E» (la valeur de la variable I<$Comment> suivie nécessairement d'un caractère espace). Si vous avez déjà relu une traduction et que le traducteur y a apporté des modifications, le script vous présente les différences entre les deux versions. Les lignes commençant par «EBE-->E» correspondent à la dernière version que vous avez relue, remplacez cela par «EB<+E-->E» si vous pensez que la traduction comporte toujours une erreur. Les lignes commençant par «EBE+>E» correspondent à la nouvelle version du traducteur, remplacez cela par «EB<+E++>E» si vous êtes d'accord avec le traducteur. Bien sûr, si vous n'êtes pas d'accord avec le traducteur, vous pouvez ajouter des commentaires comme indiqué ci-dessus. =item - Corriger les erreurs Renommez le fichier F de votre répertoire F en F. Éditez-le avec votre éditeur de texte favori. Il contient toutes les modifications et tous les commentaires des relecteurs. Les lignes commençant par «EBE>E» sont des commentaires et n'ont pas besoin d'être supprimées. Les lignes commençant par «EBEX+>E» sont des suggestions de corrections, remplacez cela par «EB<+EX+>E» pour les valider. Les lignes commençant par «EBE-->E» sont votre dernière traduction, remplacez cela par «EB<+E-->E» si vous ne souhaitez pas accepter les suggestions. Lancez le script avec la commande I (corriger). Il crée un nouveau fichier F dans votre répertoire F qui contient les lignes inchangées et celles que vous avez sélectionnées. Pour éviter les collisions (relectures basées sur une version différente de la vôtre), n'envoyez pas de descriptions corrigées trop souvent (une fois par jour devrait aller), récupérez vos courriels et analysez-les avec le script juste avant de les corriger, et envoyez les descriptions corrigées aussitôt que possible. =back =item - Renvoyer les fichiers au ddts Lancez le script avec la commande I (écrire). Il renvoie les descriptions des fichiers F et F au ddts et les renomme F, il clôture les rapports de relecture si nécessaire. =item - Envoyer des commandes au serveur Lancez le script avec les commandes que vous souhaitez envoyer au serveur. Il les vérifiera et les enverra au serveur. Commandes disponiblesE: =over 4 =item section I =item sget I =item get I =item get I =item review I =item review I =item getbug I =item btsclose I =item notification I =item listtranslatedpackages =item status =item noneveraguide =item neveraguide =item noguide =item guide =back Dans chaque ensembleE: I/I/I/I/I/I, I/I et I/I, seule la première commande trouvée est utilisée. Le script ajoute automatiquement la langue, le codage et l'adresse (I) si nécessaire, par défaut I est utilisé. En raison cause d'une limitation du serveur, vous ne pouvez pas recevoir plus de neuf nouveaux documents à la fois afin d'éviter le risque d'attaque par déni de service. Le script ne vérifie pas cela, mais le serveur le fera. Pour I, I, I, I et I vous devez soit définir la variable I<$Language> dans votre fichier F<.ddtcrc> de configuration, soit fournir une extension de langue par les options I<--lang> ou I<-l>. =item - Nettoyer les répertoires Lancez le script avec la commande I (nettoyer). Il supprime tous les fichiers inutiles dans les répertoires du ddtc sauf le répertoire des fichiers temporaires car celui-ci devrait être un répertoire temporaire au niveau du système complet et être nettoyé par des tâches périodiques, sauf pour des raisons de débogage. =item - Avoir des statistiques sur son travail Lancez le script avec la commande I (statistiques). Il affiche des nombres en fonction des fichiers présents, il est possible que les résultats ne soient pas justes si un nettoyage des répertoires n'a pas été effectué préalablement. =back =head1 OPTIONS Niveau de bavardageE: =over 4 =item I<-q, --quiet> silencieuxE; =item I<-v> bavard, commence au niveau I<$Debug + 1>, plus il y en a, plus il est bavard (voir plus bas)E; =item I<--verbose n> utiliser le niveau de bavardage I (voir plus bas). =back S'envoyer une copie des courrielsE: =over 4 =item I<-s, --mail-self> s'envoyer une copie des courrielsE; =item I<-n, --nomail-self> ne pas s'envoyer de copie des courriels. =back AutreE: =over 4 =item I<-l, --lang> extension de langue à utiliser lors des demandes de nouveaux documents («EBE» pour le français)E; =item I<--ddtc-bug> envoyer les relectures en format spécial. Demandez au coordinateur de votre équipe de traduction avant d'utiliser cette option. Pour le français, il a été décidé que cette option devait être utiliséeE; =item I<--noddtc-bug> envoyer les relectures au format standardE; =item I<-V, --version> afficher la version du scriptE; =item I<-h, --help> afficher le message d'utilisation. =back =head2 Niveau de bavardage =over 4 =item I<0> silencieux seulement les avertissements et les erreursE; =item I<1> normal noms des paquets, des relecteurs et des traducteurs et les numéros de rapport de relectureE; =item I<2> réservé pour usage interneE; =item I<3> débogage normal noms des procéduresE; =item I<4> débogage bavard noms des procédures et arguments courtsE; =item I<5> débogage très bavard noms des procédures, arguments et valeurs de retourE; =item I<9> débogage ne pas envoyer de courriels comme 5 mais adresse les courriels à soi-même au lieu du ddts. =back les niveaux 5 et 9 sont vraiment très bavards, vous devriez rediriger la sortie vers un fichier. =head1 VOIR AUSSI ddtcrc(5). http://ddtp.debian.org/ddtp-text/misc/ddts-faq-fr.txt. http://ddtp.debian.org/ddtp-text/guides/guide-fr.txt. http://ddtp.debian.org/ddtp-text/guides/review-fr.txt. =head1 AUTEUR Nicolas Bertolissio =cut ddtc-0.17.2/man/ddtcrc.5.pod0000644000000000000000000000750307746322540012310 0ustar #!/usr/bin/perl =head1 NAME .ddtcrc - ddtc script configuration file. =head1 DESCRIPTION This is the configuration file for ddtc. If it exists, it must be at the top of your home directory (F<$HOME>). This file is optional unless you don't want to use default values. Lines beginning with a number sign (`B<#>') and empty lines will be ignored. Spaces at the beginning and the end of a line will also be ignored as well as tabulators. If you need spaces at the end or the beginning of a value you can use apostrophes (`B<">'). An option line starts with it's name followed by a value. An equal sign is optional. A comment starts with the number sign, there can be any number of spaces and/or tab stops in front of the #. Some possible examples: # this line is ignored option value option = value # this is a comment option "value ending with space " You have to escape number signs with a backslash (`B<\>') to use it in a value. Default values are provided into square brackets, they should be suitable for most installations. You can use the configuration menu from interactive mode to edit it. =head1 GENERAL =over 4 =item I base directory, sub-directory of your F<$HOME> unless an absolute path (i.e. beginning with `/') is provided [ddts] =item I comment string for review, a space character will be added to this string [>>] =item I regular expression to remove file with I command [~\$|\.old\$|\.bak\$] =item I language extension to use when asking for new documents to translate or to review [none] =item I text editor [sensible-editor] =item I whether reviews are sent in a special way to prevent updating ddts parts databases or not. [no] Caution: if set to `B', the `reply to accept modification' ddts feature doesn't work anymore and the whole language team should use ddtc. Ask your language team coordinator before setting this option. =back =head1 EMAIL =over 4 =item I your email address [first found in $ENV{EMAIL}, $ENV{DEBEMAIL} or none] =item I the mail address you want the ddts to answer to. This is the address the ddts uses for your identification so you B use this if you need to set I to another value [I] =item I email address of the server [desc@ddtp.debian.org] =item I mail encoding for mime [8bit] =item I mail charset for mime [ISO-8859-1 for lack of charset used by ddts] =item I set to `B' if you want to be sent a copy of outgoing mail [yes] =back =head1 MENU COLORS Set text colors for clear presentation. The recognized colors (all of which should be fairly intuitive) are: B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, and B. Case is not significant. Underline and underscore are equivalent, as are clear and reset, so use whichever is the most intuitive to you. The I alone sets the foreground color, and I sets the background color. Note that not all colors are supported by all terminal types, and some terminals may not support any of these sequences. Dark, blink, and concealed in particular are frequently not implemented. =over 4 =item menu_title_color color used for menu title [bold cyan] =item menu_letter_color color used for the letter to be entered [bold cyan] =item menu_text_color color used for the menu item description [cyan] =back =head1 EXAMPLE A ddtc configuration example file can be found at F. =head1 SEE ALSO ddtc(1). =head1 AUTHOR Nicolas Bertolissio =cut ddtc-0.17.2/debian/0000755000000000000000000000000012657270721010640 5ustar ddtc-0.17.2/debian/changelog0000644000000000000000000007305712657270111012517 0ustar ddtc (0.17.2) unstable; urgency=medium * QA upload. * Set the maintainer to the QA team. * Build with debhelper 9 (closes: #800279) * Update FSF's address. -- Adam Borowski Fri, 12 Feb 2016 06:40:16 +0100 ddtc (0.17.1+nmu1) unstable; urgency=low * Non-maintainer upload. * Fix POD files to be compatible with perl 5.18. (closes: bug#723795) * debian/compat: added, set to 3. * debian/rules: Remove DH_COMPAT=3. * debian/changelog: Add two missing colons in changelog date. * debian/control: - Add ${misc:Depends} to Depends. - Replace Build-Depends-Indep by Build-Depends, for the clean target. + From a patch by Salvatore Bonaccorso: - Remove libmime-base64-perl from Depends. See http://lists.debian.org/debian-perl/2003/09/msg00014.html - Substitute libmime-perl Depends with libmime-tool-perl (Closes: #601265). -- Bill Allombert Wed, 09 Oct 2013 23:21:17 +0200 ddtc (0.17.1) unstable; urgency=low * fix FTBFS with new make version (closes: bug#352786) -- Nicolas Bertolissio Sun, 19 Feb 2006 22:08:42 +0100 ddtc (0.17) unstable; urgency=low * fix typos in READMEs thanks to Cristian Rigamonti for his patches (closes: bug#268069) * fix server address thanks to Ludovic Rousseau for his patch (closes: bug#255386) * add some info about customisation of vim syntax file thanks to Lorenzo Cappelletti for this -- Nicolas Bertolissio Sat, 9 Oct 2004 22:25:51 +0200 ddtc (0.16) unstable; urgency=low * purge incoming mail to collect disk garbage -- Nicolas Bertolissio Mon, 9 Aug 2004 15:16:20 +0200 ddtc (0.15) unstable; urgency=low * vim syntax files must be unzipped (closes: bug#255387) * fix email address in procmailrx sample file Thanks to Ludovic Rousseau for his patch (closes: bug#255386) * fix command separator match in 'ddts_command' (closes: bug#259556) * do not move unexisting directory thanks to Matthias Lutz for reporting this bug (closes: bug#259716) -- Nicolas Bertolissio Tue, 27 Jul 2004 22:44:21 +0200 ddtc (0.14) unstable; urgency=low * use 'send' instead of 'smtpsend' thanks to Daniel Serpell for reporting this bug thanks to Bill Allombert for solving it (closes: bug#217868) * do not purge incoming mails (closes: bug#255027) * add info on duplicate files in the 'rev' directory in manpage -- Nicolas Bertolissio Fri, 18 Jun 2004 21:36:03 +0200 ddtc (0.13.1) unstable; urgency=low * fix missing changelog entry: * intercept error when sending mail thanks to Daniel Serpell for reporting this bug (closes: bug#209363) -- Nicolas Bertolissio Thu, 6 Nov 2003 23:30:35 +0100 ddtc (0.13) unstable; urgency=low * update manpages * translate one missing string in fr.po * Standards-version: 3.6.1 * add server address in config file * new vim syntax files thanks to Lorenzo Cappelletti for theses very good work * fix error when description is empty thanks to Ludovic Rousseau for reporting this bug (closes: bug#216314) * change maintainer's address to Debian's one -- Nicolas Bertolissio Sat, 25 Oct 2003 00:13:49 +0200 ddtc (0.12.1) unstable; urgency=low * improve `po/Makefile' so it find languages from `*.po' * fix package name search thanks to Jean Privat for reporting this bug (closes: bug#205869) * add `Recommends: libterm-readline-gnu-perl' * fix copy/paste trouble in bug interactive management thanks to Beatrice Torracca for reporting this bug * fix double menu letters in menu definitions * new server address (desc3) -- Nicolas Bertolissio Sat, 30 Aug 2003 23:08:09 +0200 ddtc (0.12) unstable; urgency=low * add more strings to i18n * add interactive mode thanks to Matthias Juchem for requesting this feature * execute parse commande if STDIN is not tty* and no command is provided * execute in interactive mode if STDIN and STDOUT are tty* and no command is provided * remove no longuer needed automatic convertion code * `ls_dir' can grep on file extention thanks to Matthias Juchem for his patch * fix `debug' statement position in `parse' * test and create directories only when really needed * fix missing application name in `Term::ReadLine::new' call * add filename in error messages -- Nicolas Bertolissio Wed, 13 Aug 2003 09:44:32 +0200 ddtc (0.11) unstable; urgency=low * clean `debian/' directory - add `Build-Depends-Indep: perl - clean `rules' thanks to Denis Barbier for all these * use `File::Spec::Functions' to deal with filenames and directories * add internationalisation * add French localisation * fix sending `noguide' to the server if no command to send -- Nicolas Bertolissio Sun, 27 Jul 2003 16:03:43 +0200 ddtc (0.10.2) unstable; urgency=low * fix spelling in manpages * add `acheck' as suggested package * Standards-version: 3.6.0 - recode changelog to utf-8 * remove useless dependancy on `sharutils' -- Nicolas Bertolissio Sun, 20 Jul 2003 14:25:36 +0200 ddtc (0.10.1) unstable; urgency=low * fix `ddtc.vim' highlighting troubles (closes: bug#200295) * fix missing end-of-line when testing for locally accepted review * turn `sent' into `bugged' for review statistics * change server address -- Nicolas Bertolissio Thu, 10 Jul 2003 09:09:45 +0200 ddtc (0.10) unstable; urgency=low * use logical variable name in various places thanks to Bartosz ZapaÅ‚owski for reporting this bug * make review diffs like bug ones * add selection feature for review like the bug one * modify manpages and `ddtc.vim' accordingly * fix italian word in `vim/README' * fix missing language in `listtranslatedpackages' command thanks to Frank Lichtenheld for reporting this bug (closes: bug#200155) * fix typos in french manpages, thanks to the reviewers from debian-l10n-french * issue a warning if description and/or translation is missing when parsing thanks to Yann Dirson for reporting this bug (closes: bug#200158) * add some comments * fix diffing of `Description-XX:' lines with charset different from ddts standard one -- Nicolas Bertolissio Sun, 6 Jul 2003 14:48:44 +0200 ddtc (0.9.2) unstable; urgency=low * fix test against line starting with a dot and something else * fix test for number of paragraphs * change server address in `procmailrc' sample file * add links to faq, translator and reviewer guides in manpage * fix copyright now ddtc is in Debian archive thanks to Ludovic Rousseau for reporting this bug (closes: bug#196599) * add `ddtc.vim' install info thanks to Ludovic Rousseau for reporting this bug (closes: bug#197476) -- Nicolas Bertolissio Tue, 17 Jun 2003 21:28:05 +0200 ddtc (0.9.1) unstable; urgency=low * fix usage message * gather vim files into `vim/' directory * add vim syntax from Emanuele Aina * fix `README' about upgrading * make source tree clearer: - move files for `/usr/share/doc/ddtc/' to `misc/' - move manpages sources to `man/' * change server address due to server troubles thanks to Ludovic Rousseau for reporting this bug (closes: bug#196591) * add test against line starting with a dot and something else * add test for number of paragraphs * add short explaination on tests in manpage * Standards-version: 3.5.10 -- Nicolas Bertolissio Sun, 8 Jun 2003 13:14:15 +0200 ddtc (0.9) unstable; urgency=low * when sending descriptions back to the server, move files after mail build thanks to Frank Lichtenheld for reporting this bug (closes: bug#191516) * add new file extension for locally accepted description, and do automatic conversion after first `mail' command thanks to Michel Grentzinger for reporting this bug (closes: bug#191436) * fix spelling mistake in French manpage * remove `mail_single' option, always send one mail (was default) * use `File::Path' module to create directories * use `File::Copy' module to move files * fix line length test * format check outputs a `^' on error * add ddts commands * check against ddts command before sending * remove old commands `ask_trans' and `ask_review', print warning to use new `get' and `review' * remove `help' and `version' commands, these are options -- Nicolas Bertolissio Sun, 18 May 2003 10:38:05 +0200 ddtc (0.8.3) unstable; urgency=low * fix spelling in English manpage thanks to Frank Lichtenheld for reporting this bug (closes: bug#190980) * fix spelling in French manpage thanks to Michel Grentzinger for his patch (closes: bug#190991) * fix new `REVIEWED' subject parsing * add example file location in ddtcrc manpage and fix some more spelling mistakes in the French manpage thanks to Thomas Marteau for reporting these * add info about `mail_in' in ddtcrc manpages * fix `mail_in' default value in ddtcrc English manpage -- Nicolas Bertolissio Tue, 29 Apr 2003 11:24:13 +0200 ddtc (0.8.2) unstable; urgency=low * check for bug number instead of message id to know whether bug has already been parsed thanks to Jérome Vaillant for reporting this bug * add normal diff sub (`ndiff') * fix mixing bug reports: don't overwrite, mixing review correction should be fine now, mixing review comments needs some more work * add warning if unable to convert charsets and use unconverted data (closes: bug#187649) * remove `Description: ' from short description for `apt-cache' search thanks to Bruno Rodrigues for his patch (closes: bug#187636) * fix undefined language value when parsing old translation * fix precedence on error exit (`||' -> `or') * add review diff info in manpages -- Nicolas Bertolissio Sun, 6 Apr 2003 12:57:38 +0200 ddtc (0.8.1) unstable; urgency=low * fix old translation choice for standard bugs thanks to Christian Perrier for reporting this bug (closes: bug#184629) * remove non-official package warning in `README.Debian' -- Nicolas Bertolissio Fri, 14 Mar 2003 09:27:03 +0100 ddtc (0.8) unstable; urgency=low * fix ddts command parsing * remove `/usr/doc' symlink * add new option `mail_single' thanks to Bartosz ZapaÅ‚owski for providing patch * fix typos in english and french `ddtcrc' manpages * add full charset support * clarify the _whole_ mail is needed in manpages * editor comply with policy.12.4 -- Nicolas Bertolissio Sun, 9 Mar 2003 17:03:21 +0100 ddtc (0.7.7) unstable; urgency=low * add ddts commands for ddts-ddtc consistancy * fix non-breaking spaces in french manpages -- Nicolas Bertolissio Mon, 3 Mar 2003 12:14:06 +0100 ddtc (0.7.6) unstable; urgency=low * fix missing parentheses -- Nicolas Bertolissio Mon, 3 Mar 2003 01:14:11 +0100 ddtc (0.7.5) unstable; urgency=low * fix bug parsing thanks to Migrec and Laurent Defours for reporting this bug -- Nicolas Bertolissio Sun, 2 Mar 2003 23:08:38 +0100 ddtc (0.7.4) unstable; urgency=low * add `libalgorithm-diff-perl' version depend thanks to Benoît Sibaud for reporting this bug * fix bug if no `.ddtcrc' found thanks to Migrec for reporting this bug * fix spelling in README.Debian -- Nicolas Bertolissio Sun, 2 Mar 2003 15:54:04 +0100 ddtc (0.7.3) unstable; urgency=low * fix return values in Package.pm thanks to Christian Perrier for reporting this bug -- Nicolas Bertolissio Fri, 21 Feb 2003 20:55:39 +0100 ddtc (0.7.2) unstable; urgency=low * fix uninitialized value warnings thanks to Christian Perrier and Bartosz ZapaÅ‚owski for reporting these two bugs -- Nicolas Bertolissio Fri, 21 Feb 2003 15:48:32 +0100 ddtc (0.7.1) unstable; urgency=low * fix typo * add patch to ask for a package by name thanks to Bartosz ZapaÅ‚owski for providing it -- Nicolas Bertolissio Mon, 17 Feb 2003 15:19:12 +0100 ddtc (0.7) unstable; urgency=low * use Algorithm::Diff:: perl module to create diffs * fix regex in `fix' Thanks to Ludovic Rousseau for reporting this bug * use charset * parse charset even if no translation done * reduce `superdiff' call number -- Nicolas Bertolissio Mon, 17 Feb 2003 11:14:42 +0100 ddtc (0.6.2) unstable; urgency=low * fix parsing bugs thanks to Laurent Defours for reporting this bug -- Nicolas Bertolissio Fri, 14 Feb 2003 16:47:56 +0100 ddtc (0.6.1) unstable; urgency=low * fix missing Depends: libconfig-general-perl thanks to Julien Louis for reporting this bug -- Nicolas Bertolissio Thu, 13 Feb 2003 22:58:31 +0100 ddtc (0.6.0) unstable; urgency=low * rewrite with two modules * deal with ddts standard bug reports * send standard or special reviews * use `Config::General::' module for config file * convert old `.ddtc' config file to new `.ddtcrc' * test for defined mail address only if we need to send mails (not for parsing) * ddts.vim: fix Todo in short description * add sample `.ddtcrc' thanks to Nicolas Sabouret for reporting this bug * fix some typos in french manpages thanks to Nicolas Boulenguez for reporting these bugs * fix explanations in manpage `Fixing bugs' section thanks to Benoît Peccatte for this -- Nicolas Bertolissio Mon, 10 Feb 2003 12:17:57 +0100 ddtc (0.5.5) unstable; urgency=low * decode Q- and B- encoded fields * use `Reply-To' field instead of `From:' instruction * add `-V' and `--version' option to get script version thanks to Christian Perrier for reporting this missing feature -- Nicolas Bertolissio Mon, 10 Feb 2003 09:23:56 +0100 ddtc (0.5.4) unstable; urgency=low * fix regex to parse packages without package-name * fix typo in changelog -- Nicolas Bertolissio Sun, 9 Feb 2003 10:45:57 +0100 ddtc (0.5.3) unstable; urgency=low * fix missing Depends: libmime-base64-perl thanks to Beatrice Torracca for reporting this bug -- Nicolas Bertolissio Fri, 7 Feb 2003 22:39:10 +0100 ddtc (0.5.2) unstable; urgency=low * use new ddts pseudo-header fields -- Nicolas Bertolissio Mon, 3 Feb 2003 20:15:44 +0100 ddtc (0.5.1) unstable; urgency=low * add look at `$DEBEMAIL' to set default email thanks to Michael Piefel for reporting this missing feature * change ddtc(5) accordingly -- Nicolas Bertolissio Tue, 28 Jan 2003 16:25:22 +0100 ddtc (0.5) unstable; urgency=low * use `MIME::' package to send messages * fix parsing multiple packages -- Nicolas Bertolissio Tue, 28 Jan 2003 15:03:35 +0100 ddtc (0.4.2) unstable; urgency=low * remove empty comment in bug reports (ddts inconsistancy) thanks to Christian Pierrer for reporting this bug -- Nicolas Bertolissio Tue, 28 Jan 2003 13:06:16 +0100 ddtc (0.4.1) unstable; urgency=low * fix parameter when calling `parse_bug' and `parse_translation' thanks to Julien Louis for reporting this bug * fix data structure creation for bugs (due to ddts inconsistancy) * fix old translation parsing * fix old translation debug message -- Nicolas Bertolissio Tue, 28 Jan 2003 12:45:01 +0100 ddtc (0.4) unstable; urgency=low * fix typo in french manpage thanks to Pierre Machard for reporting this bug * fix typos * fix typo in `changelog' * use data structure when parsing email - rewrite `parse_*' accordingly * use `MIME::' package to parse messages (depends on `libmime-perl') - rewrite `parse_*' accordingly * `superdiff' returns an array or a scalar according calling context * check for multipart mime message before parsing * add note to provide whole message to STDIN in `README.Debian' * check for `\t' before sending description thanks to Esa Turkiainen for reporting this bug * add maintainer's address in `copyright' thanks to Ludovic Rousseau for reporting this bug -- Nicolas Bertolissio Mon, 27 Jan 2003 12:57:36 +0200 ddtc (0.3.3) unstable; urgency=low * add dependency on `sharutils' thanks to Nicolas Boulanguez for reporting this bug * change maintainer's address -- Nicolas Bertolissio Sun, 14 Apr 2002 22:10:14 +0200 ddtc (0.3.2) unstable; urgency=low * change path to sendmail, for Sid compatibility thanks to Emmanuel Valliet for his patch -- Nicolas Bertolissio Wed, 6 Mar 2002 11:01:39 +0100 ddtc (0.3.1) unstable; urgency=low * change ddtp address * fix some typo. thanks to Benoît Sibaud for this patch -- Nicolas Bertolissio Sat, 2 Mar 2002 21:13:22 +0100 ddtc (0.3) unstable; urgency=low * really deal with changed English descriptions thanks to Christian Pierrer for reporting this bug * add `--help' option when getting usage message in `bash_completion' * change `/' into `_' in package name if no name can be found * change maintainer address -- Nicolas Bertolissio Fri, 1 Mar 2002 23:59:21 +0100 ddtc (0.2.2) unstable; urgency=low * split `README.Debian' * add bash completion rules * fix `procmailrc' * add comments in `procmailrc' and `ddtc.vim' * fix `changelog' * add language option in manpage and french manpage -- Nicolas Bertolissio Tue, 26 Feb 2002 19:20:22 +0100 ddtc (0.2.1) unstable; urgency=low * move email address test so configuration dump is displayed even if no address is provided thanks to Lorenzo Cappelletti for reporting this bug * change procmail rule in `README.Debian' thanks to Martin Quinson for these new rules * add note in `README.Debian' * add warning in manpage 5 about escaping characters thanks to Pierre Machard for reporting this bug -- Nicolas Bertolissio Sat, 23 Feb 2002 23:31:28 +0100 ddtc (0.2) unstable; urgency=low * add spaces in error and warning messages * fix typo in comments * fix spelling in usage message * remove local variable when parsing options * remove alpha debug message * add `exit' after printing usage message * change remaining `die' into `suicide' * add `Conflicts:' field in `control' file * fix typo in manpage (1) * remove `&' when calling subs so prototypes are useful * fix debug output in `make_review' * fix Christian Perrier name in `changelog' * add French manpages -- Nicolas Bertolissio Fri, 15 Feb 2002 23:54:39 +0100 ddtc (0.1) unstable; urgency=low * change script name from `ddts-script' to `ddtc' Lorenzo Cappelletti and Martin Quinson request * fix typo in unconfigured script message * escape dots in unconfigured script regex * add `debug', `suicide' and `warning' subs * use constants for contant values * capitalize first letter of global variables * use default values so configuration file is optional * add prototypes in subs declarations * fix typo in `README.Debian' * split manpage, configuration is now in section #5 * use `$Clean_re' to skip files when counting `.$Rev_e' in `stats' thanks to Christian Perrier and Martin Quinson for reporting this bug * add `ask_trans' ans `ask_review' commands thanks to Martin Quinson for this patch -- Nicolas Bertolissio Fri, 15 Feb 2002 18:25:11 +0100 ddts-script (0.4.18) unstable; urgency=low * transition package to `ddtc' -- Nicolas Bertolissio Wed, 13 Feb 2002 23:28:56 +0100 ddts-script (0.4.17) unstable; urgency=low * changes for potato perl compatibility thanks to Christian Perrier for reporting this bug -- Nicolas Bertolissio Wed, 13 Feb 2002 23:28:56 +0100 ddts-script (0.4.16) unstable; urgency=low * remove command when parsing command line -- Nicolas Bertolissio Tue, 12 Feb 2002 20:18:21 +0100 ddts-script (0.4.15) unstable; urgency=low * fix magic line to comply with Debian Perl Policy 4.1 * fix package description * remove end of pod documentation * use Getopt::Long module to parse options * turn back `while' loop into `until' * add sub to display usage message * add help option -- Nicolas Bertolissio Tue, 12 Feb 2002 12:40:37 +0100 ddts-script (0.4.14) unstable; urgency=low * fix typo for ppart match due to ddts fix * turn `until' loop into `while' * prevent from using `me@my.isp.org' sample address thanks to Martin Quinson for reporting these bugs -- Nicolas Bertolissio Sat, 9 Feb 2002 23:33:16 +0100 ddts-script (0.4.13) unstable; urgency=low * Initial Debian Package release * fix typo ans spelling in `changelog' * fix pod manpage * remove pod documentation -- Nicolas Bertolissio Sat, 9 Feb 2002 18:11:49 +0100 ddts-script (0.4.12) unstable; urgency=low * skip bug closure when parsing thanks to Emmanuel Valliet for reporting this bug -- Nicolas Bertolissio Sat, 08 Feb 2002 23:04:00 +0100 ddts-script (0.4.11) unstable; urgency=low * use a regexp to clean files, to add compatibility with other scripts (l10n-check) -- Nicolas Bertolissio Sat, 26 Jan 2002 14:43:00 +0100 ddts-script (0.4.10) unstable; urgency=low * write right short description diff when first description line is also changed thanks to Michael Wiedmann for reporting this bug -- Nicolas Bertolissio Sat, 12 Jan 2002 12:08:00 +0100 ddts-script (0.4.9) unstable; urgency=low * skip empty and ppart comments instead of removing them afterwards thanks to Christian Perrier for reporting this bug -- Nicolas Bertolissio Wed, 9 Jan 2002 21:34:00 +0100 ddts-script (0.4.8) unstable; urgency=low * remove only _empty_ (not all) comments thanks to Philippe Trbich for reporting this bug -- Nicolas Bertolissio Tue, 8 Jan 2002 19:01:00 +0100 ddts-script (0.4.7) unstable; urgency=low * remove empty and ppart comments when parsing translation thanks to Christian Perrier for reporting this missing feature -- Nicolas Bertolissio Tue, 8 Jan 2002 09:35:00 +0100 ddts-script (0.4.6) unstable; urgency=low * add example values for config file in manpage thanks to Christophe Mertz for reporting this missing feature * remove `*~$' files (emacs temp files) in `$bug_dir' ans `rev_dir' thanks to Nicolas Sabouret for reporting this bug * change spelling in manpage thanks to Christophe Mertz for reporting this bug * write correct diff for short desc in `parse_review' thanks to Vincent Haverlant for reporting this bug -- Nicolas Bertolissio Tue, 8 Jan 2002 00:02:00 +0100 ddts-script (0.4.5) unstable; urgency=low * try to create directories recursively thanks to Youssef Oualmakran for reporting this missing feature -- Nicolas Bertolissio Sat, 5 Jan 2002 11:10:00 +0100 ddts-script (0.4.4) unstable; urgency=low * write `Description: ' correctly when original description is changed thanks to Philippe Trbich for reporting this bug * die if line not processed when parsing attached files thanks to Lorenzo Cappelletti for reporting this bug -- Nicolas Bertolissio Thu, 1 Jan 2002 23:22:00 +0100 ddts-script (0.4.3) unstable; urgency=low * change typo * really warn if `apt-cache' not found * remove comments in description thanks to Philippe Trbich for reporting these last two bugs -- Nicolas Bertolissio Sun, 30 Dec 2001 21:07:00 +0100 ddts-script (0.4.2) unstable; urgency=low * change server address * warn when bug not in the script format, don't try to deal with it (I'll try to work on this later, I have no time at the moment) -- Nicolas Bertolissio Sat, 29 Dec 2001 16:53:00 +0100 ddts-script (0.4.1) unstable; urgency=low * don't compare translations if bug reports' description changed thanks to Philippe trbich for reporting this bug * change typo in changelog -- Nicolas Bertolissio Sat, 15 Dec 2001 20:30:00 +0100 ddts-script (0.4) unstable; urgency=low * deal with non-script bug reports -- Nicolas Bertolissio Fri, 14 Dec 2001 08:06:00 +0100 ddts-script (0.3.2) unstable; urgency=low * don't stop on comments in `get_description' thanks to Philippe Trbich for reporting this bug -- Nicolas Bertolissio Sun, 9 Dec 2001 23:35:00 +0100 ddts-script (0.3.1) unstable; urgency=low * warn if `apt-cache' not found, continue with `noname-' file * output statistics if there are only `todo' files -- Nicolas Bertolissio Sun, 9 Dec 2001 12:43:00 +0100 ddts-script (0.3) unstable; urgency=low * add `stats' command and corresponding manpage * add `clean' command in manpage * add options in manpage * remove alpha debug output * remove `known bug' in manpage * change typo in manpage * use right extensions in warning/error message in `parse_bug' * change warning messages in `parse_bug' -- Nicolas Bertolissio Mon, 3 Dec 2001 16:19:00 +0100 ddts-script (0.2.3) unstable; urgency=low * add translator address in file to review (new in ddts) * put right comments on short description when parsing bug report thanks to Philippe Trbich for reporting this bug -- Nicolas Bertolissio Sun, 2 Dec 2001 09:24:00 +0100 ddts-script (0.2.2) unstable; urgency=low * `$base_dir' variable in `.ddts_script' thanks to Lorenzo Cappelletti for this * change manpage for setup file * create `$temp_dir' if it doesn't exist * add missing concatenation in `parse_review' * change typo in `changelog' -- Nicolas Bertolissio Sat, 1 Dec 2001 22:37:00 +0100 ddts-script (0.2.1) unstable; urgency=low * when a translation is accepted by the ddts, rename `package_name.$rev_e' (instead of `package_name.$sent_e' which doesn't exists) -- Nicolas Bertolissio Fri, 30 Nov 2001 09:21:00 +0100 ddts-script (0.2) unstable; urgency=low * deal with bug repports for changed english description (new in ddts) * add `$mail-from' line in manpage * put right comments on short translated description when parsing review * change spelling in comments -- Nicolas Bertolissio Thu, 29 Nov 2001 09:27:00 +0100 ddts-script (0.1.9) unstable; urgency=low * add permissions when creating `$tr_dir' (for compliance with perl < 5.6) thanks to Nicolas Sabouret for reminding me this patch from Denis Barbier * creates `$bug_dir' and `$rev_dir' if they don't exist * list fixed files * say if nothing has been sent * add remove `*~' files * add `From: ' line option, with `$mail_from' thanks to Nicolas Sabouret for reporting these bugs -- Nicolas Bertolissio Wed, 28 Nov 2001 14:57:00 +0100 ddts-script (0.1.8) unstable; urgency=low * compare new review with accepted one for auto-acknolegment -- Nicolas Bertolissio Tue, 27 Nov 2001 20:14:00 +0100 ddts-script (0.1.7) unstable; urgency=low * add map regexpt to remove heading space in `Description-XX' line FIXME this is not a real fix, I don't know why this can happen thanks to Christian Perrier for reporting this bug -- Nicolas Bertolissio Mon, 26 Nov 2001 07:43:00 +0100 ddts-script (0.1.6) unstable; urgency=low * add english description in diff of descriptions to review -- Nicolas Bertolissio Sat, 24 Nov 2001 12:33:00 +0100 ddts-script (0.1.5) unstable; urgency=low * change spelling in `usage' message * change old file name when parsing descriptions to review so it really set the review as ok automatically -- Nicolas Bertolissio Fri, 23 Jan 2001 11:53:00 +0100 ddts-script (0.1.4) unstable; urgency=low * change spelling in mail (`$tr_dir' -> `$rev_dir') thanks to Thomas Marteau for reporting this bug -- Nicolas Bertolissio Mon, 19 Nov 2001 01:11:00 +0100 ddts-script (0.1.3) unstable; urgency=low * use an instruction block for `map' in `parse_translation' thanks to Antoine Hulin to have made me discover this bug * remove comments when sending translation * use real language when sending mail (instead of `fr') * change debug subroutine names -- Nicolas Bertolissio Fri, 16 Nov 2001 11:59:00 +0100 ddts-script (0.1.2) unstable; urgency=low * deal with descriptions which passed the review process you must add a `$ok_e' variable definition in your `~/.ddts-script' -- Nicolas Bertolissio Thu, 15 Nov 2001 19:21:00 +0100 ddts-script (0.1.1) unstable; urgency=low * mail subject contains package name * comment line maximum length is 94 (instead of 75) * accept any filename beginning with `new.' for attachment containing descriptions to translate -- Nicolas Bertolissio Fri, 09 Nov 2001 14:19:00 +0100 ddts-script (0.1) unstable; urgency=low * initial release -- Nicolas Bertolissio Wed, 07 Nov 2001 11:13:00 +0100 ddtc-0.17.2/debian/README.Debian0000644000000000000000000000206710132040152012661 0ustar ddtc for Debian --------------- Version 0.12: files extensions and directories are renamed with standard hierarchy and extension automatically at first ddtc run. ----- Upgrading from 0.8.3 and earlier versions: in these versions, statistics for review were wrong; even if there is nothing to send, run `ddtc' once after upgrade to fix the problem. ----- You must provide a whole message, including headers and encoded mime parts, to STDIN. If you are using mutt, you may want to add `set pipe_decode=no' in your `.muttrc'. ----- A procmail rule is provided in `procmailrc', add it to your personal `.procmailrc' to automatically parse your incoming mails from the ddts. ----- Bash completion rules are provided in `bash_completion', add it to your personal completion rules to use them. ----- If your editor is `vim', you can use the syntax highlighting files from Lorenzo Cappelletti. If you're using another text editor and have a syntax highlighting file, I would be pleased to add it. -- Nicolas Bertolissio Sat, 25 Oct 2003 00:13:49 +0200 ddtc-0.17.2/debian/rules0000755000000000000000000000420712657267751011734 0ustar #!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Uncomment this to turn on verbose mode. # export DH_VERBOSE=1 package := ddtc manpages := 1 manpagesrc := 5 languages := fr configure: configure-stamp configure-stamp: dh_testdir touch configure-stamp build-indep: configure-stamp build-stamp build-stamp: dh_testdir set -ex;\ for i in $(manpages); do\ pod2man --section=$$i man/$(package).$$i.pod > man/$(package).$$i;\ for lang in $(languages); do\ if test -e man/$(package).$$lang.$$i.pod; then\ pod2man --section=$$i man/$(package).$$lang.$$i.pod > man/$(package).$$lang.$$i;\ fi\ done \ done;\ for i in $(manpagesrc); do\ pod2man --section=$$i man/$(package)rc.$$i.pod > man/$(package)rc.$$i;\ for lang in $(languages); do\ if test -e man/$(package)rc.$$lang.$$i.pod; then\ pod2man --section=$$i man/$(package)rc.$$lang.$$i.pod > man/$(package)rc.$$lang.$$i;\ fi\ done \ done $(MAKE) -C po all touch build-stamp clean: dh_testdir dh_testroot set -ex; find man -name \*.[1-9] | xargs rm -f; $(MAKE) -C po $@ dh_clean build-stamp configure-stamp install: build-indep dh_testdir dh_testroot dh_prep dh_installdirs set -ex; install -m 0755 $(package) debian/$(package)/usr/bin set -ex; install -m 0644 *.pm debian/$(package)/usr/share/perl5/Ddtc/ $(MAKE) -C po DESTDIR=`pwd`/debian/$(package) install # Build architecture-independent files here. binary-indep: build install dh_testdir dh_testroot # dh_installdebconf dh_installdocs -n misc/* # dh_installexamples # dh_installmenu # dh_installlogrotate # dh_installemacsen # dh_installpam # dh_installmime # dh_installinit # dh_installcron dh_installman man/*.[1-9]; # dh_installinfo # dh_undocumented dh_installchangelogs # dh_link # dh_strip dh_compress dh_fixperms # dh_makeshlibs dh_installdeb # dh_perl # dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb # Build architecture-dependent files here. binary-arch: build install # We have nothing to do by default. binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure build: build-indep build-arch: ddtc-0.17.2/debian/docs0000644000000000000000000000000007633110127011470 0ustar ddtc-0.17.2/debian/control0000644000000000000000000000144712657267543012261 0ustar Source: ddtc Section: text Priority: optional Maintainer: Debian QA Group Build-Depends: debhelper (>> 9), perl, gettext Standards-Version: 3.9.7 Package: ddtc Architecture: all Depends: perl, libmime-tools-perl, libconfig-general-perl, libalgorithm-diff-perl (>= 1.13), libtext-iconv-perl, ${misc:Depends} Conflicts: ddts-script Recommends: liblocale-gettext-perl, libterm-readline-gnu-perl Suggests: acheck Description: Deal with ddts mails ddtc stands for Debian Description Translation Client. It's a Perl script to help both translators and reviewers to deal with ddts mails. It parses mails from the ddts, splits them into individual package files, sends translations, reviews and patches buggy translations. . Supports only package description (pdesc) for the moment. ddtc-0.17.2/debian/copyright0000644000000000000000000000140412657270070012567 0ustar This is ddtc. Copyright (c) 2001-2003 Nicolas Bertolissio This 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, or (at your option) any later version. This 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 General Public License for more details. You should have received a copy of the GNU General Public License with your Debian GNU/Linux system, in /usr/share/common-licenses/GPL. If not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. ddtc-0.17.2/debian/compat0000644000000000000000000000000212657267550012044 0ustar 9 ddtc-0.17.2/debian/dirs0000644000000000000000000000003507633110126011510 0ustar usr/bin usr/share/perl5/Ddtc