[dpkg] 109/192: Dpkg::Shlibs::SymbolFile: Avoid many function arguments in parse()
Ximin Luo
infinity0 at debian.org
Tue Oct 17 11:04:06 UTC 2017
This is an automated email from the git hooks/post-receive script.
infinity0 pushed a commit to branch pu/reproducible_builds
in repository dpkg.
commit 0d2b3cee25b74dd3fd9ddc3a469b8b144368c963
Author: Guillem Jover <guillem at debian.org>
Date: Wed Jun 29 02:34:58 2016 +0200
Dpkg::Shlibs::SymbolFile: Avoid many function arguments in parse()
Addresses: Subroutines::ProhibitManyArgs
Warned-by: perlcritic
---
debian/changelog | 1 +
scripts/Dpkg/Shlibs/SymbolFile.pm | 44 +++++++++++++++++++++------------------
2 files changed, 25 insertions(+), 20 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 0806d90..6dc7ee2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -34,6 +34,7 @@ dpkg (1.19.0) UNRELEASED; urgency=medium
use colors, reducing the load time of many other modules.
- Move color setup into report_pretty in Dpkg::ErrorHandling.
- Move printforhelp initialization into usageerr() in Dpkg::ErrorHandling.
+ - Avoid many function arguments in Dpkg::Shlibs::SymbolFile parse().
* Documentation:
- Document currently accepted syntax for changelogs in deb-changelog(5).
Closes: #858579
diff --git a/scripts/Dpkg/Shlibs/SymbolFile.pm b/scripts/Dpkg/Shlibs/SymbolFile.pm
index 6f7452b..60fd80f 100644
--- a/scripts/Dpkg/Shlibs/SymbolFile.pm
+++ b/scripts/Dpkg/Shlibs/SymbolFile.pm
@@ -199,34 +199,35 @@ sub _new_symbol {
return (ref $base) ? $base->clone(@_) : $base->new(@_);
}
-# Parameter seen is only used for recursive calls
+# Option state is only used for recursive calls.
sub parse {
- my ($self, $fh, $file, $seen, $obj_ref, $base_symbol) = @_;
+ my ($self, $fh, $file, %opts) = @_;
+ my $state = $opts{state} //= {};
- if (defined($seen)) {
- return if exists $seen->{$file}; # Avoid include loops
+ if (defined $state) {
+ return if exists $state->{seen}{$file}; # Avoid include loops
} else {
$self->{file} = $file;
- $seen = {};
+ $state->{seen} = {};
}
- $seen->{$file} = 1;
+ $state->{seen}{$file} = 1;
- if (not ref($obj_ref)) { # Init ref to name of current object/lib
- $$obj_ref = undef;
+ if (not ref $state->{obj_ref}) { # Init ref to name of current object/lib
+ ${$state->{obj_ref}} = undef;
}
while (<$fh>) {
chomp;
if (/^(?:\s+|#(?:DEPRECATED|MISSING): ([^#]+)#\s*)(.*)/) {
- if (not defined ($$obj_ref)) {
+ if (not defined ${$state->{obj_ref}}) {
error(g_('symbol information must be preceded by a header (file %s, line %s)'), $file, $.);
}
# Symbol specification
my $deprecated = ($1) ? $1 : 0;
- my $sym = _new_symbol($base_symbol, deprecated => $deprecated);
+ my $sym = _new_symbol($state->{base_symbol}, deprecated => $deprecated);
if ($self->create_symbol($2, base => $sym)) {
- $self->add_symbol($sym, $$obj_ref);
+ $self->add_symbol($sym, ${$state->{obj_ref}});
} else {
warning(g_('failed to parse line in %s: %s'), $file, $_);
}
@@ -234,36 +235,39 @@ sub parse {
my $tagspec = $1;
my $filename = $2;
my $dir = $file;
+ my $old_base_symbol = $state->{base_symbol};
my $new_base_symbol;
if (defined $tagspec) {
- $new_base_symbol = _new_symbol($base_symbol);
+ $new_base_symbol = _new_symbol($old_base_symbol);
$new_base_symbol->parse_tagspec($tagspec);
}
+ $state->{base_symbol} = $new_base_symbol;
$dir =~ s{[^/]+$}{}; # Strip filename
- $self->load("$dir$filename", $seen, $obj_ref, $new_base_symbol);
+ $self->load("$dir$filename", %opts);
+ $state->{base_symbol} = $old_base_symbol;
} elsif (/^#|^$/) {
# Skip possible comments and empty lines
} elsif (/^\|\s*(.*)$/) {
# Alternative dependency template
- push @{$self->{objects}{$$obj_ref}{deps}}, "$1";
+ push @{$self->{objects}{${$state->{obj_ref}}}{deps}}, "$1";
} elsif (/^\*\s*([^:]+):\s*(.*\S)\s*$/) {
# Add meta-fields
- $self->{objects}{$$obj_ref}{fields}{field_capitalize($1)} = $2;
+ $self->{objects}{${$state->{obj_ref}}}{fields}{field_capitalize($1)} = $2;
} elsif (/^(\S+)\s+(.*)$/) {
# New object and dependency template
- $$obj_ref = $1;
- if (exists $self->{objects}{$$obj_ref}) {
+ ${$state->{obj_ref}} = $1;
+ if (exists $self->{objects}{${$state->{obj_ref}}}) {
# Update/override infos only
- $self->{objects}{$$obj_ref}{deps} = [ "$2" ];
+ $self->{objects}{${$state->{obj_ref}}}{deps} = [ "$2" ];
} else {
# Create a new object
- $self->create_object($$obj_ref, "$2");
+ $self->create_object(${$state->{obj_ref}}, "$2");
}
} else {
warning(g_('failed to parse a line in %s: %s'), $file, $_);
}
}
- delete $seen->{$file};
+ delete $state->{seen}{$file};
}
# Beware: we reuse the data structure of the provided symfile so make
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/dpkg.git
More information about the Reproducible-commits
mailing list