| Index: third_party/dpkg-dev/scripts/Dpkg/BuildOptions.pm
 | 
| diff --git a/third_party/dpkg-dev/scripts/Dpkg/BuildOptions.pm b/third_party/dpkg-dev/scripts/Dpkg/BuildOptions.pm
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..90213aab0f40587677953fc796ef752ed169b203
 | 
| --- /dev/null
 | 
| +++ b/third_party/dpkg-dev/scripts/Dpkg/BuildOptions.pm
 | 
| @@ -0,0 +1,204 @@
 | 
| +# Copyright © 2007 Frank Lichtenheld <djpig@debian.org>
 | 
| +# Copyright © 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 <https://www.gnu.org/licenses/>.
 | 
| +
 | 
| +package Dpkg::BuildOptions;
 | 
| +
 | 
| +use strict;
 | 
| +use warnings;
 | 
| +
 | 
| +our $VERSION = '1.01';
 | 
| +
 | 
| +use Dpkg::Gettext;
 | 
| +use Dpkg::ErrorHandling;
 | 
| +use Dpkg::BuildEnv;
 | 
| +
 | 
| +=encoding utf8
 | 
| +
 | 
| +=head1 NAME
 | 
| +
 | 
| +Dpkg::BuildOptions - parse and update build options
 | 
| +
 | 
| +=head1 DESCRIPTION
 | 
| +
 | 
| +The Dpkg::BuildOptions object can be used to manipulate options stored
 | 
| +in environment variables like DEB_BUILD_OPTIONS and
 | 
| +DEB_BUILD_MAINT_OPTIONS.
 | 
| +
 | 
| +=head1 FUNCTIONS
 | 
| +
 | 
| +=over 4
 | 
| +
 | 
| +=item my $bo = Dpkg::BuildOptions->new(%opts)
 | 
| +
 | 
| +Create a new Dpkg::BuildOptions object. It will be initialized based
 | 
| +on the value of the environment variable named $opts{envvar} (or
 | 
| +DEB_BUILD_OPTIONS if that option is not set).
 | 
| +
 | 
| +=cut
 | 
| +
 | 
| +sub new {
 | 
| +    my ($this, %opts) = @_;
 | 
| +    my $class = ref($this) || $this;
 | 
| +
 | 
| +    my $self = {
 | 
| +        options => {},
 | 
| +	source => {},
 | 
| +	envvar => $opts{envvar} // 'DEB_BUILD_OPTIONS',
 | 
| +    };
 | 
| +    bless $self, $class;
 | 
| +    $self->merge(Dpkg::BuildEnv::get($self->{envvar}), $self->{envvar});
 | 
| +    return $self;
 | 
| +}
 | 
| +
 | 
| +=item $bo->reset()
 | 
| +
 | 
