]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/WwwCoderepo.pm
www_coderepo: reduce utf8::decode calls
[public-inbox.git] / lib / PublicInbox / WwwCoderepo.pm
index 5ca8ef554774a6131560a7406423782e0acb5cb5..8df6116a79b230d0c5d27e8e393523ce8d0b643f 100644 (file)
@@ -8,6 +8,7 @@
 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;
@@ -60,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;
 }
 
@@ -114,7 +124,6 @@ EOM
        $last = pop(@r) if scalar(@r) > $ctx->{wcr}->{summary_branches};
        for (@r) {
                my ($pfx, $oid, $ref, $s, $cd) = split(/\0/);
-               utf8::decode($_) for ($ref, $s);
                chomp $cd;
                my $align = length($ref) < 12 ? ' ' x (12 - length($ref)) : '';
                print $zfh "$pfx <a\nhref=./$oid/s/>", ascii_html($ref),
@@ -132,13 +141,12 @@ EOM
        my $n;
        if (@s) {
                $n = $ctx->{git}->local_nick // die "BUG: $ctx->{git_dir} nick";
-               $n =~ s/\.git\z/-/;
-               ($n) = ($n =~ m!([^/]+)\z!);
-               $n = ascii_html($n);
+               $n =~ s!\.git/*\z!!;
+               ($n) = ($n =~ m!([^/]+)/*\z!);
+               $n = ascii_html($n).'-';
        }
        for (@r) {
                my (undef, $oid, $ref, $s, $cd) = split(/\0/);
-               utf8::decode($_) for ($ref, $s);
                chomp $cd;
                my $align = length($ref) < 12 ? ' ' x (12 - length($ref)) : '';
                print $zfh "<a\nhref=./$oid/s/>", ascii_html($ref),
@@ -159,6 +167,7 @@ EOM
 sub capture_refs ($$) { # psgi_qx callback to capture git-for-each-ref + git-log
        my ($bref, $ctx) = @_;
        my $qsp_err = delete $ctx->{-qsp_err};
+       utf8::decode($$bref);
        $ctx->{-each_refs} = $$bref;
        summary_finish($ctx) if $ctx->{-readme};
 }
@@ -210,35 +219,30 @@ 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, $3);
-
-       if ($path_info =~ m!\A/(.+?)/tree/(.*)\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})) {
-               return PublicInbox::RepoTree::srv_tree($ctx, $2) // r(404);
-       }
-
-       # snapshots:
-       if ($path_info =~ m!\A/(.+?)/snapshot/([^/]+)\z! and
+               $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/(.+?)/tags\.atom\z! and
+                       ($ctx->{git} = $cr->{$1})) {
+               PublicInbox::RepoAtom::srv_tags_atom($ctx);
+       } 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 '';