Package: lintian
Version: 1.23.22
Severity: wishlist
Tags: patch

Hello!

The attached new version-substvars check checks the usage of the
${Source-Version}, ${source:Version}, and ${binary:Version} substvars in
the Depends field, and warns when it causes un-binNMUability of the
package.

Note that one of the tags is marked as error instead of warning. This is
because the maintainer has introduced a regression while moving from
${Source-Version} to the new vars, using source:Version instead of
binary:Version (for example, xulrunner_1.8.0.4-1).

Thanks.

lintian (1.23.23) unstable; urgency=low

  * checks/version-substvars: new check to warn about usage of the
    ${Source-Version}, ${source:Version} and ${binary:Version} substvars
    that results in the package not being safely binNMUable.

-- 
Adeodato Simó                                     dato at net.com.org.es
Debian Developer                                  adeodato at debian.org
 
                            Listening to: Maximilian Hecker - My Friends
# version-substvars -- lintian check script
#
# Copyright (C) 2006 Adeodato Simó
# 
# 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.

# SUMMARY
# =======
#
# What breaks
# -----------
# 
# (b1) any -> any (= ${source:Version})          -> use b:V
# (b2) any -> all (= ${Source-Version}) [or b:V] -> use s:V
# (b3) all -> any (= ${either-of-them})          -> use (>= ${s:V}), optionally 
(<< ${s:V}.1~)


package Lintian::version_substvars;
use strict;

use Util;
use Tags;

sub run {

my $pkg = shift;
my $type = shift;

my @control_data = read_dpkg_control("debfiles/control");

shift @control_data; # skip source info entry

foreach (@control_data) {
        my ($pkg1, $pkg1_is_any, $pkg2, $pkg2_is_any, $substvar_strips_binNMU);

    $pkg1 = $_->{'package'};
        $pkg1_is_any = ($_->{'architecture'} ne 'all');

        foreach (split /,/, ($_->{'depends'} || "")) {
                next unless 
m/(\S+)\s*\(\s*=\s*\${((?:Source-|source:|binary:)Version)}/x;

                $pkg2 = $1;
                $substvar_strips_binNMU = ($2 eq 'source:Version');
                $pkg2_is_any = (slurp_entire_file("control/$pkg2/architecture") 
!~ m/^all$/);

                if ($pkg1_is_any) {
                        if ($pkg2_is_any and $substvar_strips_binNMU) {
                                # (b1) any -> any (= ${source:Version})
                                tag "not-binnmuable-any-depends-any", "$pkg1 -> 
$pkg2";
                        } elsif (not $pkg2_is_any and not 
$substvar_strips_binNMU) {
                                # (b2) any -> all (= ${Source-Version}) [or b:V]
                                tag "not-binnmuable-any-depends-all", "$pkg1 -> 
$pkg2";
                        }
                } elsif ($pkg2_is_any) {
                        # (b3) all -> any (= ${either-of-them})
                        tag "not-binnmuable-all-depends-any", "$pkg1 -> $pkg2";
                }

                # TODO (post-Etch?): warn/error about ${Source-Version} being 
deprecated
        }
}

}

1;

# vim: syntax=perl sw=4 ts=4 noet shiftround
Check-Script: version-substvars
Author: Adeodato Simó <[EMAIL PROTECTED]>
Abbrev: v-s
Standards-Version: 3.7.2
Type: source
Unpack-Level: 1
Needs-Info: debfiles, source-control-file
Info: This script checks for correct use of the various *Version
 substvars, e.g. deprecated substvars, or usage that can cause
 un-binNMUability

Tag: not-binnmuable-any-depends-any
Type: error
Info: The package is not safely binNMUable because an arch:any package
 depends on another arch:any package with a (= ${source:Version})
 relationship. Please use (= ${binary:Version}) instead.

Tag: not-binnmuable-any-depends-all
Type: warning
Info: The package is not safely binNMUable because an arch:any package
 depends on an arch:all package with a (= ${Source-Version}) or
 (= ${binary:Version}) relationship. Please use (= ${source:Version})
 instead.

Tag: not-binnmuable-all-depends-any
Type: warning
Info: The package is not safely binNMUable because an arch:all package
 depends on an arch:any package with a strict (= ${Source-Version}), or
 similar, relationship.
 .
 It is not possible for arch:all packages to depend so strictly on
 arch:any packages while having the package binNMUable, so please use
 one of these, whichever is more appropriate:
 .
   Depends: arch_any (>= ${source:Version})
   Depends: arch_any (>= ${source:Version}), arch_any (<< ${source:Version}.1~)

Reply via email to