| +Reset the object to not have any option (it's empty).
 | 
| +
 | 
| +=cut
 | 
| +
 | 
| +sub reset {
 | 
| +    my ($self) = @_;
 | 
| +    $self->{options} = {};
 | 
| +    $self->{source} = {};
 | 
| +}
 | 
| +
 | 
| +=item $bo->merge($content, $source)
 | 
| +
 | 
| +Merge the options set in $content and record that they come from the
 | 
| +source $source. $source is mainly used in warning messages currently
 | 
| +to indicate where invalid options have been detected.
 | 
| +
 | 
| +$content is a space separated list of options with optional assigned
 | 
| +values like "nocheck parallel=2".
 | 
| +
 | 
| +=cut
 | 
| +
 | 
| +sub merge {
 | 
| +    my ($self, $content, $source) = @_;
 | 
| +    return 0 unless defined $content;
 | 
| +    my $count = 0;
 | 
| +    foreach (split(/\s+/, $content)) {
 | 
| +	unless (/^([a-z][a-z0-9_-]*)(?:=(\S*))?$/) {
 | 
| +            warning(_g('invalid flag in %s: %s'), $source, $_);
 | 
| +            next;
 | 
| +        }
 | 
| +	$count += $self->set($1, $2, $source);
 | 
| +    }
 | 
| +    return $count;
 | 
| +}
 | 
| +
 | 
| +=item $bo->set($option, $value, [$source])
 | 
| +
 | 
| +Store the given option in the objet with the given value. It's legitimate
 | 
| +for a value to be undefined if the option is a simple boolean (its
 | 
| +presence means true, its absence means false). The $source is optional
 | 
| +and indicates where the option comes from.
 | 
| +
 | 
| +The known options have their values checked for sanity. Options without
 | 
| +values have their value removed and options with invalid values are
 | 
| +discarded.
 | 
| +
 | 
| +=cut
 | 
| +
 | 
| +sub set {
 | 
| +    my ($self, $key, $value, $source) = @_;
 | 
| +
 | 
| +    # Sanity checks
 | 
| +    if ($key =~ /^(noopt|nostrip|nocheck)$/ && defined($value)) {
 | 
| +	$value = undef;
 | 
| +    } elsif ($key eq 'parallel')  {
 | 
| +	$value //= '';
 | 
| +	return 0 if $value !~ /^\d*$/;
 | 
| +    }
 | 
| +
 | 
| +    $self->{options}{$key} = $value;
 | 
| +    $self->{source}{$key} = $source;
 | 
| +
 | 
| +    return 1;
 | 
| +}
 | 
| +
 | 
| +=item $bo->get($option)
 | 
| +
 | 
| +Return the value associated to the option. It might be undef even if the
 | 
| +option exists. You might want to check with $bo->has($option) to verify if
 | 
| +the option is stored in the object.
 | 
| +
 | 
| +=cut
 | 
| +
 | 
| +sub get {
 | 
| +    my ($self, $key) = @_;
 | 
| +    return $self->{options}{$key};
 | 
| +}
 | 
| +
 | 
| +=item $bo->has($option)
 | 
| +
 | 
| +Returns a boolean indicating whether the option is stored in the object.
 | 
| +
 | 
| +=cut
 | 
| +
 | 
| +sub has {
 | 
| +    my ($self, $key) = @_;
 | 
| +    return exists $self->{options}{$key};
 | 
| +}
 | 
| +
 | 
| +=item $string = $bo->output($fh)
 | 
| +
 | 
| +Return a string representation of the build options suitable to be
 | 
| +assigned to an environment variable. Can optionnaly output that string to
 | 
| +the given filehandle.
 | 
| +
 | 
| +=cut
 | 
| +
 | 
| +sub output {
 | 
| +    my ($self, $fh) = @_;
 | 
| +    my $o = $self->{options};
 | 
| +    my $res = join(' ', map { defined($o->{$_}) ? $_ . '=' . $o->{$_} : $_ } sort keys %$o);
 | 
| +    print { $fh } $res if defined $fh;
 | 
| +    return $res;
 | 
| +}
 | 
| +
 | 
| +=item $bo->export([$var])
 | 
| +
 | 
| +Export the build options to the given environment variable. If omitted,
 | 
| +the environment variable defined at creation time is assumed. The value
 | 
| +set to the variable is also returned.
 | 
| +
 | 
| +=cut
 | 
| +
 | 
| +sub export {
 | 
| +    my ($self, $var) = @_;
 | 
| +    $var = $self->{envvar} unless defined $var;
 | 
| +    my $content = $self->output();
 | 
| +    Dpkg::BuildEnv::set($var, $content);
 | 
| +    return $content;
 | 
| +}
 | 
| +
 | 
| +=back
 | 
| +
 | 
| +=head1 CHANGES
 | 
| +
 | 
| +=head2 Version 1.01
 | 
| +
 | 
| +Enable to use another environment variable instead of DEB_BUILD_OPTIONS.
 | 
| +Thus add support for the "envvar" option at creation time.
 | 
| +
 | 
| +=head1 AUTHOR
 | 
| +
 | 
| +Raphaël Hertzog <hertzog@debian.org>
 | 
| +
 | 
| +=cut
 | 
| +
 | 
| +1;
 | 
| 
 |