Subject: [PATCH v2 6/6] ci: fix AsciiDoc/Asciidoctor stderr check in the documentation build job

From: SZEDER Gábor <[email-masked]>
Date: Sun, 24 Mar 2019 22:55:34 +0100

In our 'ci/*' build scripts we rely on 'set -e' aborting the build job
when a command exits with error, while in 'ci/test-documentation.sh'
we tried to check the emptiness of AsciiDoc's and Asciidoctor's
standard error with '! test -s stderr.log'.  Unfortunately, the
combination of the two doesn't work as intended, because, according to
POSIX [1]:

  "The -e setting shall be ignored when executing [...] a pipeline
  beginning with the ! reserved word" [2]

Watch and learn:

  $ cat e.sh
  #!/bin/sh
  set -ex
  echo unexpected >file
  ! test -s file
  test ! -s file
  echo "should not reach this"
  $ ./e.sh
  + echo unexpected
  + test -s file
  + test ! -s file
  $

This is why we haven't noticed the warnings from Asciidoctor that were
fixed in the first patches of this patch series, though some of them
were already there in the build of v2.18.0-rc0 [3].

Check the emptiness of that file with 'test ! -s' instead, which works
properly with 'set -e'.  Furthermore, dump the contents of that file
to the log for our convenience, so if it were to unexpectedly end up
being non-empty, then we wouldn't have to scroll through all that long
build log looking for warnings, but could see them right away near the
end of the log.

And one more thing: we build the docs with Asciidoctor right after a
'make clean', meaning that 'make doc' starts with running
'GIT-VERSION-GEN', which in turn prints the version to its standard
error.  This version then goes to 'stderr.log' as well, and a 'sed'
command is supposed to remove it to prevent it from interfering with
that (previously defunct) emptiness check.  Alas, this command doesn't
work as intended, either, because it leaves the file to be checked
intact, but the defunct emptiness check hid this issue, too...  This
patch deals with this as well.

[1] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#set

[2] POSIX doesn't discuss the meaning of '! cmd' in case of simple
    commands, but it defines that "A pipeline is a sequence of one or
    more commands separated by the control operator '|'", so
    apparently a simple command is considered as pipeline as well.

    http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_02

[3] https://travis-ci.org/git/git/jobs/385932007#L1463

Signed-off-by: SZEDER Gábor <[email-masked]>
---
 ci/test-documentation.sh | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/ci/test-documentation.sh b/ci/test-documentation.sh
index 8f91f48c81..bd4a65e933 100755
--- a/ci/test-documentation.sh
+++ b/ci/test-documentation.sh
@@ -10,7 +10,8 @@ make check-docs
 
 # Build docs with AsciiDoc
 make doc > >(tee stdout.log) 2> >(tee stderr.log >&2)
-! test -s stderr.log
+cat stderr.log
+test ! -s stderr.log
 test -s Documentation/git.html
 test -s Documentation/git.xml
 test -s Documentation/git.1
@@ -21,13 +22,14 @@ check_unignored_build_artifacts
 
 # Build docs with AsciiDoctor
 make clean
-make USE_ASCIIDOCTOR=1 doc > >(tee stdout.log) 2> >(tee stderr.log >&2)
-sed '/^GIT_VERSION = / d' stderr.log
-! test -s stderr.log
+make USE_ASCIIDOCTOR=1 doc > >(tee stdout.log) 2> >(tee stderr.raw >&2)
+sed '/^GIT_VERSION = / d' stderr.raw >stderr.log
+cat stderr.log
+test ! -s stderr.log
 test -s Documentation/git.html
 grep '<meta name="generator" content="Asciidoctor ' Documentation/git.html
 
-rm -f stdout.log stderr.log
+rm -f stdout.log stderr.log stderr.raw
 check_unignored_build_artifacts
 
 save_good_tree
-- 
2.21.0.539.g07239c3a71.dirty