# -*- perl -*-
# Lintian::Collect::Changes -- interface to .changes file data collection
# Copyright (C) 2010 Adam D. Barratt
#
# 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::Collect::Changes;
use strict;
use warnings;
use base 'Lintian::Collect';
# Initialize a new .changes file collect object. Takes the package name,
# which is currently unused.
sub new {
my ($class, $pkg) = @_;
my $self = {};
bless($self, $class);
return $self;
}
# Returns information about the files referenced in the .changes file.
# sub files Needs-Info <>
sub files {
my ($self) = @_;
return $self->{files} if exists $self->{files};
my %files;
my $file_list = $self->field('files') || '';
for (split /\n/, $file_list) {
chomp;
s/^\s+//o;
next if $_ eq '';
my ($md5sum,$size,$section,$priority,$file) = split(/\s+/o, $_);
next if $file =~ m,/,;
$files{$file}{checksums}{md5} = {
'sum' => $md5sum, 'filesize' => $size,
};
$files{$file}{name} = $file;
$files{$file}{size} = $size;
$files{$file}{section} = $section;
$files{$file}{priority} = $priority;
}
foreach my $alg (qw(sha1 sha256)) {
my $list = $self->field("checksums-$alg") || '';
for (split /\n/, $list) {
chomp;
s/^\s+//o;
next if $_ eq '';
my ($checksum, $size, $file) = split(/\s+/o, $_);
next if $file =~ m,/,;
$files{$file}{checksums}{$alg} = {
'sum' => $checksum, 'filesize' => $size
};
}
}
$self->{files} = \%files;
return $self->{files};
}
=head1 NAME
Lintian::Collect::Changes - Lintian interface to .changes file data collection
=head1 SYNOPSIS
my ($name, $type) = ('foobar_1.2_i386.changes', 'changes');
my $collect = Lintian::Collect->new($name, $type);
my $files = $collect->files();
foreach my $file (keys %{$files}) {
my $size = $files->{$file}->{size};
print "File $file has size $size\n";
}
=head1 DESCRIPTION
Lintian::Collect::Changes provides an interface to data for .changes
files. It implements data collection methods specific to .changes
files.
=head1 CLASS METHODS
=over 4
=item new(PACKAGE)
Creates a new Lintian::Collect::Changes object. Currently, PACKAGE is
ignored. Normally, this method should not be called directly, only via
the Lintian::Collect constructor.
=back
=head1 INSTANCE METHODS
In addition to the instance methods listed below, all instance methods
documented in the Lintian::Collect module are also available.
=over 4
=item files()
Returns a reference to a hash containing information about files listed
in the .changes 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 .changes section relating to the given
checksum.
=back
=back
=back
=head1 AUTHOR
Originally written by Adam D. Barratt for Lintian.
=head1 SEE ALSO
lintian(1), Lintian::Collect(3)
=cut
1;
# Local Variables:
# indent-tabs-mode: nil
# cperl-indent-level: 4
# End:
# vim: syntax=perl sw=4 sts=4 sr et