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;
};
$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;
}
$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),
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),
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};
}
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 '';