# -*- perl -*-
# Lintian::Processable::Fields::Files -- interface to .buildinfo file data collection
#
# Copyright (C) 2010 Adam D. Barratt
# Copyright (C) 2018 Chris Lamb
# Copyright (C) 2019-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::Processable::Fields::Files;
use v5.20;
use warnings;
use utf8;
use Moo::Role;
use namespace::clean;
=head1 NAME
Lintian::Processable::Fields::Files - Lintian interface to .buildinfo or changes file data collection
=head1 SYNOPSIS
use Moo;
with 'Lintian::Processable::Fields::Files';
=head1 DESCRIPTION
Lintian::Processable::Fields::Files provides an interface to data for .buildinfo
and changes files. It implements data collection methods specific to .buildinfo
and changes files.
=head1 INSTANCE METHODS
=over 4
=item files
Returns a reference to a hash containing information about files listed
in the .buildinfo file. Each hash may have the following keys:
=over 4
=item name
Name of the file.
=item size
The size of the file in bytes.
=item section
The archive section to which the file belongs.
=item priority
The priority of the file.
=item checksums
A hash with the keys being checksum algorithms and the values themselves being
hashes containing
=over 4
=item sum
The result of applying the given algorithm to the file.
=item filesize
The size of the file as given in the .buildinfo section relating to the given
checksum.
=back
=back
=cut
has files => (
is => 'rw',
lazy => 1,
default =>
sub {
my ($self) = @_;
my %files;
my @files_lines = split(/\n/, $self->fields->value('Files'));
# trim both ends of each line
s/^\s+|\s+$//g for @files_lines;
for my $line (grep { length } @files_lines) {
my @fields = split(/\s+/, $line);
my $basename = $fields[-1];
# ignore traversals
next
if $basename =~ m{/};
my ($md5sum, $size, $section, $priority) = @fields;
$files{$basename}{checksums}{Md5} = {
'sum' => $md5sum,
'filesize' => $size,
};
$files{$basename}{name} = $basename;
$files{$basename}{size} = $size;
unless ($self->type eq 'source') {
$files{$basename}{section} = $section;
$files{$basename}{priority} = $priority;
}
}
for my $algorithm (qw(Sha1 Sha256)) {
my @lines
= split(/\n/, $self->fields->value("Checksums-$algorithm"));
# trim both ends of each line
s/^\s+|\s+$//g for @lines;
for my $line (grep { length } @lines) {
my ($checksum, $size, $basename) = split(/\s+/, $line);
# ignore traversals
next
if $basename =~ m{/};
$files{$basename}{checksums}{$algorithm} = {
'sum' => $checksum,
'filesize' => $size
};
}
}
return \%files;
}
);
=back
=head1 AUTHOR
Originally written by Adam D. Barratt 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