————————# Copyright © 2008-2011 Raphaël Hertzog <hertzog@debian.org>
# Copyright © 2008-2018 Guillem Jover <guillem@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 <https://www.gnu.org/licenses/>.
=encoding utf8
=head1 NAME
Dpkg::Source::Format - manipulate debian/source/format files
=head1 DESCRIPTION
This module provides a class that can manipulate Debian source
package F<debian/source/format> files.
=cut
package
Dpkg::Source::Format 1.00;
use
strict;
use
warnings;
use
Dpkg::Gettext;
use
Dpkg::ErrorHandling;
=head1 METHODS
=over 4
=item $f = Dpkg::Source::Format->new(%opts)
Creates a new object corresponding to a source package's
F<debian/source/format> file.
Options:
=over
=item B<filename>
Set the filename to use to parse and set the format.
=item B<format>
Set and validate the format to use instead of loading the default file,
if no filename has been specified.
=back
=cut
sub
new {
my
(
$this
,
%opts
) =
@_
;
my
$class
=
ref
(
$this
) ||
$this
;
my
$self
= {
filename
=>
undef
,
major
=>
undef
,
minor
=>
undef
,
variant
=>
undef
,
};
bless
$self
,
$class
;
if
(
exists
$opts
{filename}) {
$self
->load(
$opts
{filename},
compression
=> 0);
}
elsif
(
$opts
{
format
}) {
$self
->set(
$opts
{
format
});
}
return
$self
;
}
=item $f->set_from_parts($major[, $minor[, $variant]])
Sets the source format from its parts. The $major part is mandatory.
The $minor and $variant parts are optional.
B<Notice>: This function performs no validation.
=cut
sub
set_from_parts {
my
(
$self
,
$major
,
$minor
,
$variant
) =
@_
;
$self
->{major} =
$major
;
$self
->{minor} =
$minor
// 0;
$self
->{variant} =
$variant
;
}
=item ($major, $minor, $variant) = $f->set($format)
Sets (and validates) the source $format specified. Will return the parsed
format parts as a list, the optional $minor and $variant parts might be
undef.
=cut
sub
set {
my
(
$self
,
$format
) =
@_
;
if
(
$format
=~ /^(\d+)(?:\.(\d+))?(?:\s+\(([a-z0-9]+)\))?$/) {
my
(
$major
,
$minor
,
$variant
) = ($1, $2, $3);
$self
->set_from_parts(
$major
,
$minor
,
$variant
);
return
(
$major
,
$minor
,
$variant
);
}
else
{
error(g_(
"source package format '%s' is invalid"
),
$format
);
}
}
=item ($major, $minor, $variant) = $f->get()
=item $format = $f->get()
Gets the source format, either as properly formatted scalar, or as a list
of its parts, where the optional $minor and $variant parts might be undef.
=cut
sub
get {
my
$self
=
shift
;
if
(
wantarray
) {
return
(
$self
->{major},
$self
->{minor},
$self
->{variant});
}
else
{
my
$format
=
"$self->{major}.$self->{minor}"
;
$format
.=
" ($self->{variant})"
if
defined
$self
->{variant};
return
$format
;
}
}
=item $count = $f->parse($fh, $desc)
Parse the source format string from $fh, with filehandle description $desc.
=cut
sub
parse {
my
(
$self
,
$fh
,
$desc
) =
@_
;
my
$format
= <
$fh
>;
chomp
$format
if
defined
$format
;
error(g_(
'%s is empty'
),
$desc
)
unless
defined
$format
and
length
$format
;
$self
->set(
$format
);
return
1;
}
=item $count = $f->load($filename)
Parse $filename contents for a source package format string.
=item $str = $f->output([$fh])
=item "$f"
Returns a string representing the source package format version.
If $fh is set, it prints the string to the filehandle.
=cut
sub
output {
my
(
$self
,
$fh
) =
@_
;
my
$str
=
$self
->get();
{
$fh
}
"$str\n"
if
defined
$fh
;
return
$str
;
}
=item $f->save($filename)
Save the source package format into the given $filename.
=back
=head1 CHANGES
=head2 Version 1.00 (dpkg 1.19.3)
Mark the module as public.
=cut
1;