{"thread":{"id":"55066","subject":"[PATCH 1/4] t0000: keep clean-up tests together","startedAt":"2021-01-28T06:33:21Z","lastAt":"2021-01-28T06:33:24Z","messageCount":5,"participants":["Jeff King"],"isPatch":true,"patchVersion":1,"patchTotal":4},"messages":[{"id":"415491","messageId":"YBJafCJNjPS62vkI@coredump.intra.peff.net","threadId":"55066","inReplyTo":"YBJab/tKDKOtH+p0@coredump.intra.peff.net","subject":"[PATCH 1/4] t0000: keep clean-up tests together","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2021-01-28T06:32:28Z","receivedAt":"2021-01-28T06:33:21Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"We check that test_when_finished cleans up after a test, and that it\nruns even after a failure. Those two were originally adjacent, but got\nsplit apart by the new test added in 477dcaddb6 (tests: do not let lazy\nprereqs inside `test_expect_*` turn off tracing, 2020-03-26), and then\nfurther by more lazy-prereq tests. Let's move them back together.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n t/t0000-basic.sh | 22 +++++++++++-----------\n 1 file changed, 11 insertions(+), 11 deletions(-)\n\ndiff --git a/t/t0000-basic.sh b/t/t0000-basic.sh\nindex f4ba2e8c85..d49b5dd4ac 100755\n--- a/t/t0000-basic.sh\n+++ b/t/t0000-basic.sh\n@@ -829,17 +829,6 @@ then\n \texit 1\n fi\n \n-clean=no\n-test_expect_success 'tests clean up after themselves' '\n-\ttest_when_finished clean=yes\n-'\n-\n-if test -z \"$GIT_TEST_FAIL_PREREQS_INTERNAL\" -a $clean != yes\n-then\n-\tsay \"bug in test framework: basic cleanup command does not work reliably\"\n-\texit 1\n-fi\n-\n test_lazy_prereq NESTED_INNER '\n \t>inner &&\n \trm -f outer\n@@ -874,6 +863,17 @@ test_expect_success 'lazy prereqs do not turn off tracing' \"\n \tgrep 'echo trace' lazy-prereq-and-tracing/err\n \"\n \n+clean=no\n+test_expect_success 'tests clean up after themselves' '\n+\ttest_when_finished clean=yes\n+'\n+\n+if test -z \"$GIT_TEST_FAIL_PREREQS_INTERNAL\" -a $clean != yes\n+then\n+\tsay \"bug in test framework: basic cleanup command does not work reliably\"\n+\texit 1\n+fi\n+\n test_expect_success 'tests clean up even on failures' \"\n \trun_sub_test_lib_test_err \\\n \t\tfailing-cleanup 'Failing tests with cleanup commands' <<-\\\\EOF &&\n-- \n2.30.0.758.gfe500d6872\n\n"},{"id":"415492","messageId":"YBJab/tKDKOtH+p0@coredump.intra.peff.net","threadId":"55066","inReplyTo":null,"subject":"[PATCH 0/4] t0000 cleanups","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2021-01-28T06:32:15Z","receivedAt":"2021-01-28T06:33:21Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"This is a re-send of some cleanups from:\n\n  https://lore.kernel.org/git/20201120001458.GA274082@coredump.intra.peff.net/\n\nThere were some textual conflicts back then which would have been\ntedious to resolve, so we punted. Now that the requisite commits are all\nin master, this can be applied there without any conflicts.\n\n  [1/4]: t0000: keep clean-up tests together\n  [2/4]: t0000: run prereq tests inside sub-test\n  [3/4]: t0000: run cleaning test inside sub-test\n  [4/4]: t0000: consistently use single quotes for outer tests\n\n t/t0000-basic.sh | 570 +++++++++++++++++++++++------------------------\n 1 file changed, 284 insertions(+), 286 deletions(-)\n\n-Peff\n"},{"id":"415493","messageId":"YBJag+93WVW+V/U3@coredump.intra.peff.net","threadId":"55066","inReplyTo":"YBJab/tKDKOtH+p0@coredump.intra.peff.net","subject":"[PATCH 3/4] t0000: run cleaning test inside sub-test","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2021-01-28T06:32:35Z","receivedAt":"2021-01-28T06:33:21Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"Our check of test_when_finished is done directly in the main script, and\nif we failed to clean, we complain and exit immediately. It's nicer to\nsignal a test failure here, for a few reasons:\n\n  - this gives better output to the user when run under a TAP harness\n    like \"prove\"\n\n  - constency; it's the only test left in the file that behaves this way\n\n  - half of its \"if\" conditional is nonsense anyway; it picked up a\n    reference to GIT_TEST_FAIL_PREREQS_INTERNAL in dfe1a17df9 (tests:\n    add a special setup where prerequisites fail, 2019-05-13) along with\n    its neighbors, even though it has nothing to do with that flag\n\nWe could actually do this without a sub-test at all, and just put our\ntwo tests (one to do cleanup, and one to check that it happened) in the\nmain script. But doing it in a subtest is conceptually cleaner (from the\nperspective of the main test script, we are checking only one thing),\nand it remains consistent with the \"cleanup when failing\" test directly\nafter it, which has to happen in a sub-test (to avoid the main script\ncomplaining of the failed test).\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n t/t0000-basic.sh | 25 +++++++++++++++++--------\n 1 file changed, 17 insertions(+), 8 deletions(-)\n\ndiff --git a/t/t0000-basic.sh b/t/t0000-basic.sh\nindex 3d36a87610..502375bdf6 100755\n--- a/t/t0000-basic.sh\n+++ b/t/t0000-basic.sh\n@@ -852,16 +852,25 @@ test_expect_success 'lazy prereqs do not turn off tracing' \"\n \tgrep 'echo trace' lazy-prereq-and-tracing/err\n \"\n \n-clean=no\n test_expect_success 'tests clean up after themselves' '\n-\ttest_when_finished clean=yes\n-'\n+\trun_sub_test_lib_test cleanup \"test with cleanup\" <<-\\EOF &&\n+\tclean=no\n+\ttest_expect_success \"do cleanup\" \"\n+\t\ttest_when_finished clean=yes\n+\t\"\n+\ttest_expect_success \"cleanup happened\" \"\n+\t\ttest $clean = yes\n+\t\"\n+\ttest_done\n+\tEOF\n \n-if test -z \"$GIT_TEST_FAIL_PREREQS_INTERNAL\" -a $clean != yes\n-then\n-\tsay \"bug in test framework: basic cleanup command does not work reliably\"\n-\texit 1\n-fi\n+\tcheck_sub_test_lib_test cleanup <<-\\EOF\n+\tok 1 - do cleanup\n+\tok 2 - cleanup happened\n+\t# passed all 2 test(s)\n+\t1..2\n+\tEOF\n+'\n \n test_expect_success 'tests clean up even on failures' \"\n \trun_sub_test_lib_test_err \\\n-- \n2.30.0.758.gfe500d6872\n\n"},{"id":"415494","messageId":"YBJagLna/9JVeWdp@coredump.intra.peff.net","threadId":"55066","inReplyTo":"YBJab/tKDKOtH+p0@coredump.intra.peff.net","subject":"[PATCH 2/4] t0000: run prereq tests inside sub-test","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2021-01-28T06:32:32Z","receivedAt":"2021-01-28T06:33:21Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"We test the behavior of prerequisites in t0000 by setting up fake ones\nin the main test script, trying to run some tests, and then seeing if\nthose tests impacted the environment correctly. If they didn't, then we\nwrite a message and manually call exit.\n\nInstead, let's push these down into a sub-test, like many of the other\ntests covering the framework itself. This has a few advantages:\n\n  - it does not pollute the test output with mention of skipped tests\n    (that we know are uninteresting -- the point of the test was to see\n    that these are skipped).\n\n  - when running in a TAP harness, we get a useful test failure message\n    (whereas when the script exits early, a tool like \"prove\" simply\n    says \"Dubious, test returned 1\").\n\n  - we do not have to worry about different test environments, such as\n    when GIT_TEST_FAIL_PREREQS_INTERNAL is set. Our sub-test helpers\n    already give us a known environment.\n\n  - the tests themselves are a bit easier to read, as we can just check\n    the test-framework output to see what happened (and get the usual\n    test_cmp diff if it failed)\n\nA few notes on the implementation:\n\n  - we could do one sub-test per each individual test_expect_success. I\n    broke it up here into a few logical groups, as I think this makes it\n    more readable\n\n  - the original tests modified environment variables inside the test\n    bodies. Instead, I've used \"true\" as the body of a test we expect to\n    run and \"false\" otherwise. Technically this does not confirm that\n    the body of the \"true\" test actually ran. We are trusting the\n    framework output to believe that it truly ran, which is sufficient\n    for these tests. And I think the end result is much simpler to\n    follow.\n\n  - the nested_prereq test uses a few bare \"test -f\" calls; I converted\n    these to our usual test_path_is_* helpers while moving the code\n    around.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n t/t0000-basic.sh | 149 ++++++++++++++++++++++-------------------------\n 1 file changed, 69 insertions(+), 80 deletions(-)\n\ndiff --git a/t/t0000-basic.sh b/t/t0000-basic.sh\nindex d49b5dd4ac..3d36a87610 100755\n--- a/t/t0000-basic.sh\n+++ b/t/t0000-basic.sh\n@@ -759,96 +759,85 @@ test_expect_success '--run invalid range end' \"\n \tEOF_ERR\n \"\n \n+test_expect_success 'tests respect prerequisites' '\n+\trun_sub_test_lib_test prereqs \"tests respect prereqs\" <<-\\EOF &&\n \n-test_set_prereq HAVEIT\n-haveit=no\n-test_expect_success HAVEIT 'test runs if prerequisite is satisfied' '\n-\ttest_have_prereq HAVEIT &&\n-\thaveit=yes\n-'\n-donthaveit=yes\n-test_expect_success DONTHAVEIT 'unmet prerequisite causes test to be skipped' '\n-\tdonthaveit=no\n-'\n-if test -z \"$GIT_TEST_FAIL_PREREQS_INTERNAL\" -a $haveit$donthaveit != yesyes\n-then\n-\tsay \"bug in test framework: prerequisite tags do not work reliably\"\n-\texit 1\n-fi\n+\ttest_set_prereq HAVEIT\n+\ttest_expect_success HAVEIT \"prereq is satisfied\" \"true\"\n+\ttest_expect_success \"have_prereq works\" \"\n+\t\ttest_have_prereq HAVEIT\n+\t\"\n+\ttest_expect_success DONTHAVEIT \"prereq not satisfied\" \"false\"\n \n-test_set_prereq HAVETHIS\n-haveit=no\n-test_expect_success HAVETHIS,HAVEIT 'test runs if prerequisites are satisfied' '\n-\ttest_have_prereq HAVEIT &&\n-\ttest_have_prereq HAVETHIS &&\n-\thaveit=yes\n-'\n-donthaveit=yes\n-test_expect_success HAVEIT,DONTHAVEIT 'unmet prerequisites causes test to be skipped' '\n-\tdonthaveit=no\n-'\n-donthaveiteither=yes\n-test_expect_success DONTHAVEIT,HAVEIT 'unmet prerequisites causes test to be skipped' '\n-\tdonthaveiteither=no\n-'\n-if test -z \"$GIT_TEST_FAIL_PREREQS_INTERNAL\" -a $haveit$donthaveit$donthaveiteither != yesyesyes\n-then\n-\tsay \"bug in test framework: multiple prerequisite tags do not work reliably\"\n-\texit 1\n-fi\n+\ttest_set_prereq HAVETHIS\n+\ttest_expect_success HAVETHIS,HAVEIT \"multiple prereqs\" \"true\"\n+\ttest_expect_success HAVEIT,DONTHAVEIT \"mixed prereqs (yes,no)\" \"false\"\n+\ttest_expect_success DONTHAVEIT,HAVEIT \"mixed prereqs (no,yes)\" \"false\"\n \n-test_lazy_prereq LAZY_TRUE true\n-havetrue=no\n-test_expect_success LAZY_TRUE 'test runs if lazy prereq is satisfied' '\n-\thavetrue=yes\n-'\n-donthavetrue=yes\n-test_expect_success !LAZY_TRUE 'missing lazy prereqs skip tests' '\n-\tdonthavetrue=no\n+\ttest_done\n+\tEOF\n+\n+\tcheck_sub_test_lib_test prereqs <<-\\EOF\n+\tok 1 - prereq is satisfied\n+\tok 2 - have_prereq works\n+\tok 3 # skip prereq not satisfied (missing DONTHAVEIT)\n+\tok 4 - multiple prereqs\n+\tok 5 # skip mixed prereqs (yes,no) (missing DONTHAVEIT of HAVEIT,DONTHAVEIT)\n+\tok 6 # skip mixed prereqs (no,yes) (missing DONTHAVEIT of DONTHAVEIT,HAVEIT)\n+\t# passed all 6 test(s)\n+\t1..6\n+\tEOF\n '\n \n-if test -z \"$GIT_TEST_FAIL_PREREQS_INTERNAL\" -a \"$havetrue$donthavetrue\" != yesyes\n-then\n-\tsay 'bug in test framework: lazy prerequisites do not work'\n-\texit 1\n-fi\n+test_expect_success 'tests respect lazy prerequisites' '\n+\trun_sub_test_lib_test lazy-prereqs \"respect lazy prereqs\" <<-\\EOF &&\n \n-test_lazy_prereq LAZY_FALSE false\n-nothavefalse=no\n-test_expect_success !LAZY_FALSE 'negative lazy prereqs checked' '\n-\tnothavefalse=yes\n-'\n-havefalse=yes\n-test_expect_success LAZY_FALSE 'missing negative lazy prereqs will skip' '\n-\thavefalse=no\n-'\n+\ttest_lazy_prereq LAZY_TRUE true\n+\ttest_expect_success LAZY_TRUE \"lazy prereq is satisifed\" \"true\"\n+\ttest_expect_success !LAZY_TRUE \"negative lazy prereq\" \"false\"\n \n-if test -z \"$GIT_TEST_FAIL_PREREQS_INTERNAL\" -a \"$nothavefalse$havefalse\" != yesyes\n-then\n-\tsay 'bug in test framework: negative lazy prerequisites do not work'\n-\texit 1\n-fi\n+\ttest_lazy_prereq LAZY_FALSE false\n+\ttest_expect_success LAZY_FALSE \"lazy prereq not satisfied\" \"false\"\n+\ttest_expect_success !LAZY_FALSE \"negative false prereq\" \"true\"\n \n-test_lazy_prereq NESTED_INNER '\n-\t>inner &&\n-\trm -f outer\n-'\n-test_lazy_prereq NESTED_PREREQ '\n-\t>outer &&\n-\ttest_have_prereq NESTED_INNER &&\n-\techo \"can create new file in cwd\" >file &&\n-\ttest -f outer &&\n-\ttest ! -f inner\n-'\n-test_expect_success NESTED_PREREQ 'evaluating nested lazy prereqs dont interfere with each other' '\n-\tnestedworks=yes\n+\ttest_done\n+\tEOF\n+\n+\tcheck_sub_test_lib_test lazy-prereqs <<-\\EOF\n+\tok 1 - lazy prereq is satisifed\n+\tok 2 # skip negative lazy prereq (missing !LAZY_TRUE)\n+\tok 3 # skip lazy prereq not satisfied (missing LAZY_FALSE)\n+\tok 4 - negative false prereq\n+\t# passed all 4 test(s)\n+\t1..4\n+\tEOF\n '\n \n-if test -z \"$GIT_TEST_FAIL_PREREQS_INTERNAL\" && test \"$nestedworks\" != yes\n-then\n-\tsay 'bug in test framework: nested lazy prerequisites do not work'\n-\texit 1\n-fi\n+test_expect_success 'nested lazy prerequisites' '\n+\trun_sub_test_lib_test nested-lazy \"nested lazy prereqs\" <<-\\EOF &&\n+\n+\ttest_lazy_prereq NESTED_INNER \"\n+\t\t>inner &&\n+\t\trm -f outer\n+\t\"\n+\ttest_lazy_prereq NESTED_PREREQ \"\n+\t\t>outer &&\n+\t\ttest_have_prereq NESTED_INNER &&\n+\t\techo can create new file in cwd >file &&\n+\t\ttest_path_is_file outer &&\n+\t\ttest_path_is_missing inner\n+\t\"\n+\ttest_expect_success NESTED_PREREQ \"evaluate nested prereq\" \"true\"\n+\n+\ttest_done\n+\tEOF\n+\n+\tcheck_sub_test_lib_test nested-lazy <<-\\EOF\n+\tok 1 - evaluate nested prereq\n+\t# passed all 1 test(s)\n+\t1..1\n+\tEOF\n+'\n \n test_expect_success 'lazy prereqs do not turn off tracing' \"\n \trun_sub_test_lib_test lazy-prereq-and-tracing \\\n-- \n2.30.0.758.gfe500d6872\n\n"},{"id":"415495","messageId":"YBJahevyXE67PdNo@coredump.intra.peff.net","threadId":"55066","inReplyTo":"YBJab/tKDKOtH+p0@coredump.intra.peff.net","subject":"[PATCH 4/4] t0000: consistently use single quotes for outer tests","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2021-01-28T06:32:37Z","receivedAt":"2021-01-28T06:33:24Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"When we use the sub-test helpers, we end up defining one shell snippet\ninside another shell snippet. So if we use single-quotes for the outer\nsnippet, we have to use double-quotes within the inner snippet (it's\nincluded as here-doc within the outer snippet, but using a single quote\nwould end the outer snippet early). Or vice versa we can use double\nquotes for the outer snippet, but then single quotes in the inner.\n\nWe have some of each in the script, and neither is wrong. But it would\nbe nice to be consistent unless there is a good reason not to. Using\nsingle quotes for the outer script is preferable, because it requires\nless metacharacter quoting overall. For example, in:\n\n  test_expect_success 'outer' '\n\trun_sub_test_lib_test ...  <<-\\EOF\n\t\techo $foo &&\n\t\ttest_expect_success \"inner\" \"\n\t\t\techo \\$bar\n\t\t\"\n\tEOF\n  '\n\nwe need only quote inside \"inner\", but not inside \"outer\" or the\nhere-doc. Whereas if we flip them, we have to quote in both places:\n\n  test_expect_success 'outer' \"\n\trun_sub_test_lib_test ...  <<-\\EOF\n\t\techo \\$foo &&\n\t\ttest_expect_success 'inner' '\n\t\t\techo \\$bar\n\t\t'\n\tEOF\n  \"\n\nThe exception is when we need a literal single-quote in an expected\noutput here-doc. There we can either use outer double-quotes, or just\nuse ${SQ} within the doc. I chose the latter for consistency (within\nthis test, but also with other test scripts that face the same problem).\n\nThere is one other interesting case, which is some tests that do:\n\n  test_expect_success ... \"\n\tdo_something --run='\"'!3'\"'\n  \"\n\nThis is rather confusing to read, but is correct. The outer script sees\n'!3' in single-quotes, as does the eval'd snippet. This is perhaps being\noverly cautious. In many interactive shells, an exclamation triggers\nhistory expansion even inside double quotes, but that is not generally\ntrue in non-interactive shells.\n\nThere's some conflicting information here. Commit 784ce03d55 (t4216:\navoid unnecessary subshell in test_bloom_filters_not_used, 2020-05-19)\nreports it as a problem with OpenBSD 6.7's /bin/sh. However, we have\nmany instances in this script of prereqs like !LAZY_TRUE, which haven't\nbeen a problem. I left them un-escaped here to test out this theory.\nIt's much nicer if we can not worry about this as a portability issue,\nso it's worth knowing.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n t/t0000-basic.sh | 380 +++++++++++++++++++++++------------------------\n 1 file changed, 190 insertions(+), 190 deletions(-)\n\ndiff --git a/t/t0000-basic.sh b/t/t0000-basic.sh\nindex 502375bdf6..a6e570d674 100755\n--- a/t/t0000-basic.sh\n+++ b/t/t0000-basic.sh\n@@ -135,77 +135,77 @@ check_sub_test_lib_test_err () {\n \t)\n }\n \n-test_expect_success 'pretend we have a fully passing test suite' \"\n-\trun_sub_test_lib_test full-pass '3 passing tests' <<-\\\\EOF &&\n+test_expect_success 'pretend we have a fully passing test suite' '\n+\trun_sub_test_lib_test full-pass \"3 passing tests\" <<-\\EOF &&\n \tfor i in 1 2 3\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test full-pass <<-\\\\EOF\n+\tcheck_sub_test_lib_test full-pass <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 - passing test #2\n \t> ok 3 - passing test #3\n \t> # passed all 3 test(s)\n \t> 1..3\n \tEOF\n-\"\n+'\n \n-test_expect_success 'pretend we have a partially passing test suite' \"\n+test_expect_success 'pretend we have a partially passing test suite' '\n \trun_sub_test_lib_test_err \\\n-\t\tpartial-pass '2/3 tests passing' <<-\\\\EOF &&\n-\ttest_expect_success 'passing test #1' 'true'\n-\ttest_expect_success 'failing test #2' 'false'\n-\ttest_expect_success 'passing test #3' 'true'\n+\t\tpartial-pass \"2/3 tests passing\" <<-\\EOF &&\n+\ttest_expect_success \"passing test #1\" \"true\"\n+\ttest_expect_success \"failing test #2\" \"false\"\n+\ttest_expect_success \"passing test #3\" \"true\"\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test partial-pass <<-\\\\EOF\n+\tcheck_sub_test_lib_test partial-pass <<-\\EOF\n \t> ok 1 - passing test #1\n \t> not ok 2 - failing test #2\n \t#\tfalse\n \t> ok 3 - passing test #3\n \t> # failed 1 among 3 test(s)\n \t> 1..3\n \tEOF\n-\"\n+'\n \n-test_expect_success 'pretend we have a known breakage' \"\n-\trun_sub_test_lib_test failing-todo 'A failing TODO test' <<-\\\\EOF &&\n-\ttest_expect_success 'passing test' 'true'\n-\ttest_expect_failure 'pretend we have a known breakage' 'false'\n+test_expect_success 'pretend we have a known breakage' '\n+\trun_sub_test_lib_test failing-todo \"A failing TODO test\" <<-\\EOF &&\n+\ttest_expect_success \"passing test\" \"true\"\n+\ttest_expect_failure \"pretend we have a known breakage\" \"false\"\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test failing-todo <<-\\\\EOF\n+\tcheck_sub_test_lib_test failing-todo <<-\\EOF\n \t> ok 1 - passing test\n \t> not ok 2 - pretend we have a known breakage # TODO known breakage\n \t> # still have 1 known breakage(s)\n \t> # passed all remaining 1 test(s)\n \t> 1..2\n \tEOF\n-\"\n+'\n \n-test_expect_success 'pretend we have fixed a known breakage' \"\n-\trun_sub_test_lib_test passing-todo 'A passing TODO test' <<-\\\\EOF &&\n-\ttest_expect_failure 'pretend we have fixed a known breakage' 'true'\n+test_expect_success 'pretend we have fixed a known breakage' '\n+\trun_sub_test_lib_test passing-todo \"A passing TODO test\" <<-\\EOF &&\n+\ttest_expect_failure \"pretend we have fixed a known breakage\" \"true\"\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test passing-todo <<-\\\\EOF\n+\tcheck_sub_test_lib_test passing-todo <<-\\EOF\n \t> ok 1 - pretend we have fixed a known breakage # TODO known breakage vanished\n \t> # 1 known breakage(s) vanished; please update test(s)\n \t> 1..1\n \tEOF\n-\"\n+'\n \n-test_expect_success 'pretend we have fixed one of two known breakages (run in sub test-lib)' \"\n+test_expect_success 'pretend we have fixed one of two known breakages (run in sub test-lib)' '\n \trun_sub_test_lib_test partially-passing-todos \\\n-\t\t'2 TODO tests, one passing' <<-\\\\EOF &&\n-\ttest_expect_failure 'pretend we have a known breakage' 'false'\n-\ttest_expect_success 'pretend we have a passing test' 'true'\n-\ttest_expect_failure 'pretend we have fixed another known breakage' 'true'\n+\t\t\"2 TODO tests, one passing\" <<-\\EOF &&\n+\ttest_expect_failure \"pretend we have a known breakage\" \"false\"\n+\ttest_expect_success \"pretend we have a passing test\" \"true\"\n+\ttest_expect_failure \"pretend we have fixed another known breakage\" \"true\"\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test partially-passing-todos <<-\\\\EOF\n+\tcheck_sub_test_lib_test partially-passing-todos <<-\\EOF\n \t> not ok 1 - pretend we have a known breakage # TODO known breakage\n \t> ok 2 - pretend we have a passing test\n \t> ok 3 - pretend we have fixed another known breakage # TODO known breakage vanished\n@@ -214,17 +214,17 @@ test_expect_success 'pretend we have fixed one of two known breakages (run in su\n \t> # passed all remaining 1 test(s)\n \t> 1..3\n \tEOF\n-\"\n+'\n \n-test_expect_success 'pretend we have a pass, fail, and known breakage' \"\n+test_expect_success 'pretend we have a pass, fail, and known breakage' '\n \trun_sub_test_lib_test_err \\\n-\t\tmixed-results1 'mixed results #1' <<-\\\\EOF &&\n-\ttest_expect_success 'passing test' 'true'\n-\ttest_expect_success 'failing test' 'false'\n-\ttest_expect_failure 'pretend we have a known breakage' 'false'\n+\t\tmixed-results1 \"mixed results #1\" <<-\\EOF &&\n+\ttest_expect_success \"passing test\" \"true\"\n+\ttest_expect_success \"failing test\" \"false\"\n+\ttest_expect_failure \"pretend we have a known breakage\" \"false\"\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test mixed-results1 <<-\\\\EOF\n+\tcheck_sub_test_lib_test mixed-results1 <<-\\EOF\n \t> ok 1 - passing test\n \t> not ok 2 - failing test\n \t> #\tfalse\n@@ -233,24 +233,24 @@ test_expect_success 'pretend we have a pass, fail, and known breakage' \"\n \t> # failed 1 among remaining 2 test(s)\n \t> 1..3\n \tEOF\n-\"\n+'\n \n-test_expect_success 'pretend we have a mix of all possible results' \"\n+test_expect_success 'pretend we have a mix of all possible results' '\n \trun_sub_test_lib_test_err \\\n-\t\tmixed-results2 'mixed results #2' <<-\\\\EOF &&\n-\ttest_expect_success 'passing test' 'true'\n-\ttest_expect_success 'passing test' 'true'\n-\ttest_expect_success 'passing test' 'true'\n-\ttest_expect_success 'passing test' 'true'\n-\ttest_expect_success 'failing test' 'false'\n-\ttest_expect_success 'failing test' 'false'\n-\ttest_expect_success 'failing test' 'false'\n-\ttest_expect_failure 'pretend we have a known breakage' 'false'\n-\ttest_expect_failure 'pretend we have a known breakage' 'false'\n-\ttest_expect_failure 'pretend we have fixed a known breakage' 'true'\n+\t\tmixed-results2 \"mixed results #2\" <<-\\EOF &&\n+\ttest_expect_success \"passing test\" \"true\"\n+\ttest_expect_success \"passing test\" \"true\"\n+\ttest_expect_success \"passing test\" \"true\"\n+\ttest_expect_success \"passing test\" \"true\"\n+\ttest_expect_success \"failing test\" \"false\"\n+\ttest_expect_success \"failing test\" \"false\"\n+\ttest_expect_success \"failing test\" \"false\"\n+\ttest_expect_failure \"pretend we have a known breakage\" \"false\"\n+\ttest_expect_failure \"pretend we have a known breakage\" \"false\"\n+\ttest_expect_failure \"pretend we have fixed a known breakage\" \"true\"\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test mixed-results2 <<-\\\\EOF\n+\tcheck_sub_test_lib_test mixed-results2 <<-\\EOF\n \t> ok 1 - passing test\n \t> ok 2 - passing test\n \t> ok 3 - passing test\n@@ -269,7 +269,7 @@ test_expect_success 'pretend we have a mix of all possible results' \"\n \t> # failed 3 among remaining 7 test(s)\n \t> 1..10\n \tEOF\n-\"\n+'\n \n test_expect_success C_LOCALE_OUTPUT 'test --verbose' '\n \trun_sub_test_lib_test_err \\\n@@ -321,39 +321,39 @@ test_expect_success 'test --verbose-only' '\n \tEOF\n '\n \n-test_expect_success 'GIT_SKIP_TESTS' \"\n+test_expect_success 'GIT_SKIP_TESTS' '\n \t(\n-\t\tGIT_SKIP_TESTS='git.2' && export GIT_SKIP_TESTS &&\n+\t\tGIT_SKIP_TESTS=\"git.2\" && export GIT_SKIP_TESTS &&\n \t\trun_sub_test_lib_test git-skip-tests-basic \\\n-\t\t\t'GIT_SKIP_TESTS' <<-\\\\EOF &&\n+\t\t\t\"GIT_SKIP_TESTS\" <<-\\EOF &&\n \t\tfor i in 1 2 3\n \t\tdo\n-\t\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\t\ttest_expect_success \"passing test #$i\" \"true\"\n \t\tdone\n \t\ttest_done\n \t\tEOF\n-\t\tcheck_sub_test_lib_test git-skip-tests-basic <<-\\\\EOF\n+\t\tcheck_sub_test_lib_test git-skip-tests-basic <<-\\EOF\n \t\t> ok 1 - passing test #1\n \t\t> ok 2 # skip passing test #2 (GIT_SKIP_TESTS)\n \t\t> ok 3 - passing test #3\n \t\t> # passed all 3 test(s)\n \t\t> 1..3\n \t\tEOF\n \t)\n-\"\n+'\n \n-test_expect_success 'GIT_SKIP_TESTS several tests' \"\n+test_expect_success 'GIT_SKIP_TESTS several tests' '\n \t(\n-\t\tGIT_SKIP_TESTS='git.2 git.5' && export GIT_SKIP_TESTS &&\n+\t\tGIT_SKIP_TESTS=\"git.2 git.5\" && export GIT_SKIP_TESTS &&\n \t\trun_sub_test_lib_test git-skip-tests-several \\\n-\t\t\t'GIT_SKIP_TESTS several tests' <<-\\\\EOF &&\n+\t\t\t\"GIT_SKIP_TESTS several tests\" <<-\\EOF &&\n \t\tfor i in 1 2 3 4 5 6\n \t\tdo\n-\t\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\t\ttest_expect_success \"passing test #$i\" \"true\"\n \t\tdone\n \t\ttest_done\n \t\tEOF\n-\t\tcheck_sub_test_lib_test git-skip-tests-several <<-\\\\EOF\n+\t\tcheck_sub_test_lib_test git-skip-tests-several <<-\\EOF\n \t\t> ok 1 - passing test #1\n \t\t> ok 2 # skip passing test #2 (GIT_SKIP_TESTS)\n \t\t> ok 3 - passing test #3\n@@ -364,20 +364,20 @@ test_expect_success 'GIT_SKIP_TESTS several tests' \"\n \t\t> 1..6\n \t\tEOF\n \t)\n-\"\n+'\n \n-test_expect_success 'GIT_SKIP_TESTS sh pattern' \"\n+test_expect_success 'GIT_SKIP_TESTS sh pattern' '\n \t(\n-\t\tGIT_SKIP_TESTS='git.[2-5]' && export GIT_SKIP_TESTS &&\n+\t\tGIT_SKIP_TESTS=\"git.[2-5]\" && export GIT_SKIP_TESTS &&\n \t\trun_sub_test_lib_test git-skip-tests-sh-pattern \\\n-\t\t\t'GIT_SKIP_TESTS sh pattern' <<-\\\\EOF &&\n+\t\t\t\"GIT_SKIP_TESTS sh pattern\" <<-\\EOF &&\n \t\tfor i in 1 2 3 4 5 6\n \t\tdo\n-\t\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\t\ttest_expect_success \"passing test #$i\" \"true\"\n \t\tdone\n \t\ttest_done\n \t\tEOF\n-\t\tcheck_sub_test_lib_test git-skip-tests-sh-pattern <<-\\\\EOF\n+\t\tcheck_sub_test_lib_test git-skip-tests-sh-pattern <<-\\EOF\n \t\t> ok 1 - passing test #1\n \t\t> ok 2 # skip passing test #2 (GIT_SKIP_TESTS)\n \t\t> ok 3 # skip passing test #3 (GIT_SKIP_TESTS)\n@@ -388,56 +388,56 @@ test_expect_success 'GIT_SKIP_TESTS sh pattern' \"\n \t\t> 1..6\n \t\tEOF\n \t)\n-\"\n+'\n \n-test_expect_success 'GIT_SKIP_TESTS entire suite' \"\n+test_expect_success 'GIT_SKIP_TESTS entire suite' '\n \t(\n-\t\tGIT_SKIP_TESTS='git' && export GIT_SKIP_TESTS &&\n+\t\tGIT_SKIP_TESTS=\"git\" && export GIT_SKIP_TESTS &&\n \t\trun_sub_test_lib_test git-skip-tests-entire-suite \\\n-\t\t\t'GIT_SKIP_TESTS entire suite' <<-\\\\EOF &&\n+\t\t\t\"GIT_SKIP_TESTS entire suite\" <<-\\EOF &&\n \t\tfor i in 1 2 3\n \t\tdo\n-\t\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\t\ttest_expect_success \"passing test #$i\" \"true\"\n \t\tdone\n \t\ttest_done\n \t\tEOF\n-\t\tcheck_sub_test_lib_test git-skip-tests-entire-suite <<-\\\\EOF\n+\t\tcheck_sub_test_lib_test git-skip-tests-entire-suite <<-\\EOF\n \t\t> 1..0 # SKIP skip all tests in git\n \t\tEOF\n \t)\n-\"\n+'\n \n-test_expect_success 'GIT_SKIP_TESTS does not skip unmatched suite' \"\n+test_expect_success 'GIT_SKIP_TESTS does not skip unmatched suite' '\n \t(\n-\t\tGIT_SKIP_TESTS='notgit' && export GIT_SKIP_TESTS &&\n+\t\tGIT_SKIP_TESTS=\"notgit\" && export GIT_SKIP_TESTS &&\n \t\trun_sub_test_lib_test git-skip-tests-unmatched-suite \\\n-\t\t\t'GIT_SKIP_TESTS does not skip unmatched suite' <<-\\\\EOF &&\n+\t\t\t\"GIT_SKIP_TESTS does not skip unmatched suite\" <<-\\EOF &&\n \t\tfor i in 1 2 3\n \t\tdo\n-\t\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\t\ttest_expect_success \"passing test #$i\" \"true\"\n \t\tdone\n \t\ttest_done\n \t\tEOF\n-\t\tcheck_sub_test_lib_test git-skip-tests-unmatched-suite <<-\\\\EOF\n+\t\tcheck_sub_test_lib_test git-skip-tests-unmatched-suite <<-\\EOF\n \t\t> ok 1 - passing test #1\n \t\t> ok 2 - passing test #2\n \t\t> ok 3 - passing test #3\n \t\t> # passed all 3 test(s)\n \t\t> 1..3\n \t\tEOF\n \t)\n-\"\n+'\n \n-test_expect_success '--run basic' \"\n+test_expect_success '--run basic' '\n \trun_sub_test_lib_test run-basic \\\n-\t\t'--run basic' --run='1,3,5' <<-\\\\EOF &&\n+\t\t\"--run basic\" --run=\"1,3,5\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-basic <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-basic <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 # skip passing test #2 (--run)\n \t> ok 3 - passing test #3\n@@ -447,18 +447,18 @@ test_expect_success '--run basic' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run with a range' \"\n+test_expect_success '--run with a range' '\n \trun_sub_test_lib_test run-range \\\n-\t\t'--run with a range' --run='1-3' <<-\\\\EOF &&\n+\t\t\"--run with a range\" --run=\"1-3\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-range <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-range <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 - passing test #2\n \t> ok 3 - passing test #3\n@@ -468,18 +468,18 @@ test_expect_success '--run with a range' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run with two ranges' \"\n+test_expect_success '--run with two ranges' '\n \trun_sub_test_lib_test run-two-ranges \\\n-\t\t'--run with two ranges' --run='1-2,5-6' <<-\\\\EOF &&\n+\t\t\"--run with two ranges\" --run=\"1-2,5-6\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-two-ranges <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-two-ranges <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 - passing test #2\n \t> ok 3 # skip passing test #3 (--run)\n@@ -489,18 +489,18 @@ test_expect_success '--run with two ranges' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run with a left open range' \"\n+test_expect_success '--run with a left open range' '\n \trun_sub_test_lib_test run-left-open-range \\\n-\t\t'--run with a left open range' --run='-3' <<-\\\\EOF &&\n+\t\t\"--run with a left open range\" --run=\"-3\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-left-open-range <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-left-open-range <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 - passing test #2\n \t> ok 3 - passing test #3\n@@ -510,18 +510,18 @@ test_expect_success '--run with a left open range' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run with a right open range' \"\n+test_expect_success '--run with a right open range' '\n \trun_sub_test_lib_test run-right-open-range \\\n-\t\t'--run with a right open range' --run='4-' <<-\\\\EOF &&\n+\t\t\"--run with a right open range\" --run=\"4-\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-right-open-range <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-right-open-range <<-\\EOF\n \t> ok 1 # skip passing test #1 (--run)\n \t> ok 2 # skip passing test #2 (--run)\n \t> ok 3 # skip passing test #3 (--run)\n@@ -531,18 +531,18 @@ test_expect_success '--run with a right open range' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run with basic negation' \"\n+test_expect_success '--run with basic negation' '\n \trun_sub_test_lib_test run-basic-neg \\\n-\t\t'--run with basic negation' --run='\"'!3'\"' <<-\\\\EOF &&\n+\t\t\"--run with basic negation\" --run=\"!3\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-basic-neg <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-basic-neg <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 - passing test #2\n \t> ok 3 # skip passing test #3 (--run)\n@@ -552,18 +552,18 @@ test_expect_success '--run with basic negation' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run with two negations' \"\n+test_expect_success '--run with two negations' '\n \trun_sub_test_lib_test run-two-neg \\\n-\t\t'--run with two negations' --run='\"'!3,!6'\"' <<-\\\\EOF &&\n+\t\t\"--run with two negations\" --run=\"!3,!6\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-two-neg <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-two-neg <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 - passing test #2\n \t> ok 3 # skip passing test #3 (--run)\n@@ -573,18 +573,18 @@ test_expect_success '--run with two negations' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run a range and negation' \"\n+test_expect_success '--run a range and negation' '\n \trun_sub_test_lib_test run-range-and-neg \\\n-\t\t'--run a range and negation' --run='\"'-4,!2'\"' <<-\\\\EOF &&\n+\t\t\"--run a range and negation\" --run=\"-4,!2\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-range-and-neg <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-range-and-neg <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 # skip passing test #2 (--run)\n \t> ok 3 - passing test #3\n@@ -594,18 +594,18 @@ test_expect_success '--run a range and negation' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run range negation' \"\n+test_expect_success '--run range negation' '\n \trun_sub_test_lib_test run-range-neg \\\n-\t\t'--run range negation' --run='\"'!1-3'\"' <<-\\\\EOF &&\n+\t\t\"--run range negation\" --run=\"!1-3\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-range-neg <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-range-neg <<-\\EOF\n \t> ok 1 # skip passing test #1 (--run)\n \t> ok 2 # skip passing test #2 (--run)\n \t> ok 3 # skip passing test #3 (--run)\n@@ -615,19 +615,19 @@ test_expect_success '--run range negation' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run include, exclude and include' \"\n+test_expect_success '--run include, exclude and include' '\n \trun_sub_test_lib_test run-inc-neg-inc \\\n-\t\t'--run include, exclude and include' \\\n-\t\t--run='\"'1-5,!1-3,2'\"' <<-\\\\EOF &&\n+\t\t\"--run include, exclude and include\" \\\n+\t\t--run=\"1-5,!1-3,2\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-inc-neg-inc <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-inc-neg-inc <<-\\EOF\n \t> ok 1 # skip passing test #1 (--run)\n \t> ok 2 - passing test #2\n \t> ok 3 # skip passing test #3 (--run)\n@@ -637,19 +637,19 @@ test_expect_success '--run include, exclude and include' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run include, exclude and include, comma separated' \"\n+test_expect_success '--run include, exclude and include, comma separated' '\n \trun_sub_test_lib_test run-inc-neg-inc-comma \\\n-\t\t'--run include, exclude and include, comma separated' \\\n-\t\t--run=1-5,\\!1-3,2 <<-\\\\EOF &&\n+\t\t\"--run include, exclude and include, comma separated\" \\\n+\t\t--run=1-5,!1-3,2 <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-inc-neg-inc-comma <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-inc-neg-inc-comma <<-\\EOF\n \t> ok 1 # skip passing test #1 (--run)\n \t> ok 2 - passing test #2\n \t> ok 3 # skip passing test #3 (--run)\n@@ -659,19 +659,19 @@ test_expect_success '--run include, exclude and include, comma separated' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run exclude and include' \"\n+test_expect_success '--run exclude and include' '\n \trun_sub_test_lib_test run-neg-inc \\\n-\t\t'--run exclude and include' \\\n-\t\t--run='\"'!3-,5'\"' <<-\\\\EOF &&\n+\t\t\"--run exclude and include\" \\\n+\t\t--run=\"!3-,5\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-neg-inc <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-neg-inc <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 - passing test #2\n \t> ok 3 # skip passing test #3 (--run)\n@@ -681,19 +681,19 @@ test_expect_success '--run exclude and include' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run empty selectors' \"\n+test_expect_success '--run empty selectors' '\n \trun_sub_test_lib_test run-empty-sel \\\n-\t\t'--run empty selectors' \\\n-\t\t--run='1,,3,,,5' <<-\\\\EOF &&\n+\t\t\"--run empty selectors\" \\\n+\t\t--run=\"1,,3,,,5\" <<-\\EOF &&\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"passing test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"passing test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-empty-sel <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-empty-sel <<-\\EOF\n \t> ok 1 - passing test #1\n \t> ok 2 # skip passing test #2 (--run)\n \t> ok 3 - passing test #3\n@@ -703,20 +703,20 @@ test_expect_success '--run empty selectors' \"\n \t> # passed all 6 test(s)\n \t> 1..6\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run substring selector' \"\n+test_expect_success '--run substring selector' '\n \trun_sub_test_lib_test run-substring-selector \\\n-\t\t'--run empty selectors' \\\n-\t\t--run='relevant' <<-\\\\EOF &&\n-\ttest_expect_success \\\"relevant test\\\" 'true'\n+\t\t\"--run empty selectors\" \\\n+\t\t--run=\"relevant\" <<-\\EOF &&\n+\ttest_expect_success \"relevant test\" \"true\"\n \tfor i in 1 2 3 4 5 6\n \tdo\n-\t\ttest_expect_success \\\"other test #\\$i\\\" 'true'\n+\t\ttest_expect_success \"other test #$i\" \"true\"\n \tdone\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test run-substring-selector <<-\\\\EOF\n+\tcheck_sub_test_lib_test run-substring-selector <<-\\EOF\n \t> ok 1 - relevant test\n \t> ok 2 # skip other test #1 (--run)\n \t> ok 3 # skip other test #2 (--run)\n@@ -727,37 +727,37 @@ test_expect_success '--run substring selector' \"\n \t> # passed all 7 test(s)\n \t> 1..7\n \tEOF\n-\"\n+'\n \n-test_expect_success '--run keyword selection' \"\n+test_expect_success '--run keyword selection' '\n \trun_sub_test_lib_test_err run-inv-range-start \\\n-\t\t'--run invalid range start' \\\n-\t\t--run='a-5' <<-\\\\EOF &&\n-\ttest_expect_success \\\"passing test #1\\\" 'true'\n+\t\t\"--run invalid range start\" \\\n+\t\t--run=\"a-5\" <<-\\EOF &&\n+\ttest_expect_success \"passing test #1\" \"true\"\n \ttest_done\n \tEOF\n \tcheck_sub_test_lib_test_err run-inv-range-start \\\n-\t\t<<-\\\\EOF_OUT 3<<-\\\\EOF_ERR\n+\t\t<<-\\EOF_OUT 3<<-EOF_ERR\n \t> FATAL: Unexpected exit with code 1\n \tEOF_OUT\n-\t> error: --run: invalid non-numeric in range start: 'a-5'\n+\t> error: --run: invalid non-numeric in range start: ${SQ}a-5${SQ}\n \tEOF_ERR\n-\"\n+'\n \n-test_expect_success '--run invalid range end' \"\n+test_expect_success '--run invalid range end' '\n \trun_sub_test_lib_test_err run-inv-range-end \\\n-\t\t'--run invalid range end' \\\n-\t\t--run='1-z' <<-\\\\EOF &&\n-\ttest_expect_success \\\"passing test #1\\\" 'true'\n+\t\t\"--run invalid range end\" \\\n+\t\t--run=\"1-z\" <<-\\EOF &&\n+\ttest_expect_success \"passing test #1\" \"true\"\n \ttest_done\n \tEOF\n \tcheck_sub_test_lib_test_err run-inv-range-end \\\n-\t\t<<-\\\\EOF_OUT 3<<-\\\\EOF_ERR\n+\t\t<<-\\EOF_OUT 3<<-EOF_ERR\n \t> FATAL: Unexpected exit with code 1\n \tEOF_OUT\n-\t> error: --run: invalid non-numeric in range end: '1-z'\n+\t> error: --run: invalid non-numeric in range end: ${SQ}1-z${SQ}\n \tEOF_ERR\n-\"\n+'\n \n test_expect_success 'tests respect prerequisites' '\n \trun_sub_test_lib_test prereqs \"tests respect prereqs\" <<-\\EOF &&\n@@ -839,18 +839,18 @@ test_expect_success 'nested lazy prerequisites' '\n \tEOF\n '\n \n-test_expect_success 'lazy prereqs do not turn off tracing' \"\n+test_expect_success 'lazy prereqs do not turn off tracing' '\n \trun_sub_test_lib_test lazy-prereq-and-tracing \\\n-\t\t'lazy prereqs and -x' -v -x <<-\\\\EOF &&\n+\t\t\"lazy prereqs and -x\" -v -x <<-\\EOF &&\n \ttest_lazy_prereq LAZY true\n \n-\ttest_expect_success lazy 'test_have_prereq LAZY && echo trace'\n+\ttest_expect_success lazy \"test_have_prereq LAZY && echo trace\"\n \n \ttest_done\n \tEOF\n \n-\tgrep 'echo trace' lazy-prereq-and-tracing/err\n-\"\n+\tgrep \"echo trace\" lazy-prereq-and-tracing/err\n+'\n \n test_expect_success 'tests clean up after themselves' '\n \trun_sub_test_lib_test cleanup \"test with cleanup\" <<-\\EOF &&\n@@ -872,20 +872,20 @@ test_expect_success 'tests clean up after themselves' '\n \tEOF\n '\n \n-test_expect_success 'tests clean up even on failures' \"\n+test_expect_success 'tests clean up even on failures' '\n \trun_sub_test_lib_test_err \\\n-\t\tfailing-cleanup 'Failing tests with cleanup commands' <<-\\\\EOF &&\n-\ttest_expect_success 'tests clean up even after a failure' '\n+\t\tfailing-cleanup \"Failing tests with cleanup commands\" <<-\\EOF &&\n+\ttest_expect_success \"tests clean up even after a failure\" \"\n \t\ttouch clean-after-failure &&\n \t\ttest_when_finished rm clean-after-failure &&\n \t\t(exit 1)\n-\t'\n-\ttest_expect_success 'failure to clean up causes the test to fail' '\n+\t\"\n+\ttest_expect_success \"failure to clean up causes the test to fail\" \"\n \t\ttest_when_finished \\\"(exit 2)\\\"\n-\t'\n+\t\"\n \ttest_done\n \tEOF\n-\tcheck_sub_test_lib_test failing-cleanup <<-\\\\EOF\n+\tcheck_sub_test_lib_test failing-cleanup <<-\\EOF\n \t> not ok 1 - tests clean up even after a failure\n \t> #\tZ\n \t> #\ttouch clean-after-failure &&\n@@ -894,30 +894,30 @@ test_expect_success 'tests clean up even on failures' \"\n \t> #\tZ\n \t> not ok 2 - failure to clean up causes the test to fail\n \t> #\tZ\n-\t> #\ttest_when_finished \\\"(exit 2)\\\"\n+\t> #\ttest_when_finished \"(exit 2)\"\n \t> #\tZ\n \t> # failed 2 among 2 test(s)\n \t> 1..2\n \tEOF\n-\"\n+'\n \n-test_expect_success 'test_atexit is run' \"\n+test_expect_success 'test_atexit is run' '\n \trun_sub_test_lib_test_err \\\n-\t\tatexit-cleanup 'Run atexit commands' -i <<-\\\\EOF &&\n-\ttest_expect_success 'tests clean up even after a failure' '\n+\t\tatexit-cleanup \"Run atexit commands\" -i <<-\\EOF &&\n+\ttest_expect_success \"tests clean up even after a failure\" \"\n \t\t> ../../clean-atexit &&\n \t\ttest_atexit rm ../../clean-atexit &&\n \t\t> ../../also-clean-atexit &&\n \t\ttest_atexit rm ../../also-clean-atexit &&\n \t\t> ../../dont-clean-atexit &&\n \t\t(exit 1)\n-\t'\n+\t\"\n \ttest_done\n \tEOF\n \ttest_path_is_file dont-clean-atexit &&\n \ttest_path_is_missing clean-atexit &&\n \ttest_path_is_missing also-clean-atexit\n-\"\n+'\n \n test_expect_success 'test_oid provides sane info by default' '\n \ttest_oid zero >actual &&\n-- \n2.30.0.758.gfe500d6872\n"}]}