Added lots more modules from lintian. Maemian appears to work.
[maemian] / checks / watch-file
diff --git a/checks/watch-file b/checks/watch-file
new file mode 100644 (file)
index 0000000..6c21225
--- /dev/null
@@ -0,0 +1,176 @@
+# watch-file -- lintian check script -*- perl -*-
+#
+# Copyright (C) 2008 Patrick Schoenfeld
+# Copyright (C) 2008 Russ Allbery
+# Copyright (C) 2008 Raphael Geissert
+#
+# 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::watch_file;
+use strict;
+
+use Maemian::Collect;
+use Tags;
+
+sub run {
+
+my $pkg = shift;
+my $type = shift;
+my $info = shift;
+
+if (! -f "debfiles/watch") {
+    tag 'debian-watch-file-is-missing' unless ($info->native);
+    return;
+}
+
+# Perform the other checks even if it is a native package
+tag 'debian-watch-file-in-native-package' if ($info->native);
+
+# Check if the Debian version contains anything that resembles a repackaged
+# source package sign, for fine grained version mangling check
+my $version = $info->field('version');
+my $repack;
+if ($version =~ /(dfsg|debian|ds)/) {
+    $repack = $1;
+}
+
+# Gather information from the watch file and look for problems we can
+# diagnose on the first time through.
+open(WATCH, '<', 'debfiles/watch') or fail("cannot open watch file: $!");
+local $_;
+my ($watchver, $mangle, $dmangle, $nonempty, %dversions);
+while (<WATCH>) {
+    next if /^\s*\#/;
+    next if /^\s*$/;
+    s/^\s*//;
+
+  CHOMP:
+    chomp;
+    if (s/(?<!\\)\\$//) {
+        # This is caught by uscan.
+        last if eof(WATCH);
+        $_ .= <WATCH>;
+        goto CHOMP;
+    }
+
+    if (/^version\s*=\s*(\d+)(\s|\Z)/) {
+        if (defined $watchver) {
+            tag 'debian-watch-file-declares-multiple-versions', "line $.";
+        }
+        $watchver = $1;
+        if ($watchver ne '2' and $watchver ne '3') {
+            tag 'debian-watch-file-unknown-version', $watchver;
+        }
+    } else {
+        $nonempty = 1;
+
+        unless (defined($watchver)) {
+            tag 'debian-watch-file-missing-version';
+            $watchver = 1;
+        }
+        # Version 1 watch files are too broken to try checking them.
+        next if ($watchver == 1);
+
+        my ($opts, @opts);
+        if (s/^opt(?:ion)?s=\"([^\"]+)\"\s+// || s/^opt(?:ion)?s=(\S+)\s+//) {
+            $opts = $1;
+            @opts = split(',', $opts);
+            if (defined $repack) {
+                for (@opts) {
+                    $mangle = 1 if /^[ud]?versionmangle\s*=.*($repack)/;
+                    $dmangle = 1 if /^dversionmangle\s*=.*($repack)/;
+                }
+            }
+        }
+        if (m%qa\.debian\.org/watch/sf\.php\?%) {
+            tag 'debian-watch-file-uses-deprecated-sf-redirector-method',
+                "line $.";
+        }
+
+        if (m%(https?|ftp)://((.+\.)?dl|(pr)?downloads?|ftp\d?|upload)\.(sourceforge|sf)\.net%
+            or m%https?://(www\.)?(sourceforge|sf)\.net/project/showfiles\.php%
+            or m%https?://(www\.)?(sourceforge|sf)\.net/projects/.+/files%) {
+            tag 'debian-watch-file-should-use-sf-redirector', "line $.";
+        }
+
+        # This bit is as-is from uscan.pl:
+        my ($base, $filepattern, $lastversion, $action) = split ' ', $_, 4;
+        if ($base =~ s%/([^/]*\([^/]*\)[^/]*)$%/%) {
+            # Last component of $base has a pair of parentheses, so no
+            # separate filepattern field; we remove the filepattern from the
+            # end of $base and rescan the rest of the line
+            $filepattern = $1;
+            (undef, $lastversion, $action) = split ' ', $_, 3;
+        }
+        push @{$dversions{$lastversion}}, $. if (defined($lastversion));
+    }
+}
+close WATCH;
+
+# If the version of the package contains dfsg, assume that it needs to be
+# mangled to get reasonable matches with upstream.
+if ($nonempty and $repack and not $mangle) {
+    tag 'debian-watch-file-should-mangle-version';
+}
+
+if ($repack and $mangle and not $dmangle) {
+    tag 'debian-watch-file-should-dversionmangle-not-uversionmangle';
+}
+
+my $changes = $info->changelog;
+if (defined $changes and %dversions) {
+    my $data = $changes->data;
+    my %changelog_versions;
+    my $count = 1;
+    for my $entry (@{$data}) {
+        my $uversion = $entry->Version;
+        $uversion =~ s/-[^-]+$//; # revision
+        $uversion =~ s/^\d+://; # epoch
+        $changelog_versions{'orig'}{$entry->Version} = $count;
+
+        # Preserve the first value here to correctly detect old versions.
+        $changelog_versions{'mangled'}{$uversion} = $count
+            unless (exists($changelog_versions{'mangled'}{$uversion}));
+        $count++;
+    }
+
+    while (my ($dversion, $lines) = each %dversions) {
+        next if (!defined($dversion) || $dversion eq 'debian');
+        local $" = ', ';
+        if (!$info->native && exists($changelog_versions{'orig'}{$dversion})) {
+            tag 'debian-watch-file-specifies-wrong-upstream-version',
+                "$dversion: @{$lines}";
+            next;
+        }
+        if (exists($changelog_versions{'mangled'}{$dversion})
+            && $changelog_versions{'mangled'}{$dversion} != 1) {
+            tag 'debian-watch-file-specifies-old-upstream-version',
+                "$dversion: @{$lines}";
+            next;
+        }
+    }
+}
+
+}
+
+1;
+
+# Local Variables:
+# indent-tabs-mode: nil
+# cperl-indent-level: 4
+# End:
+# vim: syntax=perl sw=4 sts=4 ts=4 et shiftround