diff --git a/ci/publish-release.sh b/ci/publish-release.sh index a5a8add..78bd741 100755 --- a/ci/publish-release.sh +++ b/ci/publish-release.sh @@ -200,12 +200,25 @@ if [ -z "$feed" ]; then exit 1 fi -printf '%s' "$feed" | grep -q '"browser_download_url"' || { +# `case`, not `printf … | grep -q`. Under `set -o pipefail` a grep that +# MATCHES can make the pipeline exit 141: grep closes the pipe on the first +# hit and the producer takes SIGPIPE, which pipefail reports as failure. So a +# match becomes an error, in the publishing path, with a message saying the +# feed has no download URL when it plainly does. +# +# Not reachable today — the feed is 3.5 KB and the pipe buffer is 64 KB — but +# it grows about 1.9 KB per release, so it arrives around release 34. A bug on +# a timer is worse than a bug, because nothing about the commit that trips it +# will have anything to do with it. `case` has no pipe, no fork and no +# producer to signal. +case "$feed" in + *'"browser_download_url"'*) ;; + *) echo ci_fail "The release is readable, but it has no zip attached. WordPress would be offered an update it cannot download." exit 1 -} - + ;; +esac # Checked at the address the PLUGIN builds, not the one the API reports. # # A forge fills browser_download_url from its own configured root URL, which is diff --git a/ci/static.sh b/ci/static.sh index a74c2a4..906f4b1 100755 --- a/ci/static.sh +++ b/ci/static.sh @@ -122,8 +122,15 @@ for path in $referenced; do case "$path" in */*) ;; *) continue ;; esac [ -d "${path%%/*}" ] || continue checked=$((checked + 1)) - printf '%s\n' "$shipped" | grep -qx "$path" \ - || note_fail "The code loads '$path', but the release zip does not contain it. Committed?" + # `case` rather than piping the list into grep -qx: under pipefail a grep + # that matches can exit 141 when the producer is signalled, so a HIT becomes + # a failure. The list is small today and this loop runs once per include, so + # this also drops a fork per iteration. Newlines on both sides make it an + # exact line match, which is what -qx gave. + case $'\n'"$shipped"$'\n' in + *$'\n'"$path"$'\n'*) ;; + *) note_fail "The code loads '$path', but the release zip does not contain it. Committed?" ;; + esac done if [ "$checked" = 0 ]; then # A check that verifies nothing must say so rather than reporting success.