From 3647997eaf49410bbf3e33bfb3874c611ab0c38b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 26 Dec 2019 10:47:12 +0000 Subject: wwwlisting: do not rely on $? after ProcessPipe::CLOSE 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/PublicInbox/WwwListing.pm b/lib/PublicInbox/WwwListing.pm index bcb968af..e19ae8a1 100644 --- a/lib/PublicInbox/WwwListing.pm +++ b/lib/PublicInbox/WwwListing.pm @@ -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; } -- cgit v1.2.3-24-ge0c7