# -*- perl -*- # Lintian::Tag::Override -- Interface to Lintian overrides # Copyright (C) 2011 Niels Thykier # # 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, see . package Lintian::Tag::Override; use strict; use warnings; use base qw(Class::Accessor); =head1 NAME Lintian::Tag::Override -- Representation of an Lintian Override =head1 SYNOPSIS use Lintian::Tag::Override; my $data = { 'comments' => ['some', 'multi-line', 'comments'] }; my $override = Lintian::Tag::Override->new('unused-override', $data); my $comments = $override->comments; if ($override->overrides("some extra") ) { # do something } =head1 DESCRIPTION Represents and encalsulates a Lintian Override. =head1 METHODS =over 4 =item Lintian::Tag::Override->new($tag, $data) Creates a new override for $tag. $data should be a hashref with the following fields. =over 4 =item arch Architectures this override applies too (not really used). =item comments A list of comments (each item is a separate line) =item extra The extra part of the override. If it contains a "*" is will considered a pattern. =back =cut sub new { my ($type, $tag, $data) = @_; $data = {} unless defined $data; my $self = { 'arch' => $data->{'arch'}, 'comments' => $data->{'comments'}, 'extra' => $data->{'extra'}//'', 'tag' => $tag, }; $self->{'arch'} = 'any' unless $self->{'arch'}; bless $self, $type; $self->_init(); return $self; } =item $override->tag Returns the name of the tag. =item $override->arch Returns the architecture this tag applies to. =item $override->comments Returns a list of lines that makes up the comments for this override. Do not modify the contents of this list. =item $override->extra Returns the extra of this tag (or the empty string, if there is no extra). =item $override->is_pattern Returns a truth value if the extra is a pattern. =cut Lintian::Tag::Override->mk_ro_accessors (qw(tag arch comments extra is_pattern)); =item $override->overrides($extra) Returns a truth value if this override applies to this extra. =cut sub overrides { my ($self, $textra) = @_; my $extra = $self->{'extra'}//''; # No extra => applies to all tags return 1 unless $extra; return 1 if $extra eq $textra; if ($self->{'is_pattern'}) { my $pat = $self->{'pattern'}; if ($textra =~ m/^$pat\z/){ return 1; } } return 0; } # Internal initialization method sub _init { my ($self) = @_; my $extra = $self->{'extra'}; if ($extra && $extra =~ m/\*/o) { # It is a pattern, pre-compute it my $pattern = $extra; my $end = ''; # Trailing "match anything" (if any) my $pat = ''; # The rest of the pattern # Split does not help us if $pattern ends with * # so we deal with that now if ($pattern =~ s/\Q*\E+\z//o){ $end = '.*'; } # Are there any * left (after the above)? if ($pattern =~ m/\Q*\E/o) { # this works even if $text starts with a *, since # that is split as '', my @pargs = split(m/\Q*\E++/o, $pattern); $pat = join('.*', map { quotemeta($_) } @pargs); } else { $pat = $pattern; } $self->{'is_pattern'} = 1; $self->{'pattern'} = qr/$pat$end/; } else { $self->{'is_pattern'} = 0; } } =back =head1 AUTHOR Originally written by Niels Thykier for Lintian. =head1 SEE ALSO lintian(1) L =cut 1; # Local Variables: # indent-tabs-mode: nil # cperl-indent-level: 4 # End: # vim: syntax=perl sw=4 sts=4 sr et