[strip-nondeterminism] 01/03: File::SND: Lazy load most handlers

Chris Lamb chris at chris-lamb.co.uk
Mon Jul 10 21:08:05 UTC 2017


This is an automated email from the git hooks/post-receive script.

lamby pushed a commit to branch master
in repository strip-nondeterminism.

commit 45ee7391b4f2da98ac01cb9851c3e8ba173809d9
Author: Niels Thykier <niels at thykier.net>
Date:   Mon Jul 10 20:19:54 2017 +0000

    File::SND: Lazy load most handlers
    
    This reduces the start up time of dh_strip_nondeterminism to ~0.10s
    from ~0.17s in a "no-op" case.
    
    Signed-off-by: Niels Thykier <niels at thykier.net>
---
 lib/File/StripNondeterminism.pm | 73 ++++++++++++++++++++++++-----------------
 1 file changed, 42 insertions(+), 31 deletions(-)

diff --git a/lib/File/StripNondeterminism.pm b/lib/File/StripNondeterminism.pm
index c29d4df..c153b0e 100644
--- a/lib/File/StripNondeterminism.pm
+++ b/lib/File/StripNondeterminism.pm
@@ -22,16 +22,9 @@ use strict;
 use warnings;
 
 use POSIX qw(tzset);
-use File::StripNondeterminism::handlers::ar;
-use File::StripNondeterminism::handlers::cpio;
-use File::StripNondeterminism::handlers::gettext;
-use File::StripNondeterminism::handlers::gzip;
-use File::StripNondeterminism::handlers::jar;
 use File::StripNondeterminism::handlers::javadoc;
 use File::StripNondeterminism::handlers::pearregistry;
-use File::StripNondeterminism::handlers::png;
 use File::StripNondeterminism::handlers::javaproperties;
-use File::StripNondeterminism::handlers::zip;
 
 our($VERSION, $canonical_time, $clamp_time);
 
@@ -59,29 +52,29 @@ sub get_normalizer_for_file($) {
 
 	# ar
 	if (m/\.a$/ && _get_file_type($_) =~ m/ar archive/) {
-		return \&File::StripNondeterminism::handlers::ar::normalize;
+		return _handler('ar');
 	}
 	# cpio
 	if (m/\.cpio$/ && _get_file_type($_) =~ m/cpio archive/) {
-		return \&File::StripNondeterminism::handlers::cpio::normalize;
+		return _handler('cpio');
 	}
 	# gettext
 	if (m/\.g?mo$/ && _get_file_type($_) =~ m/GNU message catalog/) {
-		return \&File::StripNondeterminism::handlers::gettext::normalize;
+		return _handler('gettext');
 	}
 	# gzip
 	if (m/\.(gz|dz)$/ && _get_file_type($_) =~ m/gzip compressed data/) {
-		return \&File::StripNondeterminism::handlers::gzip::normalize;
+		return _handler('gzip');
 	}
 	# jar
 	if (m/\.(jar|war|hpi|apk)$/
 		&& _get_file_type($_) =~ m/(Java|Zip) archive data/) {
-		return \&File::StripNondeterminism::handlers::jar::normalize;
+		return _handler('jar');
 	}
 	# javadoc
 	if (m/\.html$/
 		&& File::StripNondeterminism::handlers::javadoc::is_javadoc_file($_)) {
-		return \&File::StripNondeterminism::handlers::javadoc::normalize;
+		return _handler('javadoc');
 	}
 	# pear registry
 	if (
@@ -89,11 +82,11 @@ sub get_normalizer_for_file($) {
 		&& File::StripNondeterminism::handlers::pearregistry::is_registry_file(
 			$_)
 	  ) {
-		return \&File::StripNondeterminism::handlers::pearregistry::normalize;
+		return _handler('pearregistry');
 	}
 	# PNG
 	if (m/\.png$/ && _get_file_type($_) =~ m/PNG image data/) {
-		return \&File::StripNondeterminism::handlers::png::normalize;
+		return _handler('png');
 	}
 	# pom.properties, version.properties
 	if (
@@ -101,32 +94,50 @@ sub get_normalizer_for_file($) {
 		&& File::StripNondeterminism::handlers::javaproperties::is_java_properties_file(
 			$_)
 	  ) {
-		return
-		  \&File::StripNondeterminism::handlers::javaproperties::normalize;
+		return _handler('javaproperties');
 	}
 	# zip
 	if (m/\.(zip|pk3|epub|whl|xpi|htb|zhfst|par)$/
 		&& _get_file_type($_) =~ m/Zip archive data|EPUB document/) {
-		return \&File::StripNondeterminism::handlers::zip::normalize;
+		return _handler('zip');
 	}
 	return undef;
 }
 
-our %typemap = (
-	ar	=> \&File::StripNondeterminism::handlers::ar::normalize,
-	cpio	=> \&File::StripNondeterminism::handlers::cpio::normalize,
-	gettext	=> \&File::StripNondeterminism::handlers::gettext::normalize,
-	gzip	=> \&File::StripNondeterminism::handlers::gzip::normalize,
-	jar	=> \&File::StripNondeterminism::handlers::jar::normalize,
-	javadoc	=> \&File::StripNondeterminism::handlers::javadoc::normalize,
-	pearregistry => \&File::StripNondeterminism::handlers::pearregistry::normalize,
-	png	=> \&File::StripNondeterminism::handlers::png::normalize,
-	javaproperties => \&File::StripNondeterminism::handlers::javaproperties::normalize,
-	zip	=> \&File::StripNondeterminism::handlers::zip::normalize,
+
+our %HANDLER_CACHE;
+our %KNOWN_HANDLERS = (
+	ar	=> 1,
+	cpio	=> 1,
+	gettext	=> 1,
+	gzip	=> 1,
+	jar	=> 1,
+	javadoc	=> 1,
+	pearregistry => 1,
+	png	=> 1,
+	javaproperties => 1,
+	zip	=> 1,
 );
+
+sub _handler {
+	my ($handler_name) = @_;
+	return $HANDLER_CACHE{$handler_name} if exists($HANDLER_CACHE{$handler_name});
+	die("Unknown handler: ${handler_name}\n")
+		if not exists($KNOWN_HANDLERS{$handler_name});
+	my $pkg = "File::StripNondeterminism::handlers::${handler_name}";
+	my $mod = "File/StripNondeterminism/handlers/${handler_name}.pm";
+	my $sub_name = "${pkg}::normalize";
+	require $mod;
+	no strict 'refs';
+	if (not defined &{$sub_name}) {
+		die("Internal error: No handler for $handler_name!?\n");
+	}
+	my $handler = \&{$sub_name};
+	return $HANDLER_CACHE{$handler_name} = $handler;
+}
+
 sub get_normalizer_by_name($) {
-	$_ = shift;
-	return $typemap{$_};
+	return _handler(shift);
 }
 
 1;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/strip-nondeterminism.git



More information about the Reproducible-commits mailing list