Subject: [PATCH 02/25] New Lintian::Collect::Changes module

From: Adam D. Barratt <[email-masked]>
Date: Mon, 4 Jan 2010 19:43:58 +0000

---
 lib/Lintian/Collect/Changes.pm |  180 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 180 insertions(+), 0 deletions(-)
 create mode 100755 lib/Lintian/Collect/Changes.pm

diff --git a/lib/Lintian/Collect/Changes.pm b/lib/Lintian/Collect/Changes.pm
new file mode 100755
index 0000000..ffe777b
--- /dev/null
+++ b/lib/Lintian/Collect/Changes.pm
@@ -0,0 +1,180 @@
+# -*- 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 <http://www.gnu.org/licenses/>.
+
+package Lintian::Collect::Changes;
+
+use strict;
+use warnings;
+use base 'Lintian::Collect';
+
+use Util;
+
+# 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, $_);
+	$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, $_);
+	    $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 <[email-masked]> 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 ts=4 et shiftround
-- 
1.6.6