about summary refs log tree commit homepage
path: root/lib/PublicInbox/RepoTree.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2023-01-13 04:01:32 +0000
committerEric Wong <e@80x24.org>2023-01-13 19:14:19 +0000
commit16f317f32bd5306d852b7d079b20cd0e4f2b4ff9 (patch)
treeaa6ca9a35cd488eca5ba75d3fb59f4a51b1208d6 /lib/PublicInbox/RepoTree.pm
parentd95ddf03cd437d6f5038f2ff21a9ef7efe93b056 (diff)
downloadpublic-inbox-16f317f32bd5306d852b7d079b20cd0e4f2b4ff9.tar.gz
We can't use 302 redirects at the /tree/ endpoint as originally
intended since "#n$LINENO" fragment links aren't preserved
across redirects (since clients don't typically send that part
of the URL in requests).

So we'll have to make sure we handle prefixes properly and show
trees directly.  Oh well :<  At least the history-aware 404
handling remains :>
Diffstat (limited to 'lib/PublicInbox/RepoTree.pm')
-rw-r--r--lib/PublicInbox/RepoTree.pm23
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/PublicInbox/RepoTree.pm b/lib/PublicInbox/RepoTree.pm
index cec71eb6..84e20589 100644
--- a/lib/PublicInbox/RepoTree.pm
+++ b/lib/PublicInbox/RepoTree.pm
@@ -48,15 +48,20 @@ sub find_missing {
         $qsp->psgi_qx($ctx->{env}, undef, \&rd_404_log, $ctx);
 }
 
-sub tree_30x { # git check_async callback
+sub tree_show { # git check_async callback
         my ($oid, $type, $size, $ctx) = @_;
         return find_missing($ctx) if $type eq 'missing';
-        my $wcb = delete $ctx->{-wcb};
-        my $u = $ctx->{git}->base_url($ctx->{env});
-        my $path = uri_escape_path(delete $ctx->{-path});
-        $u .= "$oid/s/?b=$path";
-        $wcb->([ 302, [ Location => $u, 'Content-Type' => 'text/plain' ],
-                [ "Redirecting to $u\n" ] ])
+
+        open $ctx->{lh}, '<', \(my $dbg_log = '') or die "open(scalar): $!";
+        my $res = [ $ctx->{git}, $oid, $type, $size ];
+        my ($bn) = ($ctx->{-path} =~ m!/?([^/]+)\z!);
+        if ($type eq 'blob') {
+                my $obj = ascii_html($ctx->{-obj});
+                $ctx->{-paths} = [ $bn, qq[(<a
+href="$ctx->{-upfx}$oid/s/$bn">raw</a>)
+\$ git show $obj\t# shows this blob on the CLI] ];
+        }
+        PublicInbox::ViewVCS::solve_result($res, $ctx);
 }
 
 sub srv_tree {
@@ -74,9 +79,9 @@ sub srv_tree {
         sub {
                 $ctx->{-wcb} = $_[0]; # HTTP::{Chunked,Identity}
                 if ($ctx->{env}->{'pi-httpd.async'}) {
-                        async_check($ctx, $obj, \&tree_30x, $ctx);
+                        async_check($ctx, $obj, \&tree_show, $ctx);
                 } else {
-                        $ctx->{git}->check_async($obj, \&tree_30x, $ctx);
+                        $ctx->{git}->check_async($obj, \&tree_show, $ctx);
                         $ctx->{git}->async_wait_all;
                 }
         };