Added lots more modules from lintian. Maemian appears to work.
[maemian] / checks / po-debconf
diff --git a/checks/po-debconf b/checks/po-debconf
new file mode 100644 (file)
index 0000000..56c80fb
--- /dev/null
@@ -0,0 +1,177 @@
+# po-debconf -- lintian check script -*- perl -*-
+
+# Copyright (C) 2002-2004 by Denis Barbier <barbier@linuxfr.org>
+#
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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
+# along with this program.  If not, you can find it on the World Wide
+# Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+package Maemian::po_debconf;
+use strict;
+use Tags;
+use Util;
+
+sub run {
+
+my $pkg = shift;
+my $type = shift;
+
+my $full_translation = 0;
+
+# First, check wether this package seems to use debconf but not po-debconf.
+# Read the templates file and look at the template names it provides, since
+# some shared templates aren't translated.
+opendir(DEB, 'debfiles')
+       or fail("Can't open debfiles directory.");
+my $has_template = my $has_depends = my $has_config = 0;
+my @lang_templates;
+for my $file (readdir(DEB)) {
+       next if -d "debfiles/$file";
+       if ($file =~ m/^(.+\.)?templates(\..+)?$/) {
+               if ($file =~ m/templates\.\w\w(_\w\w)?$/) {
+                       push (@lang_templates, $file);
+               } else {
+                       open(PO, '<', "debfiles/$file")
+                               or fail("Can't open debfiles/$file file.");
+                       while (<PO>) {
+                               tag "translated-default-field", "$file: $."
+                                       if (m/^_Default(Choice)?: [^\[]*$/);
+                               if (/^Template: (\S+)/i) {
+                                       my $template = $1;
+                                       next if $template =~ m,^shared/packages-(wordlist|ispell)$,;
+                                       next if $template =~ m,/languages$,;
+                                       $has_template = 1;
+                               }
+                       }
+                       close PO;
+               }
+       }
+}
+closedir(DEB);
+
+#TODO: check whether all templates are named in TEMPLATES.pot
+if ( $has_template ) {
+    if ( ! -d "debfiles/po" ) {
+       tag "not-using-po-debconf", "";
+       return 0;
+    }
+} else {
+    return 0;
+}
+
+# If we got here, we're using po-debconf, so there shouldn't be any stray
+# language templates left over from debconf-mergetemplate.
+for (@lang_templates) {
+    tag "stray-translated-debconf-templates", $_ unless /templates\.in$/;
+}
+
+# yada builds its template and po/POTFILES.in dynamically at build time, so
+# excuse yada from some of these checks (including the out of date templates
+# check).
+my $missing_files = 0;
+my $yada = 0;
+if (open (RULES, '<', 'debfiles/rules')) {
+    local $_;
+    while (<RULES>) {
+       if (m%^\t\s*(?:perl debian/)?yada\s%) {
+           $yada = 1;
+           $missing_files = 1;
+       }
+    }
+}
+
+if (!$yada && -f "debfiles/po/POTFILES.in") {
+       open(POTFILES, '<', "debfiles/po/POTFILES.in")
+               or fail("Can't open debfiles/po/POTFILES.in.");
+       while (<POTFILES>) {
+               chomp;
+               s/.*\]\s*//;
+               #  Cannot check files which are not under debian/
+               next if m,^\.\./, or $_ eq '';
+               unless (-f "debfiles/$_") {
+                       tag "missing-file-from-potfiles-in", "$_";
+                       $missing_files = 1;
+               } 
+       }
+       close(POTFILES);
+} elsif (!$yada) {
+       tag "missing-potfiles-in", "";
+       $missing_files = 1;
+}
+if (! -f "debfiles/po/templates.pot") {
+       tag "missing-templates-pot", "";
+       $missing_files = 1;
+}
+
+if (-x "/usr/bin/msgcmp" && -x "/usr/share/intltool-debian/intltool-update" ) {
+       if ($missing_files == 0) {
+               $ENV{"INTLTOOL_EXTRACT"} ||= "/usr/share/intltool-debian/intltool-extract";
+               system_env("cd debfiles/po && /usr/share/intltool-debian/intltool-update --gettext-package=test --pot");
+               system_env("/usr/bin/msgcmp --use-untranslated debfiles/po/test.pot debfiles/po/templates.pot >/dev/null 2>&1"
+                           . "&& /usr/bin/msgcmp --use-untranslated debfiles/po/templates.pot debfiles/po/test.pot >/dev/null 2>&1") == 0
+                       or tag "newer-debconf-templates";
+       }
+} else {
+       fail("either msgcmp or intltool-update not found");
+}
+
+if (! -x "/usr/bin/msgfmt" ) {
+       fail("msgfmt not found");
+}
+opendir(DEBIAN, 'debfiles/po')
+        or fail("Can't open debfiles/po directory.");
+while (defined(my $file=readdir(DEBIAN))) {
+        next unless $file =~ m/\.po$/;
+        tag "misnamed-po-file", "debian/po/$file"
+                unless ($file =~ /^[a-z]{2,3}(_[A-Z]{2})?\.po$/);
+        local ($/) = "\n\n";
+        $_ = '';
+        open(PO, '<', "debfiles/po/$file")
+                or fail("Can't open debfiles/po/$file file.");
+        while (<PO>) {
+                last if m/^msgstr/m;
+        }
+        close(PO);
+       unless ($_) {
+               tag "invalid-po-file", "debian/po/$file";
+               next;
+       }
+        s/"\n"//g;
+        my $charset = '';
+        if (m/charset=(.*?)\\n/) {
+                $charset = ($1 eq 'CHARSET' ? '' : $1);
+        }
+        tag "unknown-encoding-in-po-file", "debian/po/$file"
+                unless length($charset);
+       system_env("msgfmt -o /dev/null debfiles/po/$file 2>/dev/null") == 0
+               or tag "invalid-po-file", "debian/po/$file";
+
+       my $stats = `LANG=C msgfmt -o /dev/null --statistics debfiles/po/$file 2>&1`;
+       if (!$full_translation && $stats =~ m/^\w+ \w+ \w+\.$/) {
+               $full_translation = 1;
+       }
+}
+
+tag "no-complete-debconf-translation", "" if !$full_translation;
+
+}
+
+1;
+
+# Local Variables:
+# indent-tabs-mode: t
+# cperl-indent-level: 8
+# End:
+# vim: syntax=perl