Our read buffering only worked well with the stdout buffering on
glibc and *BSD libc, but not musl.  When reading the stdout of
git(1), we are likely to get smaller buffers and require more
reads on musl-based systems (tested Alpine Linux 3.19.0).

Thus we must prevent ->translate from being called with an empty
argument list (denoting EOF).  We'll also avoid some local
variable assignments while at it and favor the non-OO ->zflush
dispatch inside RepoAtom and WwwCoderepo subclasses.
---
 lib/PublicInbox/RepoAtom.pm    | 4 ++--
 lib/PublicInbox/WwwCoderepo.pm | 6 +++---
 t/solver_git.t                 | 8 +++++---
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/lib/PublicInbox/RepoAtom.pm b/lib/PublicInbox/RepoAtom.pm
index c1649d0a..ab0f2fcc 100644
--- a/lib/PublicInbox/RepoAtom.pm
+++ b/lib/PublicInbox/RepoAtom.pm
@@ -43,7 +43,7 @@ sub zflush { $_[0]->SUPER::zflush('</feed>') }
 # called by GzipFilter->write or GetlineResponse->getline
 sub translate {
        my $self = shift;
-       my $rec = $_[0] // return $self->zflush; # getline
+       $_[0] // return zflush($self); # getline caller
        my @out;
        my $lbuf = delete($self->{lbuf}) // shift;
        $lbuf .= shift while @_;
@@ -87,7 +87,7 @@ xmlns="http://www.w3.org/1999/xhtml";><pre 
style="white-space:pre-wrap">
        }
        $self->{lbuf} = $lbuf;
        chomp @out;
-       $self->SUPER::translate(@out);
+       @out ? $self->SUPER::translate(@out) : ''; # not EOF, yet
 }
 
 # $REPO/tags.atom endpoint
diff --git a/lib/PublicInbox/WwwCoderepo.pm b/lib/PublicInbox/WwwCoderepo.pm
index d1354af5..3814f719 100644
--- a/lib/PublicInbox/WwwCoderepo.pm
+++ b/lib/PublicInbox/WwwCoderepo.pm
@@ -273,7 +273,7 @@ sub zflush { $_[0]->SUPER::zflush('</pre>', 
$_[0]->_html_end) }
 # called by GzipFilter->write or GetlineResponse->getline
 sub translate {
        my $ctx = shift;
-       my $rec = $_[0] // return zflush($ctx); # getline
+       $_[0] // return zflush($ctx); # getline caller
        my @out;
        my $fbuf = delete($ctx->{fbuf}) // shift;
        $fbuf .= shift while @_;
@@ -290,8 +290,8 @@ sub translate {
                                                $snap_pfx, @snap_fmt);
                }
        }
-       $ctx->{fbuf} = $fbuf;
-       $ctx->SUPER::translate(@out);
+       $ctx->{fbuf} = $fbuf; # may be incomplete
+       @out ? $ctx->SUPER::translate(@out) : ''; # not EOF, yet
 }
 
 sub _refs_parse_hdr { # {parse_hdr} for Qspawn
diff --git a/t/solver_git.t b/t/solver_git.t
index ab8aba15..db672904 100644
--- a/t/solver_git.t
+++ b/t/solver_git.t
@@ -405,14 +405,16 @@ EOF
                is($res->code, 200, 'Atom feed');
                SKIP: {
                        require_mods('XML::TreePP', 1);
-                       my $t = XML::TreePP->new->parse($res->content);
+                       my $t = eval { XML::TreePP->new->parse($res->content) }
+                               or diag explain($res);
                        is(scalar @{$t->{feed}->{entry}}, 50,
-                               'got 50 entries');
+                               'got 50 entries') or diag explain([$t, $res]);
 
                        $res = $cb->(GET('/public-inbox/atom/COPYING'));
                        is($res->code, 200, 'file Atom feed');
                        $t = XML::TreePP->new->parse($res->content);
-                       ok($t->{feed}->{entry}, 'got entry');
+                       ok($t->{feed}->{entry}, 'got entry') or
+                               diag explain([ $t, $res ]);
 
                        $res = $cb->(GET('/public-inbox/atom/README.md'));
                        is($res->code, 404, '404 on missing file Atom feed');

Reply via email to