'. $l->to_html($$bref); $$bref .= '
$git->{git_dir} }; my $tmp = File::Temp->newdir("show-$oid-XXXX", TMPDIR => 1); my $qsp = PublicInbox::Qspawn->new($cmd, $xenv, { -C => "$tmp" }); $qsp->{qsp_err} = \($ctx->{-qsp_err} = ''); $ctx->{-logref} = $logref; $ctx->{-tmp} = $tmp; $ctx->{env}->{'qspawn.wcb'} = delete $ctx->{-wcb}; $qsp->psgi_qx($ctx->{env}, undef, \&show_commit_result, $ctx); } sub show_other ($$$$) { my ($ctx, $res, $logref, $fn) = @_; my ($git, $oid, $type, $size) = @$res; if ($size > $MAX_SIZE) { $$logref = "$oid is too big to show\n" . $$logref; return html_page($ctx, 200, $logref); } my $cmd = ['git', "--git-dir=$git->{git_dir}", qw(show --encoding=UTF-8 --no-color --no-abbrev), $oid ]; my $qsp = PublicInbox::Qspawn->new($cmd); $qsp->{qsp_err} = \($ctx->{-qsp_err} = ''); $ctx->{-logref} = $logref; $qsp->psgi_qx($ctx->{env}, undef, \&show_other_result, $ctx); } # user_cb for SolverGit, called as: user_cb->($result_or_error, $uarg) sub solve_result { my ($res, $ctx) = @_; my ($log, $hints, $fn) = delete @$ctx{qw(log hints fn)}; unless (seek($log, 0, 0)) { warn "seek(log): $!"; return html_page($ctx, 500, \'seek error'); } $log = do { local $/; <$log> }; my $l = PublicInbox::Linkify->new; $log = '
debug log:
' . $l->to_html($log) . ''; $res or return html_page($ctx, 404, \$log); ref($res) eq 'ARRAY' or return html_page($ctx, 500, \$log); my ($git, $oid, $type, $size, $di) = @$res; return show_commit($ctx, $res, \$log, $fn) if $type eq 'commit'; return show_other($ctx, $res, \$log, $fn) if $type ne '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; $log = "
Too big to show, download available\n" . "$oid $type $size bytes $raw_link" . $log; return html_page($ctx, 200, \$log); } my $blob = $git->cat_file($oid); if (!$blob) { # WTF? my $e = "Failed to retrieve generated blob ($oid)"; warn "$e ($git->{git_dir})"; $log = "
$e" . $log; return html_page($ctx, 500, \$log); } my $bin = index(substr($$blob, 0, $BIN_DETECT), "\0") >= 0; if (defined $fn) { my $h = [ 'Content-Length', $size, 'Content-Type' ]; push(@$h, ($bin ? 'application/octet-stream' : 'text/plain')); return delete($ctx->{-wcb})->([200, $h, [ $$blob ]]); } if ($bin) { $log = "
$oid $type $size bytes (binary)" . " $raw_link" . $log; return html_page($ctx, 200, \$log); } # TODO: detect + convert to ensure validity utf8::decode($$blob); my $nl = ($$blob =~ s/\r?\n/\n/sg); my $pad = length($nl); $l->linkify_1($$blob); my $ok = $hl->do_hl($blob, $path) if $hl; if ($ok) { $blob = $ok; } else { $$blob = ascii_html($$blob); } # using some of the same CSS class names and ids as cgit $log = "
$oid $type $size bytes $raw_link" . "
" . join('', map { sprintf("% ${pad}u\n", $_) } (1..$nl)) . ' | ' .
'
|