File Coverage

File:Dpkg/Control.pm
Coverage:75.7%

linestmtbrancondsubpodtimecode
1# Copyright © 2007-2009 Raphaël Hertzog <hertzog@debian.org>
2#
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 2 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <https://www.gnu.org/licenses/>.
15
16=encoding utf8
17
18 - 137
=head1 NAME

Dpkg::Control - parse and manipulate official control-like information

=head1 DESCRIPTION

The Dpkg::Control object is a smart version of L<Dpkg::Control::Hash>.
It associates a type to the control information. That type can be
used to know what fields are allowed and in what order they must be
output.

The types are constants that are exported by default. Here's the full
list:

=over 4

=item CTRL_UNKNOWN

This type is the default type, it indicates that the type of control
information is not yet known.

=item CTRL_TMPL_SRC

Corresponds to the first source package stanza in a F<debian/control> file in
a Debian source package.

=item CTRL_TMPL_PKG

Corresponds to subsequent binary package stanza in a F<debian/control> file
in a Debian source package.

=item CTRL_REPO_RELEASE

Corresponds to a F<Release> file in a repository.

=item CTRL_REPO_SRC

Corresponds to a stanza in a F<Sources> file of a source package
repository.

=item CTRL_REPO_PKG

Corresponds to a stanza in a F<Packages> file of a binary package
repository.

=item CTRL_DSC

Corresponds to a .dsc file of a Debian source package.

=item CTRL_DEB

Corresponds to the F<control> file generated by dpkg-gencontrol
(F<DEBIAN/control>) and to the same file inside .deb packages.

=item CTRL_FILE_BUILDINFO

Corresponds to a .buildinfo file.

=item CTRL_FILE_CHANGES

Corresponds to a .changes file.

=item CTRL_FILE_VENDOR

Corresponds to a vendor file in $Dpkg::CONFDIR/origins/.

=item CTRL_FILE_STATUS

Corresponds to a stanza in dpkg's F<status> file ($Dpkg::ADMINDIR/status).

=item CTRL_CHANGELOG

Corresponds to the output of dpkg-parsechangelog.

=item CTRL_COPYRIGHT_HEADER

Corresponds to the header stanza in a F<debian/copyright> file in
machine readable format.

=item CTRL_COPYRIGHT_FILES

Corresponds to a files stanza in a F<debian/copyright> file in
machine readable format.

=item CTRL_COPYRIGHT_LICENSE

Corresponds to a license stanza in a F<debian/copyright> file in
machine readable format.

=item CTRL_TESTS

Corresponds to a source package tests control file in F<debian/tests/control>.

=item CTRL_INFO_SRC

Alias for B<CTRL_TMPL_SRC>.

=item CTRL_INFO_PKG

Alias for B<CTRL_TMPL_PKG>.

=item CTRL_PKG_SRC

Alias for B<CTRL_DSC>.

=item CTRL_PKG_DEB

Alias for B<CTRL_DEB>.

=item CTRL_INDEX_SRC

Alias for B<CTRL_REPO_SRC>.

=item CTRL_INDEX_PKG

Alias for B<CTRL_REPO_PKG>.

=back

=cut
138
139package Dpkg::Control 1.04;
140
141
42
42
42
138
29
791
use strict;
142
42
42
42
91
24
2261
use warnings;
143
144our @EXPORT = qw(
145    CTRL_UNKNOWN
146    CTRL_TMPL_SRC
147    CTRL_TMPL_PKG
148    CTRL_REPO_RELEASE
149    CTRL_REPO_SRC
150    CTRL_REPO_PKG
151    CTRL_DSC
152    CTRL_DEB
153    CTRL_FILE_BUILDINFO
154    CTRL_FILE_CHANGES
155    CTRL_FILE_VENDOR
156    CTRL_FILE_STATUS
157    CTRL_CHANGELOG
158    CTRL_COPYRIGHT_HEADER
159    CTRL_COPYRIGHT_FILES
160    CTRL_COPYRIGHT_LICENSE
161    CTRL_TESTS
162
163    CTRL_INFO_SRC
164    CTRL_INFO_PKG
165    CTRL_PKG_SRC
166    CTRL_PKG_DEB
167    CTRL_INDEX_SRC
168    CTRL_INDEX_PKG
169);
170
171
42
42
42
102
46
648
use Exporter qw(import);
172
173
42
42
42
1561
57
1490
use Dpkg::Gettext;
174
42
42
42
1859
37
1471
use Dpkg::ErrorHandling;
175
42
42
42
5414
46
1934
use Dpkg::Control::Types;
176
42
42
42
5197
46
849
use Dpkg::Control::Hash;
177
42
42
42
89
28
1684
use Dpkg::Control::Fields;
178
179
42
42
42
86
39
52
use parent qw(Dpkg::Control::Hash);
180
181 - 193
=head1 METHODS

All the methods of L<Dpkg::Control::Hash> are available. Those listed below
are either new or overridden with a different behavior.

=over 4

=item $c = Dpkg::Control->new(%opts)

If the "type" option is given, it's used to setup default values
for other options. See set_options() for more details.

