#!/usr/bin/perl -w # This script checks if the translations of the documents are up to date. # When called with "-d" option, it also prints what has changed in the # original since last translation. # If the "-r" option is used with the "-d" option, the diff will be taken # against the revision number specified with the -r option instead of # the latest revision of the English original. # When called with "-s" option, it also shows all files that are marked # untranslated. # SYNOPSIS: # ./doc-check [-d] [-r ] [-s] [-v] [-V] [lang] # # (uses $lang set below if lang is not given on commandline) use Getopt::Std; use File::Find; $opt_d = $opt_r = $opt_s = $opt_v = $opt_V = 0; getopts('r:dsvV'); # You may set this to your default language code $lang = shift || "pl"; if ($opt_r and $opt_r !~ /[0-9]+/) { warn "Please enter a revision number for parameter -r.\n"; exit 1 } sub checkdiff { my ($plfname, $enfname) = (@_); my ($plrev, $enrev, $untrans) = getrev($plfname, $enfname); $plrev and $enrev or return; if ( "$plrev" ne "$enrev" ) { if ($opt_d and $opt_r and $opt_r < $enrev) { $enrev = $opt_r; } if ($untrans) { print "$enfname : $plrev -> $enrev (untranslated)\n"; } else { print "$enfname : $plrev -> $enrev\n"; } if ($opt_d) { my $s = "svn diff -r $plrev:$enrev $enfname"; warn "running $s:\n" if ($opt_V); system($s); } } else { if ($untrans && $opt_s) { print "$plfname: untranslated\n"; } } } sub getrev { my ($plfname, $enfname) = (@_); my ($plrev, $enrev, $untrans, $notconverted) = (0, 0, 0, 0); warn "checking $plfname:\n" if $opt_v; open FILE, $plfname or warn "$plfname: $!\n" and return; while () { if (//) { $plrev = $1; last; } if (//) { $plrev = $1; $untrans = 1; last; } # Also check for revision comments of original documents if (//) { $plrev = $1; last; } } warn "checking $enfname:\n" if $opt_v; open FILE, $enfname or warn "$enfname: $!\n" and return; while () { if (/\$Id: \S+ (\d+) /) { $enrev = $1; last; } # Also support CVS style revision comments (depreciated) if (/\$Revision: (\d+) \$/) { $enrev = $1; last; } } close FILE; warn "failed to find revision for $plfname\n" unless $plrev; warn "failed to find revision for $enfname\n" unless $enrev; if ($notconverted) { warn "$plfname: contains revision comment for original document\n"; warn " use 'rev-update' to convert\n"; } return ($plrev, $enrev, $untrans); } sub process { my $enfname = $File::Find::name; return unless $enfname =~ m/\.xml$/; my $plfname = $enfname; $plfname =~ s,^en/,$lang/,; checkdiff($plfname, $enfname); } sub process_obsolete { my $plfname = $File::Find::name; return unless $plfname =~ m/\.xml$/; my $enfname = $plfname; $enfname =~ s,^$lang/,en/,; open FILE, $enfname or warn "$plfname: Probably obsoleted\n" and return; close FILE; } warn "\nChecking for outdated or missing translations...\n" if $opt_v; File::Find::find({ wanted => \&process, no_chdir => 1 }, 'en'); warn "\nChecking for obsoleted translations...\n" if $opt_v; File::Find::find({ wanted => \&process_obsolete, no_chdir => 1 }, $lang); #checkdiff("build/install.$lang.xml", "build/install.en.xml"); #checkdiff("release-notes.$lang.sgml","release-notes.sgml"); #checkdiff("index.$lang.html.m4","index.en.html.m4"); #checkdiff("dselect-beginner.$lang.sgml","dselect-beginner.sgml"); warn "All done.\n" if $opt_v;