X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FWwwCoderepo.pm;h=8dcd97728293f8f3bd8b5ffc4ff7fd653ead6467;hb=c89ee98efc39c94aed0f38aa3c334c571d1a7073;hp=2fba0cd0be4571152b1e1f4fe49c068f2a22b499;hpb=eea4b03f08b40647b7cf6016838d18ae26d98a08;p=public-inbox.git diff --git a/lib/PublicInbox/WwwCoderepo.pm b/lib/PublicInbox/WwwCoderepo.pm index 2fba0cd0..8dcd9772 100644 --- a/lib/PublicInbox/WwwCoderepo.pm +++ b/lib/PublicInbox/WwwCoderepo.pm @@ -8,16 +8,16 @@ package PublicInbox::WwwCoderepo; use v5.12; use File::Temp 0.19 (); # newdir +use POSIX qw(O_RDWR F_GETFL); use PublicInbox::ViewVCS; use PublicInbox::WwwStatic qw(r); use PublicInbox::GitHTTPBackend; -use PublicInbox::Git; -use PublicInbox::GitAsyncCat; use PublicInbox::WwwStream; use PublicInbox::Hval qw(ascii_html); use PublicInbox::ViewDiff qw(uri_escape_path); use PublicInbox::RepoSnapshot; use PublicInbox::RepoAtom; +use PublicInbox::RepoTree; my $EACH_REF = "git for-each-ref --sort=-creatordate --format='%(HEAD)%00". join('%00', map { "%($_)" } @@ -61,6 +61,15 @@ sub new { }; $self->{$_} = 10 for qw(summary_branches summary_tags); $self->{$_} = 10 for qw(summary_log); + + # try reuse STDIN if it's already /dev/null + open $self->{log_fh}, '+>', '/dev/null' or die "open: $!"; + my @l = stat($self->{log_fh}) or die "stat: $!"; + my @s = stat(STDIN) or die "stat(STDIN): $!"; + if ("@l[0, 1]" eq "@s[0, 1]") { + my $f = fcntl(STDIN, F_GETFL, 0) // die "F_GETFL: $!"; + $self->{log_fh} = *STDIN{IO} if $f & O_RDWR; + } $self; } @@ -198,12 +207,7 @@ sub summary { $tip //= 'HEAD'; my @try = ("$tip:README", "$tip:README.md"); # TODO: configurable $ctx->{-nr_readme_tries} = [ @try ]; - $ctx->{git}->cat_async($_, \&set_readme, $ctx) for @try; - if ($ctx->{env}->{'pi-httpd.async'}) { - PublicInbox::GitAsyncCat::watch_cat($ctx->{git}); - } else { # synchronous - $ctx->{git}->cat_async_wait; - } + PublicInbox::ViewVCS::do_cat_async($ctx, \&set_readme, @try); sub { # $_[0] => PublicInbox::HTTP::{Identity,Chunked} $ctx->{env}->{'qspawn.wcb'} = $_[0]; $qsp->psgi_qx($ctx->{env}, undef, \&capture_refs, $ctx); @@ -216,30 +220,27 @@ sub srv { # endpoint called by PublicInbox::WWW my $git; # handle clone requests my $cr = $self->{pi_cfg}->{-code_repos}; - if ($path_info =~ m!\A/(.+?)/($PublicInbox::GitHTTPBackend::ANY)\z!x) { - $git = $cr->{$1} and return + if ($path_info =~ m!\A/(.+?)/($PublicInbox::GitHTTPBackend::ANY)\z!x and + ($git = $cr->{$1})) { PublicInbox::GitHTTPBackend::serve($ctx->{env},$git,$2); - } - $path_info =~ m!\A/(.+?)/\z! and - ($ctx->{git} = $cr->{$1}) and return summary($self, $ctx); - $path_info =~ m!\A/(.+?)/([a-f0-9]+)/s/\z! and - ($ctx->{git} = $cr->{$1}) and - return PublicInbox::ViewVCS::show($ctx, $2); - - # snapshots: - if ($path_info =~ m!\A/(.+?)/snapshot/([^/]+)\z! and + } elsif ($path_info =~ m!\A/(.+?)/\z! and ($ctx->{git} = $cr->{$1})) { + summary($self, $ctx) + } elsif ($path_info =~ m!\A/(.+?)/([a-f0-9]+)/s/([^/]+)?\z! and + ($ctx->{git} = $cr->{$1})) { + $ctx->{lh} = $self->{log_fh}; + PublicInbox::ViewVCS::show($ctx, $2, $3); + } elsif ($path_info =~ m!\A/(.+?)/tree/(.*)\z! and + ($ctx->{git} = $cr->{$1})) { + $ctx->{lh} = $self->{log_fh}; + PublicInbox::RepoTree::srv_tree($ctx, $2) // r(404); + } elsif ($path_info =~ m!\A/(.+?)/snapshot/([^/]+)\z! and ($ctx->{git} = $cr->{$1})) { $ctx->{wcr} = $self; - return PublicInbox::RepoSnapshot::srv($ctx, $2) // r(404); - } - - if ($path_info =~ m!\A/(.+?)/atom/(.*)\z! and + PublicInbox::RepoSnapshot::srv($ctx, $2) // r(404); + } elsif ($path_info =~ m!\A/(.+?)/atom/(.*)\z! and ($ctx->{git} = $cr->{$1})) { - return PublicInbox::RepoAtom::srv_atom($ctx, $2) // r(404); - } - - # enforce trailing slash: - if ($path_info =~ m!\A/(.+?)\z! and ($git = $cr->{$1})) { + PublicInbox::RepoAtom::srv_atom($ctx, $2) // r(404); + } elsif ($path_info =~ m!\A/(.+?)\z! and ($git = $cr->{$1})) { my $qs = $ctx->{env}->{QUERY_STRING}; my $url = $git->base_url($ctx->{env}); $url .= "?$qs" if $qs ne '';