# show any VCS object, similar to "git show"
@@ -18,7 +18,7 @@ use strict;
use warnings;
use bytes (); # only for bytes::length
use PublicInbox::SolverGit;
-use PublicInbox::WwwStream;
+use PublicInbox::WwwStream qw(html_oneshot);
use PublicInbox::Linkify;
use PublicInbox::Tmpfile;
use PublicInbox::Hval qw(ascii_html to_filename);
@@ -27,21 +27,15 @@ my $hl = eval {
PublicInbox::HlMod->new;
};
-my %QP_MAP = ( A => 'oid_a', B => 'oid_b', a => 'path_a', b => 'path_b' );
+my %QP_MAP = ( A => 'oid_a', a => 'path_a', b => 'path_b' );
our $MAX_SIZE = 1024 * 1024; # TODO: configurable
my $BIN_DETECT = 8000; # same as git
-sub html_i { # WwwStream::getline callback
- my ($nr, $ctx) = @_;
- $nr == 1 ? ${delete $ctx->{rv}} : undef;
-}
-
sub html_page ($$$) {
my ($ctx, $code, $strref) = @_;
my $wcb = delete $ctx->{-wcb};
$ctx->{-upfx} = '../../'; # from "/$INBOX/$OID/s/"
- $ctx->{rv} = $strref;
- my $res = PublicInbox::WwwStream->response($ctx, $code, \&html_i);
+ my $res = html_oneshot($ctx, $code, $strref);
$wcb ? $wcb->($res) : $res;
}
@@ -64,6 +58,7 @@ sub stream_blob_parse_hdr { # {parse_hdr} for Qspawn
warn "premature EOF on $oid $$logref\n";
return html_page($ctx, 500, $logref);
}
+ @$ctx{qw(-res -logref)} = ($res, $logref);
undef; # bref keeps growing
}
}
@@ -90,8 +85,7 @@ sub show_other_result ($$) {
}
my $l = PublicInbox::Linkify->new;
utf8::decode($$bref);
- $l->linkify_1($$bref);
- $$bref = ''. $l->linkify_2(ascii_html($$bref));
+ $$bref = ''. $l->to_html($$bref);
$$bref .= '
' . $$logref;
html_page($ctx, 200, $bref);
}
@@ -125,16 +119,15 @@ sub solve_result {
my $ref = ref($res);
my $l = PublicInbox::Linkify->new;
- $l->linkify_1($log);
$log = 'debug log:
' .
- $l->linkify_2(ascii_html($log)) . '
';
+ $l->to_html($log) . '
';
$res or return html_page($ctx, 404, \$log);
$ref eq 'ARRAY' or return html_page($ctx, 500, \$log);
my ($git, $oid, $type, $size, $di) = @$res;
return show_other($ctx, $res, \$log, $fn) if $type ne 'blob';
- my $path = to_filename($di->{path_b} || $hints->{path_b} || 'blob');
+ my $path = to_filename($di->{path_b} // $hints->{path_b} // 'blob');
my $raw_link = "(raw)";
if ($size > $MAX_SIZE) {
return stream_large_blob($ctx, $res, \$log, $fn) if defined $fn;
@@ -166,7 +159,7 @@ sub solve_result {
# TODO: detect + convert to ensure validity
utf8::decode($$blob);
- my $nl = ($$blob =~ tr/\n/\n/);
+ my $nl = ($$blob =~ s/\r?\n/\n/sg);
my $pad = length($nl);
$l->linkify_1($$blob);
@@ -191,18 +184,20 @@ sub solve_result {
html_page($ctx, 200, \$log);
}
+# GET /$INBOX/$GIT_OBJECT_ID/s/
+# GET /$INBOX/$GIT_OBJECT_ID/s/$FILENAME
sub show ($$;$) {
my ($ctx, $oid_b, $fn) = @_;
my $qp = $ctx->{qp};
my $hints = $ctx->{hints} = {};
while (my ($from, $to) = each %QP_MAP) {
defined(my $v = $qp->{$from}) or next;
- $hints->{$to} = $v;
+ $hints->{$to} = $v if $v ne '';
}
$ctx->{'log'} = tmpfile("solve.$oid_b");
$ctx->{fn} = $fn;
- my $solver = PublicInbox::SolverGit->new($ctx->{-inbox},
+ my $solver = PublicInbox::SolverGit->new($ctx->{ibx},
\&solve_result, $ctx);
# PSGI server will call this immediately and give us a callback (-wcb)
sub {