=cut
194
195sub new {
196
2607
1
3793
    my ($this, %opts) = @_;
197
2607
4650
    my $class = ref($this) || $this;
198
199
2607
3941
    my $self = Dpkg::Control::Hash->new();
200
2607
2180
    bless $self, $class;
201
2607
3842
    $self->set_options(%opts);
202
203
2607
3160
    return $self;
204}
205
206 - 218
=item $c->set_options(%opts)

Changes the value of one or more options. If the "type" option is changed,
it is used first to define default values for others options. The option
"allow_pgp" is set to 1 for CTRL_DSC, CTRL_FILE_CHANGES and
CTRL_REPO_RELEASE and to 0 otherwise. The option "drop_empty" is set to 0
for CTRL_TMPL_SRC and CTRL_TMPL_PKG and to 1 otherwise. The option "name"
is set to a textual description of the type of control information.

The output order is also set to match the ordered list returned by
Dpkg::Control::Fields::field_ordered_list($type).

=cut
219
220sub set_options {
221
2607
1
3036
    my ($self, %opts) = @_;
222
2607
2733
    if (exists $opts{type}) {
223
2607
2227
        my $t = $opts{type};
224
2607
4381
        $$self->{allow_pgp} = ($t & (CTRL_DSC | CTRL_FILE_CHANGES | CTRL_REPO_RELEASE)) ? 1 : 0;
225
2607
2465
        $$self->{drop_empty} = ($t & (CTRL_TMPL_SRC | CTRL_TMPL_PKG)) ?  0 : 1;
226
2607
3731
        if ($t == CTRL_TMPL_SRC) {
227
24
52
            $$self->{name} = g_('source package stanza of template control file');
228        } elsif ($t == CTRL_TMPL_PKG) {
229
54
69
            $$self->{name} = g_('binary package stanza of template control file');
230        } elsif ($t == CTRL_CHANGELOG) {
231
2457
3145
            $$self->{name} = g_('parsed version of changelog');
232        } elsif ($t == CTRL_COPYRIGHT_HEADER) {
233
0
0
            $$self->{name} = g_('header stanza of copyright file');
234        } elsif ($t == CTRL_COPYRIGHT_FILES) {
235
0
0
            $$self->{name} = g_('files stanza of copyright file');
236        } elsif ($t == CTRL_COPYRIGHT_HEADER) {
237
0
0
            $$self->{name} = g_('license stanza of copyright file');
238        } elsif ($t == CTRL_TESTS) {
239
36
60
            $$self->{name} = g_('source package tests control file');
240        } elsif ($t == CTRL_REPO_RELEASE) {
241
0
0
            $$self->{name} = sprintf(g_("repository's %s file"), 'Release');
242        } elsif ($t == CTRL_REPO_SRC) {
243
0
0
            $$self->{name} = sprintf(g_("stanza in repository's %s file"), 'Sources');
244        } elsif ($t == CTRL_REPO_PKG) {
245
0
0
            $$self->{name} = sprintf(g_("stanza in repository's %s file"), 'Packages');
246        } elsif ($t == CTRL_DSC) {
247
33
55
            $$self->{name} = g_('source package control file');
248        } elsif ($t == CTRL_DEB) {
249
3
12
            $$self->{name} = g_('binary package control file');
250        } elsif ($t == CTRL_FILE_BUILDINFO) {
251
0
0
            $$self->{name} = g_('build information file');
252        } elsif ($t == CTRL_FILE_CHANGES) {
253
0
0
            $$self->{name} = g_('upload changes control file');
254        } elsif ($t == CTRL_FILE_VENDOR) {
255
0
0
            $$self->{name} = g_('vendor file');
256        } elsif ($t == CTRL_FILE_STATUS) {
257
0
0
            $$self->{name} = g_("stanza in dpkg's status file");
258        }
259
2607
3808
        $self->set_output_order(field_ordered_list($opts{type}));
260    }
261
262    # Options set by the user override default values
263
2607
6428
    $$self->{$_} = $opts{$_} foreach keys %opts;
264}
265
266 - 271
=item $c->get_type()

Returns the type of control information stored. See the type parameter
set during new().

=cut
272
273sub get_type {
274
2169
1
1457
    my $self = shift;
275
2169
3267
    return $$self->{type};
276}
277
278=back
279
280 - 304
=head1 CHANGES

=head2 Version 1.04 (dpkg 1.22.2)

New types: CTRL_TMPL_SRC, CTRL_TMPL_PKG, CTRL_REPO_SRC, CTRL_REPO_PKG,
CTRL_DSC, CTRL_DEB.

=head2 Version 1.03 (dpkg 1.18.11)

New type: CTRL_FILE_BUILDINFO.

=head2 Version 1.02 (dpkg 1.18.8)

New type: CTRL_TESTS.

=head2 Version 1.01 (dpkg 1.18.5)

New types: CTRL_REPO_RELEASE, CTRL_COPYRIGHT_HEADER, CTRL_COPYRIGHT_FILES,
CTRL_COPYRIGHT_LICENSE.

=head2 Version 1.00 (dpkg 1.15.6)

Mark the module as public.

=cut
305
3061;