]> Sergey Matveev's repositories - public-inbox.git/commitdiff
wwwlisting: do not rely on $? after ProcessPipe::CLOSE
authorEric Wong <e@80x24.org>
Thu, 26 Dec 2019 10:47:12 +0000 (10:47 +0000)
committerEric Wong <e@80x24.org>
Thu, 26 Dec 2019 10:47:42 +0000 (10:47 +0000)
ProcessPipe::CLOSE won't reliably set $? inside the event loop
if waitpid(..., WNOHANG) isn't successful.  So use a blocking
waitpid() call, here, and hope "git show-ref" exits promptly
since we've already drained its stdout.

lib/PublicInbox/WwwListing.pm

index bcb968af9b73c79c2af922b107c7ca1d32342da7..e19ae8a173080160fb026e947b9cd4b2d777e85d 100644 (file)
@@ -127,7 +127,9 @@ sub _json () {
 
 sub fingerprint ($) {
        my ($git) = @_;
-       my $fh = $git->popen('show-ref') or
+       # TODO: convert to qspawn for fairness when there's
+       # thousands of repos
+       my ($fh, $pid) = $git->popen('show-ref') or
                die "popen($git->{git_dir} show-ref) failed: $!";
 
        my $dig = Digest::SHA->new(1);
@@ -135,6 +137,7 @@ sub fingerprint ($) {
                $dig->add($buf);
        }
        close $fh;
+       waitpid($pid, 0);
        return if $?; # empty, uninitialized git repo
        $dig->hexdigest;
 }