Bastien Roucariès:
> This is an automated email from the git hooks/post-receive script.
> 
> rouca pushed a commit to branch master
> in repository lintian.
> 
> commit f71f3901fcc23db666d3de176526e91fd4f228a2
> Author: Bastien ROUCARIÈS <roucaries.bastien+deb...@gmail.com>
> Date:   Fri Aug 25 22:22:39 2017 +0200
> 
>     Use Lintian::Data for section/name mapping


Hi,

This change causes a regression that need to be fixed (or the commit
reverted)

The problem being that @NAME_SECTION_MAPPINGS is an /ordered/ list with
a "first match and we are done"-rule.  When migrated to L::Data, this
order is lost because L::Data does not have an order guarantee.

Therefore, when multiple rules match (see [1] for an example), the
previous code would give a well-defined result (first rule listed)
whereas the new code gives a non-deterministic result.

Thanks,
~Niels

[1]

libfoo-ocaml-dev matches the following two rules

    [qr/^lib.*-(?:ocaml|camlp4)-dev$/ => 'ocaml'],
    [qr/^lib.*-dev$/                  => 'libdevel'],

> ---
>  checks/fields.pm                  | 34 +++++++++++++---------------------
>  data/fields/name_section_mappings | 16 ++++++++++++++++
>  debian/changelog                  |  1 +
>  3 files changed, 30 insertions(+), 21 deletions(-)
> 
> diff --git a/checks/fields.pm b/checks/fields.pm
> index cb91491..4ad96ad 100644
> --- a/checks/fields.pm
> +++ b/checks/fields.pm
> @@ -96,23 +96,14 @@ our @known_java_pkg = map { qr/$_/ } (
>  );
>  
>  # Mapping of package names to section names
> -my @NAME_SECTION_MAPPINGS = (
> -    [qr/-docs?$/                      => 'doc'],
> -    [qr/-dbg(?:sym)?$/                => 'debug'],
> -    [qr/^(?:python-)?zope/            => 'zope'],
> -    [qr/^python3?-/                   => 'python'],
> -    [qr/^r-(?:cran|bioc|other)-/      => 'gnu-r'],
> -    [qr/^lib.*-perl$/                 => 'perl'],
> -    [qr/^lib.*-cil(?:-dev)?$/         => 'cli-mono'],
> -    [qr/^lib.*-(?:java|gcj)$/         => 'java'],
> -    [qr/^(?:lib)php-/                 => 'php'],
> -    [qr/^lib(?:hugs|ghc6?)-/          => 'haskell'],
> -    [qr/^lib.*-ruby(?:1\.\d)?$/       => 'ruby'],
> -    [qr/^lib.*-(?:ocaml|camlp4)-dev$/ => 'ocaml'],
> -    [qr/^lib.*-dev$/                  => 'libdevel'],
> -    [qr/^gir\d+\.\d+-.*-\d+\.\d+$/    => 'introspection'],
> -    [qr/^libjs-/                      => 'javascript'],
> -);
> +my $NAME_SECTION_MAPPINGS = Lintian::Data->new(
> +    'fields/name_section_mappings',
> +    qr/\s*=>\s*/,
> +    sub {
> +        my $regex = qr/$_[0]/x;
> +        $_[0] = $_[1];
> +        return $regex;
> +    });
>  
>  my %VCS_EXTRACT = (
>      browser => sub { return @_;},
> @@ -547,14 +538,15 @@ sub run {
>              # Check package name <-> section.  oldlibs is a special case; let
>              # anything go there.
>              if ($parts[-1] ne 'oldlibs') {
> -                foreach my $map (@NAME_SECTION_MAPPINGS) {
> -                    next unless ($pkg =~ $map->[0]);
> +                foreach my $section ($NAME_SECTION_MAPPINGS->all()) {
> +                    my $regex = $NAME_SECTION_MAPPINGS->value($section);
> +                    next unless ($pkg =~ m{$regex});
>  
>                      my $area = '';
>                      $area = "$parts[0]/" if (scalar @parts == 2);
>                      tag 'wrong-section-according-to-package-name',
> -                      "$pkg => ${area}$map->[1]"
> -                      unless $parts[-1] eq $map->[1];
> +                      "$pkg => ${area}$section"
> +                      unless $parts[-1] eq $section;
>                      last;
>                  }
>              }
> diff --git a/data/fields/name_section_mappings 
> b/data/fields/name_section_mappings
> new file mode 100644
> index 0000000..ca9c1de
> --- /dev/null
> +++ b/data/fields/name_section_mappings
> @@ -0,0 +1,16 @@
> +# map between regex (x) of package => section
> +-docs?$                      => doc
> +-dbg(?:sym)?$                => debug
> +^(?:python-)?zope            => zope
> +^python3?-                   => python
> +^r-(?:cran|bioc|other)-      => gnu-r
> +^lib.*-perl$                 => perl
> +lib.*-cil(?:-dev)?$          => cli-mono
> +^lib.*-(?:java|gcj)$         => java
> +^(?:lib)php-                 => php
> +^lib(?:hugs|ghc6?)-          => haskell
> +^lib.*-ruby(?:1\.\d)?$       => ruby
> +^lib.*-(?:ocaml|camlp4)-dev$ => ocaml
> +^lib.*-dev$                  => libdevel
> +^gir\d+\.\d+-.*-\d+\.\d+$    => introspection
> +^libjs-                      => javascript
> \ No newline at end of file
> diff --git a/debian/changelog b/debian/changelog
> index e7cbe8d..af300a8 100644
> --- a/debian/changelog
> +++ b/debian/changelog
> @@ -43,6 +43,7 @@ lintian (2.5.53) UNRELEASED; urgency=medium
>      + [CL] Ensure that python3-foo packages have "Section: python", not
>        just python2-foo.  (Closes: #870272)
>      + [RG] Do no longer require debug packages to be priority extra.
> +    + [BR] Use Lintian::Data for name/section mapping
>    * checks/files.pm:
>      + [BR] Avoid false positive privacy-breach-generic for legal.xml.
>    * checks/init.d.desc:
> 

Reply via email to