X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=checks%2Fwatch-file;fp=checks%2Fwatch-file;h=6c21225096d4e42c1cd15761468cf4d0f56e6052;hb=1960326d487467271f731ff6a62830404a4947af;hp=0000000000000000000000000000000000000000;hpb=ce31209d7230201c69f8f234032a774fbbbc43cd;p=maemian diff --git a/checks/watch-file b/checks/watch-file new file mode 100644 index 0000000..6c21225 --- /dev/null +++ b/checks/watch-file @@ -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 () { + next if /^\s*\#/; + next if /^\s*$/; + s/^\s*//; + + CHOMP: + chomp; + if (s/(?; + 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