# -*- perl -*- # Lintian::Debian::Control -- object for fields in d/control # Copyright (C) 2008 Russ Allbery # Copyright (C) 2009 Raphael Geissert # Copyright (C) 2020 Felix Lechner # # 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::Debian::Control; use v5.20; use warnings; use utf8; use Path::Tiny; use Syntax::Keyword::Try; use Unicode::UTF8 qw(valid_utf8 decode_utf8 encode_utf8); use Lintian::Deb822; use Lintian::Deb822::Section; use Lintian::Util qw($PKGNAME_REGEX); use Moo; use namespace::clean; =head1 NAME Lintian::Debian::Control - Lintian interface to d/control fields =head1 SYNOPSIS use Lintian::Debian::Control; =head1 DESCRIPTION Lintian::Debian::Control provides access to fields in d/control. =head1 INSTANCE METHODS =over 4 =item item =item source_fields =item installable_fields_by_name =cut has item => (is => 'rw'); has source_fields => ( is => 'rw', default => sub { return Lintian::Deb822::Section->new; }, coerce => sub { my ($blessedref) = @_; return ($blessedref // Lintian::Deb822::Section->new); }, ); has installable_fields_by_name => ( is => 'rw', default => sub { {} }, coerce => sub { my ($hashref) = @_; return ($hashref // {}); }, ); =item load =cut sub load { my ($self, $item) = @_; return unless defined $item; $self->item($item); return unless -r $item->unpacked_path; my $deb822 = Lintian::Deb822->new; my @sections; try { @sections = $deb822->read_file($item->unpacked_path); } catch { # If it is a syntax error, ignore it (we emit # syntax-error-in-control-file in this case via # control-file). die map { encode_utf8($_) } $@ unless $@ =~ /syntax error/; return; } # in theory, one could craft a package in which d/control is empty my $source = shift @sections; $self->source_fields($source); my @named = grep { $_->value('Package') =~ m{\A $PKGNAME_REGEX \Z}x }@sections; my %by_name = map { $_->value('Package') => $_ } @named; $self->installable_fields_by_name(\%by_name); return; } =item installables Returns a list of the binary and udeb packages listed in the F. =cut sub installables { my ($self) = @_; return keys %{$self->installable_fields_by_name}; } =item installable_package_type (NAME) Returns package type based on value of the Package-Type (or if absent, X-Package-Type) field. If the field is omitted, the default value "deb" is used. If NAME is not an installable listed in the source packages F file, this method return C. =cut sub installable_package_type { my ($self, $name) = @_; my $type; my $fields = $self->installable_fields_by_name->{$name}; $type = $fields->value('Package-Type') || $fields->value('XC-Package-Type') if defined $fields; $type ||= 'deb'; return lc $type; } =item installable_fields (PACKAGE) Returns the Deb822::Section object for the installable. Returns an empty object if the installable does not exist. =cut sub installable_fields { my ($self, $package) = @_; my $per_package; $per_package = $self->installable_fields_by_name->{$package} if length $package; return ($per_package // Lintian::Deb822::Section->new); } =back =head1 AUTHOR Originally written by Russ Allbery for Lintian. Amended by Felix Lechner for Lintian. =head1 SEE ALSO lintian(1) =cut 1; # Local Variables: # indent-tabs-mode: nil # cperl-indent-level: 4 # End: # vim: syntax=perl sw=4 sts=4 sr et