X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FWwwListing.pm;h=42a0c0d801a60c652b476b61060a8e9a76043260;hb=9ba72fb4d832390eac423e25e6734a9b21086322;hp=4f076b7d24041f17cced038d802414cc27a6dc0a;hpb=1988d730c0088e8b1f6193650c7ee929df8a2ed7;p=public-inbox.git diff --git a/lib/PublicInbox/WwwListing.pm b/lib/PublicInbox/WwwListing.pm index 4f076b7d..42a0c0d8 100644 --- a/lib/PublicInbox/WwwListing.pm +++ b/lib/PublicInbox/WwwListing.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2019 all contributors +# Copyright (C) 2019-2020 all contributors # License: AGPL-3.0+ # Provide an HTTP-accessible listing of inboxes. @@ -6,15 +6,23 @@ package PublicInbox::WwwListing; use strict; use warnings; -use PublicInbox::Hval qw(ascii_html); +use PublicInbox::Hval qw(ascii_html prurl); use PublicInbox::Linkify; use PublicInbox::View; use PublicInbox::Inbox; -use bytes (); +use bytes (); # bytes::length use HTTP::Date qw(time2str); -require Digest::SHA; -require File::Spec; +use Digest::SHA (); +use File::Spec (); *try_cat = \&PublicInbox::Inbox::try_cat; +our $json; +if (eval { require IO::Compress::Gzip }) { + for my $mod (qw(JSON::MaybeXS JSON JSON::PP)) { + eval "require $mod" or next; + # ->ascii encodes non-ASCII to "\uXXXX" + $json = $mod->new->ascii(1) and last; + } +} sub list_all_i { my ($ibx, $arg) = @_; @@ -84,13 +92,13 @@ sub new { sub ibx_entry { my ($mtime, $ibx, $env) = @_; my $ts = PublicInbox::View::fmt_ts($mtime); - my $url = PublicInbox::Hval::prurl($env, $ibx->{url}); + my $url = prurl($env, $ibx->{url}); my $tmp = <<""; * $ts - $url ${\$ibx->description} if (defined(my $info_url = $ibx->{infourl})) { - $tmp .= ' ' . PublicInbox::Hval::prurl($env, $info_url) . "\n"; + $tmp .= ' ' . prurl($env, $info_url) . "\n"; } $tmp; } @@ -111,8 +119,7 @@ sub html ($$) { my $tmp = join("\n", map { ibx_entry(@$_, $env) } @$list); my $l = PublicInbox::Linkify->new; - $l->linkify_1($tmp); - $out = '
'.$l->linkify_2(ascii_html($tmp)).'

'; + $out = '
'.$l->to_html($tmp).'

'; } $out = "$title" . $out; $out .= '
'. PublicInbox::WwwStream::code_footer($env) .
@@ -122,23 +129,11 @@ sub html ($$) {
 	[ $code, $h, [ $out ] ];
 }
 
-my $json;
-sub _json () {
-	for my $mod (qw(JSON::MaybeXS JSON JSON::PP)) {
-		eval "require $mod" or next;
-		# ->ascii encodes non-ASCII to "\uXXXX"
-		return $mod->new->ascii(1);
-	}
-	die;
-}
-
 sub fingerprint ($) {
 	my ($git) = @_;
 	# TODO: convert to qspawn for fairness when there's
 	# thousands of repos
-	my ($fh, $pid) = $git->popen('show-ref') or
-		die "popen($git->{git_dir} show-ref) failed: $!";
-
+	my ($fh, $pid) = $git->popen('show-ref');
 	my $dig = Digest::SHA->new(1);
 	while (read($fh, my $buf, 65536)) {
 		$dig->add($buf);
@@ -204,7 +199,8 @@ sub manifest_add ($$;$$) {
 # manifest.js.gz
 sub js ($$) {
 	my ($env, $list) = @_;
-	eval { require IO::Compress::Gzip } or return [ 404, [], [] ];
+	# $json won't be defined if IO::Compress::Gzip is missing
+	$json or return [ 404, [], [] ];
 
 	my $manifest = { -abs2urlpath => {}, -mtime => 0 };
 	for my $ibx (@$list) {
@@ -224,8 +220,7 @@ sub js ($$) {
 		$repo->{reference} = $abs2urlpath->{$abs};
 	}
 	my $out;
-	IO::Compress::Gzip::gzip(\(($json ||= _json())->encode($manifest)) =>
-				 \$out);
+	IO::Compress::Gzip::gzip(\($json->encode($manifest)) => \$out);
 	$manifest = undef;
 	[ 200, [ qw(Content-Type application/gzip),
 		 'Last-Modified', time2str($mtime),