On Tue, Mar 09, 2021 at 05:02:18PM +0100, Ævar Arnfjörð Bjarmason wrote: > Make the --verbose output be valid TAP, making it machine-readable for > TAP parsers again. > > Both the verbose and non-verbose test outputs were valid TAP back when > I added support for TAP in 5099b99d25f (test-lib: Adjust output to be > valid TAP format, 2010-06-24). > > Sometime after that the --verbose output broke due to some tests > emitting their own lines starting "ok" (or otherwise invalidate the > TAP). That was noticed and fixed in 452320f1f5 (test-lib: add > --verbose-log option, 2016-10-21) and "fixed" by simply turning off > the verbose mode when we were running under TAP::Harness (e.g. under > "prove"). > > That solution worked for running under Travis CI. After that fix it > was made to use the --verbose-log option in 041c72de109 (travis: use > --verbose-log test option, 2016-10-21), see 522354d70f4 (Add Travis CI > support, 2015-11-27) for the "cat t/test-results/*.out" code that was > aimed at. > > But that solution and others discussed in 452320f1f5 closed the door > on us having reliable machine-readable TAP output. > > Let's instead revert the work done in 452320f1f5 and, as well as the > follow-up commits 88c6e9d31c (test-lib: --valgrind should not override > --verbose-log, 2017-09-05) and f5ba2de6bc (test-lib: make "-x" work > with "--verbose-log", 2017-12-08), which were only needed to work > around bugs in the the previous --verbose-log implementation. > > Replace it with a simple method for ensuring that we have valid TAP > both on stdout, and in any verbose output we write. When we detect > that we're running under "prove" we prefix all legitimate TAP > directives with "GIT_TEST_TEE_STARTED": > > $ GIT_TEST_TEE_STARTED=1 ./t5547-push-quarantine.sh > GIT_TEST_TEE_STARTED ok 1 - create picky dest repo > GIT_TEST_TEE_STARTED ok 2 - accepted objects work > [...] > GIT_TEST_TEE_STARTED 1..6 > > Then, instead of piping the output to "tee -a" we pipe it to a helper > which first converts "ok" and other TAP syntax to e.g. "\ok", and then > strips that "GIT_TEST_TEE_STARTED " prefix from the start of the line. > > The end result is that we're guaranteed to have valid TAP syntax on > stdout. > > We can thus get rid of the --verbose-log special-case. Since that > option was meant to get around the TAP issue let's simply make it an > alias for "--verbose --tee". > > Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> > --- > t/README | 9 ++++++--- > t/t0000-basic.sh | 8 ++++++++ > t/test-lib.sh | 43 +++++++++++++++++++++---------------------- > 3 files changed, 35 insertions(+), 25 deletions(-) > > diff --git a/t/README b/t/README > index 2cc8cbc7185..f09d94e754e 100644 > --- a/t/README > +++ b/t/README > @@ -157,10 +157,13 @@ appropriately before running "make". Short options can be bundled, i.e. > > -V:: > --verbose-log:: > - Write verbose output to the same logfile as `--tee`, but do > - _not_ write it to stdout. Unlike `--tee --verbose`, this option > + An alias for `--verbose --tee`. This option > is safe to use when stdout is being consumed by a TAP parser > - like `prove`. Implies `--tee` and `--verbose`. > + like `prove`. > + Historically this option was different from `--verbose --tee` > + and would not write any verbose output to stdout to ensure the > + TAP-correctness of the output. The TAP-correctness of the > + output is now sanity checked by the test library, Not everyone is using a TAP harness to run the tests, and, therefore, '--verbose-log' should not spew out verbose output to the terminal.