blob: d7ec187a1975b4e5f570f5e267b1ae0c7be8af48 [file] [log] [blame]
# Copyright © 2007-2010 Raphaël Hertzog <hertzog@debian.org>
#
# 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 Dpkg::Control::Info;
use strict;
use warnings;
our $VERSION = "1.00";
use Dpkg::Control;
use Dpkg::ErrorHandling;
use Dpkg::Gettext;
use base qw(Dpkg::Interface::Storable);
use overload
'@{}' => sub { return [ $_[0]->{source}, @{$_[0]->{packages}} ] };
=encoding utf8
=head1 NAME
Dpkg::Control::Info - parse files like debian/control
=head1 DESCRIPTION
It provides an object to access data of files that follow the same
syntax than debian/control.
=head1 FUNCTIONS
=over 4
=item $c = Dpkg::Control::Info->new($file)
Create a new Dpkg::Control::Info object for $file. If $file is omitted, it
loads debian/control. If file is "-", it parses the standard input.
=cut
sub new {
my ($this, $arg) = @_;
my $class = ref($this) || $this;
my $self = {
'source' => undef,
'packages' => [],
};
bless $self, $class;
if ($arg) {
$self->load($arg);
} else {
$self->load("debian/control");
}
return $self;
}
=item $c->reset()
Resets what got read.
=cut
sub reset {
my $self = shift;
$self->{source} = undef;
$self->{packages} = [];
}
=item $c->load($file)
Load the content of $file. Exits in case of errors. If file is "-", it
loads from the standard input.
=item $c->parse($fh, $description)
Parse a control file from the given filehandle. Exits in case of errors.
$description is used to describe the filehandle, ideally it's a filename
or a description of where the data comes from. It's used in error
messages.
=cut
sub parse {
my ($self, $fh, $desc) = @_;
$self->reset();
my $cdata = Dpkg::Control->new(type => CTRL_INFO_SRC);
return if not $cdata->parse($fh, $desc);
$self->{source} = $cdata;
unless (exists $cdata->{Source}) {
syntaxerr($desc, _g("first block lacks a source field"));
}
while (1) {
$cdata = Dpkg::Control->new(type => CTRL_INFO_PKG);
last if not $cdata->parse($fh, $desc);
push @{$self->{packages}}, $cdata;
unless (exists $cdata->{Package}) {
syntaxerr($desc, _g("block lacks the '%s' field"), "Package");
}
unless (exists $cdata->{Architecture}) {
syntaxerr($desc, _g("block lacks the '%s' field"), "Architecture");
}
}
}
=item $c->[0]
=item $c->get_source()
Returns a Dpkg::Control object containing the fields concerning the
source package.
=cut
sub get_source {
my $self = shift;
return $self->{source};
}
=item $c->get_pkg_by_idx($idx)
Returns a Dpkg::Control object containing the fields concerning the binary
package numbered $idx (starting at 1).
=cut
sub get_pkg_by_idx {
my ($self, $idx) = @_;
return $self->{packages}[--$idx];
}
=item $c->get_pkg_by_name($name)
Returns a Dpkg::Control object containing the fields concerning the binary
package named $name.
=cut
sub get_pkg_by_name {
my ($self, $name) = @_;
foreach my $pkg (@{$self->{packages}}) {
return $pkg if ($pkg->{Package} eq $name);
}
return undef;
}
=item $c->get_packages()
Returns a list containing the Dpkg::Control objects for all binary packages.
=cut
sub get_packages {
my $self = shift;
return @{$self->{packages}};
}
=item $c->output($filehandle)
Dump the content into a filehandle.
=cut
sub output {
my ($self, $fh) = @_;
my $str;
$str .= $self->{source}->output($fh);
foreach my $pkg (@{$self->{packages}}) {
print $fh "\n";
$str .= "\n" . $pkg->output($fh);
}
return $str;
}
=item "$c"
Return a string representation of the content.
=item @{$c}
Return a list of Dpkg::Control objects, the first one is corresponding to
source information and the following ones are the binary packages
information.
=back
=head1 AUTHOR
Raphaël Hertzog <hertzog@debian.org>.
=cut
1;