From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>, "Jeff King" <peff@peff.net>,
"SZEDER Gábor" <szeder.dev@gmail.com>,
"Johannes Schindelin" <Johannes.Schindelin@gmx.de>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Subject: [PATCH 4/7] test-lib: add tee with TAP support to test-tool
Date: Tue, 9 Mar 2021 17:02:16 +0100 [thread overview]
Message-ID: <20210309160219.13779-5-avarab@gmail.com> (raw)
In-Reply-To: <87r1kzj7xi.fsf@evledraar.gmail.com>
Add a 'test-tool tee' that behaves similarly to 'tee(1)', except that
it supports sanitizing the TAP emitted on stdout.
This is done by assuming that the TAP is emitted by a friendly library
that promises to prefix valid TAP directives with what we're going to
strip with --strip-prefix="".
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
Makefile | 1 +
t/helper/test-tee.c | 85 ++++++++++++++++++++++++++++++++++++++++++++
t/helper/test-tool.c | 1 +
t/helper/test-tool.h | 1 +
4 files changed, 88 insertions(+)
create mode 100644 t/helper/test-tee.c
diff --git a/Makefile b/Makefile
index dfb0f1000fa..d26b9d62ee9 100644
--- a/Makefile
+++ b/Makefile
@@ -742,6 +742,7 @@ TEST_BUILTINS_OBJS += test-string-list.o
TEST_BUILTINS_OBJS += test-submodule-config.o
TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o
TEST_BUILTINS_OBJS += test-subprocess.o
+TEST_BUILTINS_OBJS += test-tee.o
TEST_BUILTINS_OBJS += test-trace2.o
TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
TEST_BUILTINS_OBJS += test-wildmatch.o
diff --git a/t/helper/test-tee.c b/t/helper/test-tee.c
new file mode 100644
index 00000000000..4ed34e9db93
--- /dev/null
+++ b/t/helper/test-tee.c
@@ -0,0 +1,85 @@
+#include "test-tool.h"
+#include "parse-options.h"
+#include "strbuf.h"
+
+static int line_has_tap(struct strbuf *line)
+{
+ /*
+ * This is a less permissive version of
+ * https://metacpan.org/release/Test-Harness/source/lib/TAP/Parser/Grammar.pm
+ */
+ if (starts_with(line->buf, "ok") ||
+ starts_with(line->buf, "not ok") ||
+ starts_with(line->buf, "1..") ||
+ starts_with(line->buf, "Bail out!") ||
+ starts_with(line->buf, "TAP version") ||
+ starts_with(line->buf, "pragma"))
+ return 1;
+ if (starts_with(line->buf, "#"))
+ /*
+ * We're ignoring comments from now, but might treat them
+ * specially in the future for sanctioned messaging from the
+ * test-lib.sh.
+ */
+ return 0;
+ return 0;
+}
+
+int cmd__tee(int argc, const char **argv)
+{
+ int tap = 0;
+ int escape_stdout = 0, escape_file = 0;
+ char *prefix = NULL;
+ size_t prefix_len = 0;
+ const char *tee_usage[] = {
+ "test-tool tee [<options>] <FILE>",
+ NULL
+ };
+ struct option options[] = {
+ OPT_BOOL(0, "escape-stdout", &escape_stdout,
+ "escape output on stdout"),
+ OPT_BOOL(0, "escape-file", &escape_file,
+ "escape output written to file"),
+ OPT_BOOL(0, "tap", &tap,
+ "output is TAP"),
+ OPT_STRING(0, "prefix", &prefix, "str",
+ "prefix to strip from the output"),
+ OPT_END()
+ };
+ struct strbuf line = STRBUF_INIT;
+ FILE *logfp = NULL;
+
+ argc = parse_options(argc, argv, NULL, options,
+ tee_usage, PARSE_OPT_STOP_AT_NON_OPTION);
+ if (argc > 1) {
+ fprintf(stderr, "got bad option: %s\n", argv[0]);
+ usage_with_options(tee_usage, options);
+ }
+ if (prefix)
+ prefix_len = strlen(prefix);
+
+ if (argc)
+ logfp = xfopen(argv[0], "w");
+
+ while (strbuf_getline(&line, stdin) != EOF) {
+ size_t offs = 0;
+ if (prefix && starts_with(line.buf, prefix))
+ offs = prefix_len;
+
+ if (!offs && tap && line_has_tap(&line)) {
+ if (escape_stdout)
+ fprintf(stdout, "\\");
+ if (logfp && escape_file)
+ fprintf(logfp, "\\");
+ }
+
+ fprintf(stdout, "%s\n", line.buf + offs);
+ if (logfp)
+ fprintf(logfp, "%s\n", line.buf + offs);
+ }
+ strbuf_release(&line);
+ if (logfp)
+ fclose(logfp);
+
+ return 0;
+}
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index f97cd9f48a6..1876bad8f42 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -70,6 +70,7 @@ static struct test_cmd cmds[] = {
{ "submodule-config", cmd__submodule_config },
{ "submodule-nested-repo-config", cmd__submodule_nested_repo_config },
{ "subprocess", cmd__subprocess },
+ { "tee", cmd__tee },
{ "trace2", cmd__trace2 },
{ "urlmatch-normalization", cmd__urlmatch_normalization },
{ "xml-encode", cmd__xml_encode },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index 28072c0ad5a..9b3c1f75267 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -60,6 +60,7 @@ int cmd__string_list(int argc, const char **argv);
int cmd__submodule_config(int argc, const char **argv);
int cmd__submodule_nested_repo_config(int argc, const char **argv);
int cmd__subprocess(int argc, const char **argv);
+int cmd__tee(int argc, const char **argv);
int cmd__trace2(int argc, const char **argv);
int cmd__urlmatch_normalization(int argc, const char **argv);
int cmd__xml_encode(int argc, const char **argv);
--
2.31.0.rc1.210.g0f8085a843c
next prev parent reply other threads:[~2021-03-09 16:03 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-21 4:14 Prove "Tests out of sequence" Error Lars Schneider
2016-10-21 6:10 ` Stefan Beller
2016-10-21 8:20 ` Jeff King
2016-10-21 8:43 ` Jeff King
2016-10-21 10:41 ` [PATCH 0/3] fix travis TAP/--verbose conflict Jeff King
2016-10-21 10:42 ` [PATCH 1/3] test-lib: handle TEST_OUTPUT_DIRECTORY with spaces Jeff King
2016-10-21 10:48 ` [PATCH 2/3] test-lib: add --verbose-log option Jeff King
2016-10-21 17:12 ` Junio C Hamano
2016-10-21 21:46 ` Jeff King
2021-02-28 20:25 ` [PATCH/RFC] test-lib: make --verbose work under prove Ævar Arnfjörð Bjarmason
2021-03-01 9:51 ` Jeff King
2021-03-01 13:54 ` Ævar Arnfjörð Bjarmason
2021-03-09 16:02 ` [PATCH 0/6 + 1] test-lib: make --verbose output valid TAP Ævar Arnfjörð Bjarmason
2021-03-09 17:52 ` SZEDER Gábor
2021-03-09 21:03 ` Ævar Arnfjörð Bjarmason
2021-03-09 22:07 ` SZEDER Gábor
2021-03-09 16:02 ` [PATCH 1/7] test-lib: remove test_external Ævar Arnfjörð Bjarmason
2021-03-10 1:04 ` Junio C Hamano
2021-03-10 2:22 ` Ævar Arnfjörð Bjarmason
2021-03-09 16:02 ` [PATCH 2/7] test-lib: add say_color_tap helper to emit TAP format Ævar Arnfjörð Bjarmason
2021-03-10 0:39 ` Junio C Hamano
2021-03-09 16:02 ` [PATCH 3/7] test-lib: color "ok" TAP directives green under --verbose (or -x) Ævar Arnfjörð Bjarmason
2021-03-09 16:02 ` Ævar Arnfjörð Bjarmason [this message]
2021-03-09 16:02 ` [PATCH 5/7] test-lib: indent and format GIT_TEST_TEE_OUTPUT_FILE code Ævar Arnfjörð Bjarmason
2021-03-09 16:02 ` [PATCH 6/7] test-lib: make --verbose output valid TAP Ævar Arnfjörð Bjarmason
2021-03-09 18:59 ` SZEDER Gábor
2021-03-09 20:57 ` Ævar Arnfjörð Bjarmason
2021-03-09 21:31 ` SZEDER Gábor
2021-03-10 2:35 ` Ævar Arnfjörð Bjarmason
2021-03-16 9:10 ` Ævar Arnfjörð Bjarmason
2021-03-09 19:12 ` SZEDER Gábor
2021-03-10 1:11 ` Junio C Hamano
2021-03-10 7:42 ` Chris Torek
2021-03-09 16:02 ` [RFC/PATCH 7/7] test-lib: generate JUnit output via TAP Ævar Arnfjörð Bjarmason
2021-03-19 14:14 ` Johannes Schindelin
2021-03-21 0:28 ` Ævar Arnfjörð Bjarmason
2021-03-22 13:46 ` Johannes Schindelin
2016-10-21 10:48 ` [PATCH 3/3] travis: use --verbose-log test option Jeff King
2016-10-21 17:19 ` [PATCH 0/3] fix travis TAP/--verbose conflict Stefan Beller
2016-10-24 18:06 ` Lars Schneider
2016-10-21 15:29 ` Prove "Tests out of sequence" Error Jacob Keller
2016-10-21 15:35 ` Jeff King
2016-10-21 15:42 ` Jacob Keller
2016-10-21 15:48 ` Jeff King
2016-10-21 16:15 ` Jacob Keller
2016-10-22 4:45 ` [PATCH 4/3] test-lib: bail out when "-v" used under "prove" Jeff King
2016-10-22 5:25 ` Jacob Keller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210309160219.13779-5-avarab@gmail.com \
--to=avarab@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
--cc=szeder.dev@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).