{"thread":{"id":"65088","subject":"[PATCH] t3700: avoid suppressing git's exit code","startedAt":"2026-02-27T16:51:58Z","lastAt":"2026-03-02T21:24:30Z","messageCount":6,"participants":["Siddharth Shrimali","Junio C Hamano","Johannes Sixt"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"537304","messageId":"20260227165143.70188-1-r.siddharth.shrimali@gmail.com","threadId":"65088","inReplyTo":null,"subject":"[PATCH] t3700: avoid suppressing git's exit code","fromName":"Siddharth Shrimali","fromEmail":"r.siddharth.shrimali@gmail.com","sentAt":"2026-02-27T16:51:43Z","receivedAt":"2026-02-27T16:51:58Z","isPatch":true,"sender":{"key":"r.siddharth.shrimali@gmail.com","avatar":"https://avatars.githubusercontent.com/u/183274193?v=4"},"body":"When piping the output of git ls-files into grep, the exit code of\ngit ls-files is suppressed.\n\nAvoid this by redirecting the output of git ls-files to a file and\nthen running grep on that file. This ensures that any crash in\ngit ls-files will be caught by the test suite.\n\nSigned-off-by: Siddharth Shrimali <r.siddharth.shrimali@gmail.com>\n---\n t/t3700-add.sh | 38 +++++++++++++++++++++++---------------\n 1 file changed, 23 insertions(+), 15 deletions(-)\n\ndiff --git a/t/t3700-add.sh b/t/t3700-add.sh\nindex af93e53c12..66c6114b54 100755\n--- a/t/t3700-add.sh\n+++ b/t/t3700-add.sh\n@@ -38,7 +38,8 @@ test_expect_success 'Test with no pathspecs' '\n '\n \n test_expect_success 'Post-check that foo is in the index' '\n-\tgit ls-files foo | grep foo\n+\tgit ls-files foo >actual &&\n+\tgrep foo <actual\n '\n \n test_expect_success 'Test that \"git add -- -q\" works' '\n@@ -195,8 +196,9 @@ test_expect_success 'git add with filemode=0, symlinks=0, and unmerged entries'\n \techo new > file &&\n \techo new > symlink &&\n \tgit add file symlink &&\n-\tgit ls-files --stage | grep \"^100755 .* 0\tfile$\" &&\n-\tgit ls-files --stage | grep \"^120000 .* 0\tsymlink$\"\n+\tgit ls-files --stage >actual &&\n+\tgrep \"^100755 .* 0\tfile$\" <actual &&\n+\tgrep \"^120000 .* 0\tsymlink$\" actual\n '\n \n test_expect_success 'git add with filemode=0, symlinks=0 prefers stage 2 over stage 1' '\n@@ -212,8 +214,9 @@ test_expect_success 'git add with filemode=0, symlinks=0 prefers stage 2 over st\n \techo new > file &&\n \techo new > symlink &&\n \tgit add file symlink &&\n-\tgit ls-files --stage | grep \"^100755 .* 0\tfile$\" &&\n-\tgit ls-files --stage | grep \"^120000 .* 0\tsymlink$\"\n+\tgit ls-files --stage >actual &&\n+\tgrep \"^100755 .* 0\tfile$\" actual &&\n+\tgrep \"^120000 .* 0\tsymlink$\" actual\n '\n \n test_expect_success 'git add --refresh' '\n@@ -254,7 +257,8 @@ test_expect_success POSIXPERM,SANITY 'git add should fail atomically upon an unr\n \tdate >foo2 &&\n \tchmod 0 foo2 &&\n \ttest_must_fail git add --verbose . &&\n-\t! ( git ls-files foo1 | grep foo1 )\n+\tgit ls-files foo1 >actual &&\n+\t! grep foo1 actual\n '\n \n rm -f foo2\n@@ -265,7 +269,7 @@ test_expect_success POSIXPERM,SANITY 'git add --ignore-errors' '\n \tdate >foo2 &&\n \tchmod 0 foo2 &&\n \ttest_must_fail git add --verbose --ignore-errors . &&\n-\tgit ls-files foo1 | grep foo1\n+\tgit ls-files foo1 >actual && grep foo1 actual\n '\n \n rm -f foo2\n@@ -277,7 +281,7 @@ test_expect_success POSIXPERM,SANITY 'git add (add.ignore-errors)' '\n \tdate >foo2 &&\n \tchmod 0 foo2 &&\n \ttest_must_fail git add --verbose . &&\n-\tgit ls-files foo1 | grep foo1\n+\tgit ls-files foo1 >actual && grep foo1 actual\n '\n rm -f foo2\n \n@@ -288,7 +292,8 @@ test_expect_success POSIXPERM,SANITY 'git add (add.ignore-errors = false)' '\n \tdate >foo2 &&\n \tchmod 0 foo2 &&\n \ttest_must_fail git add --verbose . &&\n-\t! ( git ls-files foo1 | grep foo1 )\n+\tgit ls-files foo1 >actual &&\n+\t! grep foo1 actual\n '\n rm -f foo2\n \n@@ -299,7 +304,8 @@ test_expect_success POSIXPERM,SANITY '--no-ignore-errors overrides config' '\n \tdate >foo2 &&\n \tchmod 0 foo2 &&\n \ttest_must_fail git add --verbose --no-ignore-errors . &&\n-\t! ( git ls-files foo1 | grep foo1 ) &&\n+\tgit ls-files foo1 >actual &&\n+\t! grep foo1 actual &&\n \tgit config add.ignore-errors 0\n '\n rm -f foo2\n@@ -309,7 +315,8 @@ test_expect_success BSLASHPSPEC \"git add 'fo\\\\[ou\\\\]bar' ignores foobar\" '\n \ttouch fo\\[ou\\]bar foobar &&\n \tgit add '\\''fo\\[ou\\]bar'\\'' &&\n \tgit ls-files fo\\[ou\\]bar | grep -F fo\\[ou\\]bar &&\n-\t! ( git ls-files foobar | grep foobar )\n+\tgit ls-files foobar >actual &&\n+\t! grep foobar actual\n '\n \n test_expect_success 'git add to resolve conflicts on otherwise ignored path' '\n@@ -326,7 +333,8 @@ test_expect_success 'git add to resolve conflicts on otherwise ignored path' '\n \n test_expect_success '\"add non-existent\" should fail' '\n \ttest_must_fail git add non-existent &&\n-\t! (git ls-files | grep \"non-existent\")\n+\tgit ls-files >actual &&\n+\t! grep \"non-existent\" actual \n '\n \n test_expect_success 'git add -A on empty repo does not error out' '\n@@ -536,9 +544,9 @@ test_expect_success 'all statuses changed in folder if . is given' '\n \t\ttouch x y z sub/a sub/dir/b &&\n \t\tgit add -A &&\n \t\tgit add --chmod=+x . &&\n-\t\ttest $(git ls-files --stage | grep ^100644 | wc -l) -eq 0 &&\n+\t\ttest $(git ls-files --stage >actual && grep ^100644 actual | wc -l) -eq 0 &&\n \t\tgit add --chmod=-x . &&\n-\t\ttest $(git ls-files --stage | grep ^100755 | wc -l) -eq 0\n+\t\ttest $(git ls-files --stage >actual && grep ^100755 actual | wc -l) -eq 0\n \t)\n '\n \n@@ -574,4 +582,4 @@ test_expect_success CASE_INSENSITIVE_FS 'path is case-insensitive' '\n \tgit add \"$downcased\"\n '\n \n-test_done\n+test_done\n\\ No newline at end of file\n-- \n2.51.2\n\n"},{"id":"537314","messageId":"xmqqv7fiqcaj.fsf@gitster.g","threadId":"65088","inReplyTo":"20260227165143.70188-1-r.siddharth.shrimali@gmail.com","subject":"Re: [PATCH] t3700: avoid suppressing git's exit code","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-02-27T18:19:48Z","receivedAt":"2026-02-27T18:19:50Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Siddharth Shrimali <r.siddharth.shrimali@gmail.com> writes:\n\n> When piping the output of git ls-files into grep, the exit code of\n> git ls-files is suppressed.\n>\n> Avoid this by redirecting the output of git ls-files to a file and\n> then running grep on that file. This ensures that any crash in\n> git ls-files will be caught by the test suite.\n>\n> Signed-off-by: Siddharth Shrimali <r.siddharth.shrimali@gmail.com>\n> ---\n>  t/t3700-add.sh | 38 +++++++++++++++++++++++---------------\n>  1 file changed, 23 insertions(+), 15 deletions(-)\n\nA few things that I noticed.\n\n * If \"git foo | grep bar\" was expecting to hide exit code from\n   \"git\" and check the output (e.g., \"git diff --exit-code | grep foo\"),\n   a mechanical conversion \"git diff --exit-code >out && grep foo out\"\n   would change the meaning of the test and break it.  I did not check\n   if this patch has such an unintended breakage, though.\n\n * Many of them do this:\n\n        > -\tgit ls-files foo | grep foo\n        > +\tgit ls-files foo >actual &&\n        > +\tgrep foo <actual\n\n   or this\n\n        > -\t! ( git ls-files foo1 | grep foo1 )\n        > +\tgit ls-files foo1 >actual &&\n        > +\t! grep foo1 actual\n\n    in which we might consider using \"test_grep\" (and \"test_grep !\")\n    to help the developer who wants to debug a breakage in ls-files\n    by highlighting what is unexpected in the output in their broken\n    version.\n\n * A rewrite like this may want to be further broken down.\n\n        > -\ttest $(git ls-files --stage | grep ^100644 | wc -l) -eq 0 &&\n        > +\ttest $(git ls-files --stage >actual && grep ^100644 actual | wc -l) -eq 0 &&\n\n   If \"ls-files --stage\" segfaults, \"grep | wc\" would not run, $()\n   may exit with non-zero and turn into an empty string, but the\n   final error diagnosis would be something unfathonable like\n\n\ttest: -eq unary operator expected\n\ttest: missing argument after '0'\n   \n   which would not help the person debugging the test very much.\n\n"},{"id":"537376","messageId":"20260228070020.89668-1-r.siddharth.shrimali@gmail.com","threadId":"65088","inReplyTo":"20260227165143.70188-1-r.siddharth.shrimali@gmail.com","subject":"[PATCH v2] t3700: avoid hidden failures and use test_grep helper","fromName":"Siddharth Shrimali","fromEmail":"r.siddharth.shrimali@gmail.com","sentAt":"2026-02-28T07:00:20Z","receivedAt":"2026-02-28T07:00:29Z","isPatch":true,"sender":{"key":"r.siddharth.shrimali@gmail.com","avatar":"https://avatars.githubusercontent.com/u/183274193?v=4"},"body":"Replace pipelines involving git commands with temporary files to ensure\nthat any crashes or unexpected exit codes from the git commands are\nproperly caught by the test suite. A simple pipeline like\n'git foo | grep bar' ignores the exit code of 'git', which can\nhide regressions.\n\nAdditionally, replace standard 'grep' with the 'test_grep' helper.\nThis improves debuggability by automatically dumping the contents of\nthe 'actual' file when a match is not found. In cases where we were\ncounting lines with 'wc -l' to ensure a pattern was absent,\nsimplify to 'test_grep !'.\n\nSuggested-by: Junio C Hamano <gitster@pobox.com>\n\nSigned-off-by: Siddharth Shrimali <r.siddharth.shrimali@gmail.com>\n---\nInter-patch notes (v1 -> v2):\n - Replaced standard 'grep' with 'test_grep' for better diagnostics.\n - Used 'test_grep !' for negative assertions as per project style.\n - Simplified 'wc -l' logic to 'test_grep !' to avoid subshells.\n - Removed unnecessary '<' redirection from function calls.\n\n t/t3700-add.sh | 28 +++++++++++++++-------------\n 1 file changed, 15 insertions(+), 13 deletions(-)\n\ndiff --git a/t/t3700-add.sh b/t/t3700-add.sh\nindex 66c6114b54..d61bf784d2 100755\n--- a/t/t3700-add.sh\n+++ b/t/t3700-add.sh\n@@ -39,7 +39,7 @@ test_expect_success 'Test with no pathspecs' '\n \n test_expect_success 'Post-check that foo is in the index' '\n \tgit ls-files foo >actual &&\n-\tgrep foo <actual\n+\ttest_grep foo actual\n '\n \n test_expect_success 'Test that \"git add -- -q\" works' '\n@@ -197,8 +197,8 @@ test_expect_success 'git add with filemode=0, symlinks=0, and unmerged entries'\n \techo new > symlink &&\n \tgit add file symlink &&\n \tgit ls-files --stage >actual &&\n-\tgrep \"^100755 .* 0\tfile$\" <actual &&\n-\tgrep \"^120000 .* 0\tsymlink$\" actual\n+\ttest_grep \"^100755 .* 0\tfile$\" actual &&\n+\ttest_grep \"^120000 .* 0\tsymlink$\" actual\n '\n \n test_expect_success 'git add with filemode=0, symlinks=0 prefers stage 2 over stage 1' '\n@@ -215,8 +215,8 @@ test_expect_success 'git add with filemode=0, symlinks=0 prefers stage 2 over st\n \techo new > symlink &&\n \tgit add file symlink &&\n \tgit ls-files --stage >actual &&\n-\tgrep \"^100755 .* 0\tfile$\" actual &&\n-\tgrep \"^120000 .* 0\tsymlink$\" actual\n+\ttest_grep \"^100755 .* 0\tfile$\" actual &&\n+\ttest_grep \"^120000 .* 0\tsymlink$\" actual\n '\n \n test_expect_success 'git add --refresh' '\n@@ -258,7 +258,7 @@ test_expect_success POSIXPERM,SANITY 'git add should fail atomically upon an unr\n \tchmod 0 foo2 &&\n \ttest_must_fail git add --verbose . &&\n \tgit ls-files foo1 >actual &&\n-\t! grep foo1 actual\n+\ttest_grep ! foo1 actual\n '\n \n rm -f foo2\n@@ -293,7 +293,7 @@ test_expect_success POSIXPERM,SANITY 'git add (add.ignore-errors = false)' '\n \tchmod 0 foo2 &&\n \ttest_must_fail git add --verbose . &&\n \tgit ls-files foo1 >actual &&\n-\t! grep foo1 actual\n+\ttest_grep ! foo1 actual\n '\n rm -f foo2\n \n@@ -305,7 +305,7 @@ test_expect_success POSIXPERM,SANITY '--no-ignore-errors overrides config' '\n \tchmod 0 foo2 &&\n \ttest_must_fail git add --verbose --no-ignore-errors . &&\n \tgit ls-files foo1 >actual &&\n-\t! grep foo1 actual &&\n+\ttest_grep ! foo1 actual &&\n \tgit config add.ignore-errors 0\n '\n rm -f foo2\n@@ -316,7 +316,7 @@ test_expect_success BSLASHPSPEC \"git add 'fo\\\\[ou\\\\]bar' ignores foobar\" '\n \tgit add '\\''fo\\[ou\\]bar'\\'' &&\n \tgit ls-files fo\\[ou\\]bar | grep -F fo\\[ou\\]bar &&\n \tgit ls-files foobar >actual &&\n-\t! grep foobar actual\n+\ttest_grep ! foobar actual\n '\n \n test_expect_success 'git add to resolve conflicts on otherwise ignored path' '\n@@ -334,7 +334,7 @@ test_expect_success 'git add to resolve conflicts on otherwise ignored path' '\n test_expect_success '\"add non-existent\" should fail' '\n \ttest_must_fail git add non-existent &&\n \tgit ls-files >actual &&\n-\t! grep \"non-existent\" actual \n+\ttest_grep ! \"non-existent\" actual \n '\n \n test_expect_success 'git add -A on empty repo does not error out' '\n@@ -544,9 +544,11 @@ test_expect_success 'all statuses changed in folder if . is given' '\n \t\ttouch x y z sub/a sub/dir/b &&\n \t\tgit add -A &&\n \t\tgit add --chmod=+x . &&\n-\t\ttest $(git ls-files --stage >actual && grep ^100644 actual | wc -l) -eq 0 &&\n+\t\tgit ls-files --stage >actual &&\n+\t\ttest_grep ! \"^100644\" actual &&\n \t\tgit add --chmod=-x . &&\n-\t\ttest $(git ls-files --stage >actual && grep ^100755 actual | wc -l) -eq 0\n+\t\tgit ls-files --stage >actual &&\n+\t\ttest_grep ! \"^100755\" actual\n \t)\n '\n \n@@ -582,4 +584,4 @@ test_expect_success CASE_INSENSITIVE_FS 'path is case-insensitive' '\n \tgit add \"$downcased\"\n '\n \n-test_done\n\\ No newline at end of file\n+test_done\n-- \n2.51.2\n\n"},{"id":"537380","messageId":"3c854150-2efc-4f5b-8a75-bb40808babd0@kdbg.org","threadId":"65088","inReplyTo":"20260227165143.70188-1-r.siddharth.shrimali@gmail.com","subject":"Re: [PATCH] t3700: avoid suppressing git's exit code","fromName":"Johannes Sixt","fromEmail":"j6t@kdbg.org","sentAt":"2026-02-28T08:12:46Z","receivedAt":"2026-02-28T08:12:50Z","isPatch":true,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Am 27.02.26 um 17:51 schrieb Siddharth Shrimali:\n> @@ -536,9 +544,9 @@ test_expect_success 'all statuses changed in folder if . is given' '\n>  \t\ttouch x y z sub/a sub/dir/b &&\n>  \t\tgit add -A &&\n>  \t\tgit add --chmod=+x . &&\n> -\t\ttest $(git ls-files --stage | grep ^100644 | wc -l) -eq 0 &&\n> +\t\ttest $(git ls-files --stage >actual && grep ^100644 actual | wc -l) -eq 0 &&\n>  \t\tgit add --chmod=-x . &&\n> -\t\ttest $(git ls-files --stage | grep ^100755 | wc -l) -eq 0\n> +\t\ttest $(git ls-files --stage >actual && grep ^100755 actual | wc -l) -eq 0\n\nThis doesn't help. The exit code of $( ) that is substituted into a\ncommand is ignored, too. You must move the git invocation out of the\nsubshell.\n\n>  \t)\n>  '\n>  \n> @@ -574,4 +582,4 @@ test_expect_success CASE_INSENSITIVE_FS 'path is case-insensitive' '\n>  \tgit add \"$downcased\"\n>  '\n>  \n> -test_done\n> +test_done\n> \\ No newline at end of file\n\nPlease keep the newline at the end of file.\n\n-- Hannes\n\n"},{"id":"537385","messageId":"CAGWgyh8CnJSk53rXFcFgnM++6o1ZWTLnRzXhY4VwkNyY0-W+UQ@mail.gmail.com","threadId":"65088","inReplyTo":"3c854150-2efc-4f5b-8a75-bb40808babd0@kdbg.org","subject":"Re: [PATCH] t3700: avoid suppressing git's exit code","fromName":"Siddharth Shrimali","fromEmail":"r.siddharth.shrimali@gmail.com","sentAt":"2026-02-28T10:15:11Z","receivedAt":"2026-02-28T10:15:48Z","isPatch":true,"sender":{"key":"r.siddharth.shrimali@gmail.com","avatar":"https://avatars.githubusercontent.com/u/183274193?v=4"},"body":"Hi Hannes,\n\nThank you for the review!\n\nIt looks like our emails crossed paths; I sent out a v2 [1] just before\nyour comments arrived. In that version, I have addressed both of\nyour points:\n\n1. Moved the git invocations out of the subshells and replaced\n   the logic with 'test_grep !' to properly catch exit codes.\n2. Restored the trailing newline at the end of the file.\n\n[1] https://lore.kernel.org/git/20260228070020.89668-1-r.siddharth.shrimali@gmail.com/\n\nBest regards,\nSiddharth\n\n\nOn Sat, 28 Feb 2026 at 13:42, Johannes Sixt <j6t@kdbg.org> wrote:\n>\n> Am 27.02.26 um 17:51 schrieb Siddharth Shrimali:\n> > @@ -536,9 +544,9 @@ test_expect_success 'all statuses changed in folder if . is given' '\n> >               touch x y z sub/a sub/dir/b &&\n> >               git add -A &&\n> >               git add --chmod=+x . &&\n> > -             test $(git ls-files --stage | grep ^100644 | wc -l) -eq 0 &&\n> > +             test $(git ls-files --stage >actual && grep ^100644 actual | wc -l) -eq 0 &&\n> >               git add --chmod=-x . &&\n> > -             test $(git ls-files --stage | grep ^100755 | wc -l) -eq 0\n> > +             test $(git ls-files --stage >actual && grep ^100755 actual | wc -l) -eq 0\n>\n> This doesn't help. The exit code of $( ) that is substituted into a\n> command is ignored, too. You must move the git invocation out of the\n> subshell.\n>\n> >       )\n> >  '\n> >\n> > @@ -574,4 +582,4 @@ test_expect_success CASE_INSENSITIVE_FS 'path is case-insensitive' '\n> >       git add \"$downcased\"\n> >  '\n> >\n> > -test_done\n> > +test_done\n> > \\ No newline at end of file\n>\n> Please keep the newline at the end of file.\n>\n> -- Hannes\n>\n"},{"id":"537602","messageId":"xmqqh5qxzzzn.fsf@gitster.g","threadId":"65088","inReplyTo":"20260228070020.89668-1-r.siddharth.shrimali@gmail.com","subject":"Re: [PATCH v2] t3700: avoid hidden failures and use test_grep helper","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-03-02T21:24:28Z","receivedAt":"2026-03-02T21:24:30Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Siddharth Shrimali <r.siddharth.shrimali@gmail.com> writes:\n\n> Replace pipelines involving git commands with temporary files to ensure\n> that any crashes or unexpected exit codes from the git commands are\n> properly caught by the test suite. A simple pipeline like\n> 'git foo | grep bar' ignores the exit code of 'git', which can\n> hide regressions.\n>\n> Additionally, replace standard 'grep' with the 'test_grep' helper.\n> This improves debuggability by automatically dumping the contents of\n> the 'actual' file when a match is not found. In cases where we were\n> counting lines with 'wc -l' to ensure a pattern was absent,\n> simplify to 'test_grep !'.\n\nCounting the instances of these changes, there are too many hunks\nthat fall into this \"Additionally\" category to consider them \"while\nat it\" changes.  In other words, this would want to become two\npatches, one to break pipelines to expose the exit status of Git\nthat is upstream of a pipeline, and the other to use test_grep where\nthe original used grep.\n\n>\n> Suggested-by: Junio C Hamano <gitster@pobox.com>\n>\n> Signed-off-by: Siddharth Shrimali <r.siddharth.shrimali@gmail.com>\n\nThe trailer block does not allow blanks inside it.  Remove the blank\nline.\n\n> @@ -544,9 +544,11 @@ test_expect_success 'all statuses changed in folder if . is given' '\n>  \t\ttouch x y z sub/a sub/dir/b &&\n>  \t\tgit add -A &&\n>  \t\tgit add --chmod=+x . &&\n> -\t\ttest $(git ls-files --stage >actual && grep ^100644 actual | wc -l) -eq 0 &&\n> +\t\tgit ls-files --stage >actual &&\n> +\t\ttest_grep ! \"^100644\" actual &&\n>  \t\tgit add --chmod=-x . &&\n> -\t\ttest $(git ls-files --stage >actual && grep ^100755 actual | wc -l) -eq 0\n> +\t\tgit ls-files --stage >actual &&\n> +\t\ttest_grep ! \"^100755\" actual\n>  \t)\n>  '\n>  \n> @@ -582,4 +584,4 @@ test_expect_success CASE_INSENSITIVE_FS 'path is case-insensitive' '\n>  \tgit add \"$downcased\"\n>  '\n>  \n> -test_done\n> \\ No newline at end of file\n> +test_done\n\n\nWait.  What tree state is this patch meant to apply?  If you made a\nbotched change in an earlier attempt, your \"v2\" patch should *not*\nbe relative to the tree state _with_ that botched attempt.  It\nshould instead be a change relative to somewhere stable in my tree,\npretending as if your \"v1\" (which introduced an incomplete line to\nthis file, among possibly other changes) never happened.\n\nSo, I'd suggest a two-patch series that is:\n\n - refine your v1 to remove mistakes (like the \"incomplete last\n   line\"; there might have been others but I do not remember),\n   keeping your conversion to break pipelines, without changing\n   \"grep\" to \"test_grep\".  Make it [PATCH v2 1/2].\n\n - turn \"grep\" you touched in [PATCH v2 1/2] above to use\n   \"test_grep\" instead.  In this patch, if the parts of the file you\n   did not touch in [PATCH v2 1/2] has only small number of similar\n   uses of \"grep\" that is better written with \"test_grep\", it is OK\n   to change them to use \"test_grep\" as a \"while at it\" change.\n\nThanks.\n"}]}