Skip to content
  • Gábor Szeder's avatar
    ci: fix AsciiDoc/Asciidoctor stderr check in the documentation build job · 37fc8cb1
    Gábor Szeder authored and Junio C Hamano's avatar Junio C Hamano committed
    In 'ci/test-documentation.sh' we save the standard error of 'make
    doc', and, in an attempt to make sure that neither AsciiDoc nor
    Asciidoctor printed any warnings, we check the emptiness of the
    resulting file with '! test -s stderr.log'.  This check has never
    actually worked, because in our 'ci/*' build scripts we rely on 'set
    -e' aborting the build job when a command exits with error, and,
    unfortunately, the combination of the two doesn't work as intended.
    According to POSIX [1]:
    
      "The -e setting shall be ignored when executing [...] a pipeline
      beginning with the ! reserved word" [2]
    
    Watch and learn:
    
      $ echo unexpected >file
      $ ( set -e; ! test -s file ; echo "should not reach this" ) ; echo $?
      should not reach this
      0
    
    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':
    
      $ ( set -e; test ! -s file ; echo "should not reach this" ) ; echo $?
      1
    
    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.
    
    Note that we are only really interested in the standard error of
    AsciiDoc and Asciidoctor, but by saving the stderr of 'make doc' we
    also save any error output from the make rules.  Currently there is
    only one such line: we build the docs with Asciidoctor right after a
    'make clean', meaning that 'make USE_ASCIIDOCTOR=1 doc' always starts
    with running 'GIT-VERSION-GEN', which in turn prints the version to
    stderr.  A 'sed' command was supposed to remove this version line to
    prevent it from triggering that (previously defunct) emptiness check,
    but, unfortunately, this command doesn't work as intended, either,
    because it leaves the file to be checked intact, but that defunct
    emptiness check hid this issue, too...  Furthermore, in the near
    future there will be an other line on stderr, because commit
    9a71722b (Doc: auto-detect changed build flags, 2019-03-17) in the
    currently cooking branch 'ma/doc-diff-doc-vs-doctor-comparison' will
    print "* new asciidoc flags" at the beginning of both 'make doc'
    invokations.
    
    Extend that 'sed' command to remove this line, too, wrap it in a
    helper function so the output of both 'make doc' is filtered the same
    way, and change its invokation to actually write the logfile to be
    checked.
    
    [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: default avatarSZEDER Gábor <szeder.dev@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    37fc8cb1