{"thread":{"id":"65376","subject":"[GSoC PATCH 00/16] Microproject: avoid suppressing git's exit code","startedAt":"2026-03-28T20:03:01Z","lastAt":"2026-03-30T18:50:34Z","messageCount":24,"participants":["Trieu Huynh","Junio C Hamano","Tian Yuchen","Karthik Nayak"],"isPatch":true,"patchVersion":1,"patchTotal":16},"messages":[{"id":"540284","messageId":"20260328200255.247759-1-vikingtc4@gmail.com","threadId":"65376","inReplyTo":null,"subject":"[GSoC PATCH 00/16] Microproject: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:39Z","receivedAt":"2026-03-28T20:03:01Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Piping git command output directly to subsequent command (eg. grep)\nhides the exit code of git behind the pipe.  A crash in git would go\nunnoticed because the shell only sees grep's exit code.\n\nThis series extends the same fix to 16 more test files, following the\napproach introduced in t8003 [1] (redirect output to a temporary file,\nthen use test_grep on that file).\n\nNote: t2206 is a special case -- some tests cd into a subdirectory\nthat is itself a git repo and run 'git add .' on the whole working\ntree.  To prevent the temporary file from being accidentally staged,\nit is written as '../actual', outside the inner repo.\n\nRelated-to: https://lore.kernel.org/git/20260328132955.172262-1-vikingtc4@gmail.com/T/#t\nSee-also: https://lore.kernel.org/git/xmqq4im2sjnu.fsf@gitster.g/T/#t\n\nTrieu Huynh (16):\n  t7004: avoid suppressing git's exit code\n  t6423: avoid suppressing git's exit code\n  t6411: avoid suppressing git's exit code\n  t6101: avoid suppressing git's exit code\n  t6006: avoid suppressing git's exit code\n  t5304: avoid suppressing git's exit code\n  t4153: avoid suppressing git's exit code\n  t4150: avoid suppressing git's exit code\n  t4140: avoid suppressing git's exit code\n  t4039: avoid suppressing git's exit code\n  t3903: avoid suppressing git's exit code\n  t3701: avoid suppressing git's exit code\n  t3412: avoid suppressing git's exit code\n  t1400: avoid suppressing git's exit code\n  t0100: avoid suppressing git's exit code\n  t2206: avoid suppressing git's exit code\n\n t/t0100-previous.sh                 |  3 +-\n t/t1400-update-ref.sh               |  3 +-\n t/t2206-add-submodule-ignored.sh    | 45 +++++++++++++++++++----------\n t/t3412-rebase-root.sh              |  6 ++--\n t/t3701-add-interactive.sh          | 12 +++++---\n t/t3903-stash.sh                    |  5 ++--\n t/t4039-diff-assume-unchanged.sh    |  3 +-\n t/t4140-apply-ita.sh                |  3 +-\n t/t4150-am.sh                       |  5 ++--\n t/t4153-am-resume-override-opts.sh  |  3 +-\n t/t5304-prune.sh                    |  3 +-\n t/t6006-rev-list-format.sh          |  3 +-\n t/t6101-rev-parse-parents.sh        |  3 +-\n t/t6411-merge-filemode.sh           |  6 ++--\n t/t6423-merge-rename-directories.sh |  3 +-\n t/t7004-tag.sh                      |  6 ++--\n 16 files changed, 74 insertions(+), 38 deletions(-)\n\n-- \n2.43.0\n\n"},{"id":"540285","messageId":"20260328200255.247759-2-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 01/16] t7004: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:40Z","receivedAt":"2026-03-28T20:03:09Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t7004-tag.sh to redirect git-cmds output to a temporary\nfile instead of piping it directly to not hide the exit code\nof git commands behind pipes, as a crash in git might go\nunnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t7004-tag.sh | 6 ++++--\n 1 file changed, 4 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t7004-tag.sh b/t/t7004-tag.sh\nindex ce2ff2a28a..9bd5c98f93 100755\n--- a/t/t7004-tag.sh\n+++ b/t/t7004-tag.sh\n@@ -1560,7 +1560,8 @@ test_expect_success 'filename for the message is relative to cwd' '\n \t\tcd subdir &&\n \t\tgit tag -a -F msgfile-5 tag-from-subdir\n \t) &&\n-\tgit cat-file tag tag-from-subdir | grep \"in sub directory\"\n+\tgit cat-file tag tag-from-subdir >actual &&\n+\ttest_grep \"in sub directory\" actual\n '\n \n test_expect_success 'filename for the message is relative to cwd' '\n@@ -1569,7 +1570,8 @@ test_expect_success 'filename for the message is relative to cwd' '\n \t\tcd subdir &&\n \t\tgit tag -a -F msgfile-6 tag-from-subdir-2\n \t) &&\n-\tgit cat-file tag tag-from-subdir-2 | grep \"in sub directory\"\n+\tgit cat-file tag tag-from-subdir-2 >actual &&\n+\ttest_grep \"in sub directory\" actual\n '\n \n # create a few more commits to test --contains\n-- \n2.43.0\n\n"},{"id":"540286","messageId":"20260328200255.247759-3-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 02/16] t6423: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:41Z","receivedAt":"2026-03-28T20:03:10Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t6423-merge-rename-directories.sh to redirect git-cmds\noutput to a temporary file instead of piping it directly to\nnot hide the exit code of git commands behind pipes, as a crash\nin git might go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t6423-merge-rename-directories.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t6423-merge-rename-directories.sh b/t/t6423-merge-rename-directories.sh\nindex 53535a8ebf..52665cedcd 100755\n--- a/t/t6423-merge-rename-directories.sh\n+++ b/t/t6423-merge-rename-directories.sh\n@@ -2273,7 +2273,8 @@ test_expect_success '8c: modify/delete or rename+modify/delete' '\n \t\ttest_cmp expect actual &&\n \n \t\ttest_must_fail git rev-parse :2:z/d &&\n-\t\tgit ls-files -s z/d | grep ^100755 &&\n+\t\tgit ls-files -s z/d >actual &&\n+\t\ttest_grep \"^100755\" actual &&\n \t\ttest_path_is_file z/d &&\n \t\ttest_path_is_missing y/d\n \t)\n-- \n2.43.0\n\n"},{"id":"540287","messageId":"20260328200255.247759-4-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 03/16] t6411: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:42Z","receivedAt":"2026-03-28T20:03:12Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t6411-merge-filemode.sh to redirect git-cmds output to\na temporary file instead of piping it directly to not hide the\nexit code of git commands behind pipes, as a crash in git\nmight go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t6411-merge-filemode.sh | 6 ++++--\n 1 file changed, 4 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t6411-merge-filemode.sh b/t/t6411-merge-filemode.sh\nindex 6ae2489286..9fe4271555 100755\n--- a/t/t6411-merge-filemode.sh\n+++ b/t/t6411-merge-filemode.sh\n@@ -27,7 +27,8 @@ do_one_mode () {\n \ttest_expect_success \"resolve single mode change ($strategy, $us)\" '\n \t\tgit checkout -f $us &&\n \t\tgit merge -s $strategy $them &&\n-\t\tgit ls-files -s file1 | grep ^100755\n+\t\tgit ls-files -s file1 >actual &&\n+\t\ttest_grep \"^100755\" actual\n \t'\n \n \ttest_expect_success FILEMODE \"verify executable bit on file ($strategy, $us)\" '\n@@ -65,7 +66,8 @@ do_both_modes () {\n \t\ttest_must_fail git merge -s $strategy b2 &&\n \t\tgit ls-files -u >actual &&\n \t\ttest_cmp expect actual &&\n-\t\tgit ls-files -s file2 | grep ^100755\n+\t\tgit ls-files -s file2 >actual &&\n+\t\ttest_grep \"^100755\" actual\n \t'\n \n \ttest_expect_success FILEMODE \"verify executable bit on file ($strategy)\" '\n-- \n2.43.0\n\n"},{"id":"540288","messageId":"20260328200255.247759-5-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 04/16] t6101: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:43Z","receivedAt":"2026-03-28T20:03:13Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t6101-rev-parse-parents.sh to redirect git-cmds output\nto a temporary file instead of piping it directly to not hide\nthe exit code of git commands behind pipes, as a crash in git\nmight go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t6101-rev-parse-parents.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t6101-rev-parse-parents.sh b/t/t6101-rev-parse-parents.sh\nindex 5f55ab98d3..7281889717 100755\n--- a/t/t6101-rev-parse-parents.sh\n+++ b/t/t6101-rev-parse-parents.sh\n@@ -39,7 +39,8 @@ test_expect_success 'setup' '\n '\n \n test_expect_success 'start is valid' '\n-\tgit rev-parse start | grep \"^$OID_REGEX$\"\n+\tgit rev-parse start >actual &&\n+\ttest_grep \"^$OID_REGEX$\" actual\n '\n \n test_expect_success 'start^0' '\n-- \n2.43.0\n\n"},{"id":"540289","messageId":"20260328200255.247759-6-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 05/16] t6006: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:44Z","receivedAt":"2026-03-28T20:03:15Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t6006-rev-list-format.sh to redirect git-cmds output\nto a temporary file instead of piping it directly to not hide\nthe exit code of git commands behind pipes, as a crash in git\nmight go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t6006-rev-list-format.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh\nindex 581984467d..8eaed7c502 100755\n--- a/t/t6006-rev-list-format.sh\n+++ b/t/t6006-rev-list-format.sh\n@@ -289,7 +289,8 @@ test_expect_success 'basic colors' '\n '\n \n test_expect_success '%S is not a placeholder for rev-list yet' '\n-\tgit rev-list --format=\"%S\" -1 main | grep \"%S\"\n+\tgit rev-list --format=\"%S\" -1 main >actual &&\n+\ttest_grep \"%S\" actual\n '\n \n test_expect_success 'advanced colors' '\n-- \n2.43.0\n\n"},{"id":"540290","messageId":"20260328200255.247759-7-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 06/16] t5304: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:45Z","receivedAt":"2026-03-28T20:03:16Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t5304-prune.sh to redirect git-cmds output to a\ntemporary file instead of piping it directly to not hide the\nexit code of git commands behind pipes, as a crash in git\nmight go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t5304-prune.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t5304-prune.sh b/t/t5304-prune.sh\nindex 2be7cd30de..a6d235a8a5 100755\n--- a/t/t5304-prune.sh\n+++ b/t/t5304-prune.sh\n@@ -264,7 +264,8 @@ test_expect_success 'prune .git/shallow when there are no loose objects' '\n \tgit update-ref refs/heads/shallow-tip $oid &&\n \tgit repack -ad &&\n \t# verify assumption that all loose objects are gone\n-\tgit count-objects | grep ^0 &&\n+\tgit count-objects >actual &&\n+\ttest_grep \"^0\" actual &&\n \tgit prune &&\n \techo $oid >expect &&\n \ttest_cmp expect .git/shallow\n-- \n2.43.0\n\n"},{"id":"540291","messageId":"20260328200255.247759-8-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 07/16] t4153: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:46Z","receivedAt":"2026-03-28T20:03:18Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t4153-am-resume-override-opts.sh to redirect git-cmds\noutput to a temporary file instead of piping it directly to\nnot hide the exit code of git commands behind pipes, as a crash\nin git might go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t4153-am-resume-override-opts.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t4153-am-resume-override-opts.sh b/t/t4153-am-resume-override-opts.sh\nindex 9bec989a0e..30137aec20 100755\n--- a/t/t4153-am-resume-override-opts.sh\n+++ b/t/t4153-am-resume-override-opts.sh\n@@ -81,7 +81,8 @@ test_expect_success '--signoff overrides --no-signoff' '\n \n \t# Applied side1 will be signed off\n \techo \"Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\" >expected &&\n-\tgit cat-file commit HEAD^ | grep \"Signed-off-by:\" >actual &&\n+\tgit cat-file commit HEAD^ >commit_raw &&\n+\ttest_grep \"Signed-off-by:\" commit_raw >actual &&\n \ttest_cmp expected actual &&\n \n \t# Applied side2 will not be signed off\n-- \n2.43.0\n\n"},{"id":"540292","messageId":"20260328200255.247759-9-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 08/16] t4150: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:47Z","receivedAt":"2026-03-28T20:03:19Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t4150-am.sh to redirect git-cmds output to a temporary\nfile instead of piping it directly to not hide the exit code\nof git commands behind pipes, as a crash in git might go\nunnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t4150-am.sh | 5 +++--\n 1 file changed, 3 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t4150-am.sh b/t/t4150-am.sh\nindex 699a81ab5c..462e450c60 100755\n--- a/t/t4150-am.sh\n+++ b/t/t4150-am.sh\n@@ -1094,8 +1094,9 @@ test_expect_success 'am works with multi-line in-body headers' '\n \tgit checkout HEAD^ &&\n \tgit am msg &&\n \t# Ensure that the author and full message are present\n-\tgit cat-file commit HEAD | grep \"^author.*long@example.com\" &&\n-\tgit cat-file commit HEAD | grep \"^$LONG$\"\n+\tgit cat-file commit HEAD >actual &&\n+\ttest_grep \"^author.*long@example.com\" actual &&\n+\ttest_grep \"^$LONG$\" actual\n '\n \n test_expect_success 'am --quit keeps HEAD where it is' '\n-- \n2.43.0\n\n"},{"id":"540293","messageId":"20260328200255.247759-10-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 09/16] t4140: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:48Z","receivedAt":"2026-03-28T20:03:21Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t4140-apply-ita.sh to redirect git-cmds output to a\ntemporary file instead of piping it directly to not hide\nthe exit code of git commands behind pipes, as a crash in\ngit might go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t4140-apply-ita.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t4140-apply-ita.sh b/t/t4140-apply-ita.sh\nindex 0b11a8aef4..15eef0a2ba 100755\n--- a/t/t4140-apply-ita.sh\n+++ b/t/t4140-apply-ita.sh\n@@ -79,7 +79,8 @@ test_expect_success 'apply complex patch with -N' '\n \tgit apply -N complex-patch &&\n \n \tgit ls-files --stage --error-unmatch test-file &&\n-\tgit diff | grep \"a/committed-file\"\n+\tgit diff >actual &&\n+\ttest_grep \"a/committed-file\" actual\n '\n \n test_done\n-- \n2.43.0\n\n"},{"id":"540294","messageId":"20260328200255.247759-11-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 10/16] t4039: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:49Z","receivedAt":"2026-03-28T20:03:22Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t4039-diff-assume-unchanged.sh to redirect git-cmds\noutput to a temporary file instead of piping it directly to\nnot hide the exit code of git commands behind pipes, as a\ncrash in git might go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t4039-diff-assume-unchanged.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t4039-diff-assume-unchanged.sh b/t/t4039-diff-assume-unchanged.sh\nindex 0eb0314a8b..9eb3c3f04d 100755\n--- a/t/t4039-diff-assume-unchanged.sh\n+++ b/t/t4039-diff-assume-unchanged.sh\n@@ -21,7 +21,8 @@ test_expect_success 'setup' '\n '\n \n test_expect_success 'diff-index does not examine assume-unchanged entries' '\n-\tgit diff-index HEAD^ -- one | grep -q $blob\n+\tgit diff-index HEAD^ -- one >actual &&\n+\ttest_grep \"$blob\" actual\n '\n \n test_expect_success 'diff-files does not examine assume-unchanged entries' '\n-- \n2.43.0\n\n"},{"id":"540295","messageId":"20260328200255.247759-12-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 11/16] t3903: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:50Z","receivedAt":"2026-03-28T20:03:23Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t3903-stash.sh to redirect git-cmds output to a temporary\nfile instead of piping it directly to not hide the exit code\nof git commands behind pipes, as a crash in git might go\nunnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t3903-stash.sh | 5 +++--\n 1 file changed, 3 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t3903-stash.sh b/t/t3903-stash.sh\nindex 70879941c2..b67cf23fbb 100755\n--- a/t/t3903-stash.sh\n+++ b/t/t3903-stash.sh\n@@ -962,7 +962,8 @@ test_expect_success 'store updates stash ref and reflog' '\n \ttest_path_is_missing bazzy &&\n \tgit stash store -m quuxery $STASH_ID &&\n \ttest $(git rev-parse stash) = $STASH_ID &&\n-\tgit reflog --format=%H stash| grep $STASH_ID &&\n+\tgit reflog --format=%H stash >actual &&\n+\ttest_grep \"$STASH_ID\" actual &&\n \tgit stash pop &&\n \tgrep quux bazzy\n '\n@@ -976,7 +977,7 @@ test_expect_success 'handle stash specification with spaces' '\n \techo cow >file &&\n \tgit stash &&\n \tgit stash apply \"stash@{$stamp}\" &&\n-\tgrep pig file\n+\ttest_grep pig file\n '\n \n test_expect_success 'setup stash with index and worktree changes' '\n-- \n2.43.0\n\n"},{"id":"540296","messageId":"20260328200255.247759-13-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 12/16] t3701: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:51Z","receivedAt":"2026-03-28T20:03:25Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t3701-add-interactive.sh to redirect git-cmds output\nto a temporary file instead of piping it directly to not hide\nthe exit code of git commands behind pipes, as a crash in git\nmight go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t3701-add-interactive.sh | 12 ++++++++----\n 1 file changed, 8 insertions(+), 4 deletions(-)\n\ndiff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh\nindex 6e120a4001..a07db3b1aa 100755\n--- a/t/t3701-add-interactive.sh\n+++ b/t/t3701-add-interactive.sh\n@@ -293,8 +293,10 @@ test_expect_success FILEMODE 'patch does not affect mode' '\n \techo content >>file &&\n \tchmod +x file &&\n \tprintf \"n\\\\ny\\\\n\" | git add -p &&\n-\tgit show :file | grep content &&\n-\tgit diff file | grep \"new mode\"\n+\tgit show :file >actual &&\n+\ttest_grep content actual &&\n+\tgit diff file >actual &&\n+\ttest_grep \"new mode\" actual\n '\n \n test_expect_success FILEMODE 'stage mode but not hunk' '\n@@ -302,8 +304,10 @@ test_expect_success FILEMODE 'stage mode but not hunk' '\n \techo content >>file &&\n \tchmod +x file &&\n \tprintf \"y\\\\nn\\\\n\" | git add -p &&\n-\tgit diff --cached file | grep \"new mode\" &&\n-\tgit diff          file | grep \"+content\"\n+\tgit diff --cached file >actual &&\n+\ttest_grep \"new mode\" actual &&\n+\tgit diff          file >actual &&\n+\ttest_grep \"+content\" actual\n '\n \n \n-- \n2.43.0\n\n"},{"id":"540297","messageId":"20260328200255.247759-14-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 13/16] t3412: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:52Z","receivedAt":"2026-03-28T20:03:27Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t3412-rebase-root.sh to redirect git-cmds output to a\ntemporary file instead of piping it directly to not hide the\nexit code of git commands behind pipes, as a crash in git\nmight go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t3412-rebase-root.sh | 6 ++++--\n 1 file changed, 4 insertions(+), 2 deletions(-)\n\ndiff --git a/t/t3412-rebase-root.sh b/t/t3412-rebase-root.sh\nindex 58371d8a54..f56163a73e 100755\n--- a/t/t3412-rebase-root.sh\n+++ b/t/t3412-rebase-root.sh\n@@ -171,7 +171,8 @@ test_expect_success 'set up a conflict' '\n test_expect_success 'rebase --root with conflict (first part)' '\n \tgit checkout -b conflict1 other &&\n \ttest_must_fail git rebase --root --onto main &&\n-\tgit ls-files -u | grep \"B$\"\n+\tgit ls-files -u >actual &&\n+\ttest_grep \"B$\" actual\n '\n \n test_expect_success 'fix the conflict' '\n@@ -198,7 +199,8 @@ test_expect_success 'rebase --root with conflict (second part)' '\n test_expect_success 'rebase -i --root with conflict (first part)' '\n \tgit checkout -b conflict2 other &&\n \ttest_must_fail git rebase -i --root --onto main &&\n-\tgit ls-files -u | grep \"B$\"\n+\tgit ls-files -u >actual &&\n+\ttest_grep \"B$\" actual\n '\n \n test_expect_success 'fix the conflict' '\n-- \n2.43.0\n\n"},{"id":"540298","messageId":"20260328200255.247759-15-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 14/16] t1400: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:53Z","receivedAt":"2026-03-28T20:03:29Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t1400-update-ref.sh to redirect git-cmds output to a\ntemporary file instead of piping it directly to not hide the\nexit code of git commands behind pipes, as a crash in git\nmight go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t1400-update-ref.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh\nindex b2858a9061..9f34359eb0 100755\n--- a/t/t1400-update-ref.sh\n+++ b/t/t1400-update-ref.sh\n@@ -1404,7 +1404,8 @@ test_expect_success 'handle per-worktree refs in refs/bisect' '\n \t\t! grep refs/bisect for-each-ref.out &&\n \t\tgit update-ref refs/bisect/something HEAD &&\n \t\tgit rev-parse refs/bisect/something >../worktree-head &&\n-\t\tgit for-each-ref | grep refs/bisect/something\n+\t\tgit for-each-ref >actual &&\n+\t\ttest_grep refs/bisect/something actual\n \t) &&\n \tgit show-ref >actual &&\n \t! grep 'refs/bisect' actual &&\n-- \n2.43.0\n\n"},{"id":"540299","messageId":"20260328200255.247759-16-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 15/16] t0100: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:54Z","receivedAt":"2026-03-28T20:03:30Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t0100-previous.sh to redirect git-cmds output to a\ntemporary file instead of piping it directly to not hide the\nexit code of git commands behind pipes, as a crash in git\nmight go unnoticed.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t0100-previous.sh | 3 ++-\n 1 file changed, 2 insertions(+), 1 deletion(-)\n\ndiff --git a/t/t0100-previous.sh b/t/t0100-previous.sh\nindex dd5d9b4e5e..94a12e4ab6 100755\n--- a/t/t0100-previous.sh\n+++ b/t/t0100-previous.sh\n@@ -40,7 +40,8 @@ test_expect_success 'merge @{-1}' '\n \tgit checkout other &&\n \tgit checkout main &&\n \tgit merge @{-1} &&\n-\tgit cat-file commit HEAD | grep \"Merge branch '\\''other'\\''\"\n+\tgit cat-file commit HEAD >actual &&\n+\ttest_grep \"Merge branch '\\''other'\\''\" actual\n '\n \n test_expect_success 'merge @{-1}~1' '\n-- \n2.43.0\n\n"},{"id":"540300","messageId":"20260328200255.247759-17-vikingtc4@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"[GSoC PATCH 16/16] t2206: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-28T20:02:55Z","receivedAt":"2026-03-28T20:03:32Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"Update t2206-add-submodule-ignored.sh to redirect git-cmds output\nto a temporary file instead of piping it directly to not hide the\nexit code of git commands behind pipes, as a crash in git might\ngo unnoticed.\n\nSome tests run inside a subdirectory that is itself a git repo and\nuse 'git add .' on the whole working tree, so the temporary file is\nwritten as '../actual' to keep it outside the inner repo and prevent\nit from being accidentally staged.\n\nSigned-off-by: Trieu Huynh <vikingtc4@gmail.com>\n---\n t/t2206-add-submodule-ignored.sh | 45 +++++++++++++++++++++-----------\n 1 file changed, 30 insertions(+), 15 deletions(-)\n\ndiff --git a/t/t2206-add-submodule-ignored.sh b/t/t2206-add-submodule-ignored.sh\nindex e581e87ab2..7141012e50 100755\n--- a/t/t2206-add-submodule-ignored.sh\n+++ b/t/t2206-add-submodule-ignored.sh\n@@ -45,9 +45,11 @@ test_expect_success 'main: add submodule with default config'  '\n \tcd main &&\n \tgit submodule add ../sub &&\n \tgit commit -m \"add submodule\" &&\n-\tgit log --oneline --name-only | grep \"^sub$\" &&\n+\tgit log --oneline --name-only >actual &&\n+\ttest_grep \"^sub$\" actual &&\n \tgit -C sub reset --hard v2.0 &&\n-\tgit status --porcelain | grep \"^ M sub$\" &&\n+\tgit status --porcelain >actual &&\n+\ttest_grep \"^ M sub$\" actual &&\n \techo\n '\n #3\n@@ -58,8 +60,10 @@ test_expect_success 'main: submodule config ignore=all'  '\n \tgit config -f .gitmodules submodule.sub.ignore all &&\n \tGIT_TRACE=1 git add . &&\n \tgit commit -m \"update submodule config sub.ignore all\" &&\n-\t! git status --porcelain | grep \"^.*$\" &&\n-\t! git log --oneline --name-only | grep \"^sub$\" &&\n+\tgit status --porcelain >../actual &&\n+\ttest_must_be_empty ../actual &&\n+\tgit log --oneline --name-only >../actual &&\n+\ttest_grep ! \"^sub$\" ../actual &&\n \techo\n '\n #4\n@@ -69,8 +73,10 @@ test_expect_success 'sub: change to different sha1 and check status in main'  '\n \tcd \"${base_path}\" &&\n \tcd main &&\n \tgit -C sub reset --hard v1.0 &&\n-\t! git status --porcelain | grep \"^ M sub$\" &&\n-\tgit status --ignore-submodules=none --porcelain | grep \"^ M sub$\" &&\n+\tgit status --porcelain >../actual &&\n+\ttest_grep ! \"^ M sub$\" ../actual &&\n+\tgit status --ignore-submodules=none --porcelain >../actual &&\n+\ttest_grep \"^ M sub$\" ../actual &&\n \techo\n '\n \n@@ -80,7 +86,8 @@ test_expect_success 'main: check normal add and status'  '\n \tcd \"${base_path}\" &&\n \tcd main &&\n \tGIT_TRACE=1 git add . &&\n-\t! git status --porcelain | grep \"^ M sub$\" &&\n+\tgit status --porcelain >../actual &&\n+\ttest_grep ! \"^ M sub$\" ../actual &&\n \techo\n '\n \n@@ -91,7 +98,8 @@ test_expect_success 'main: check --force add . and status'  '\n \tcd \"${base_path}\" &&\n \tcd main &&\n \tGIT_TRACE=1 git add --force . &&\n-\t! git status --porcelain | grep \"^M  sub$\" &&\n+\tgit status --porcelain >../actual &&\n+\ttest_grep ! \"^M  sub$\" ../actual &&\n \techo\n '\n \n@@ -101,8 +109,10 @@ test_expect_success 'main: check --force add . and status'  '\n test_expect_success 'main: check _add sub_ and status'  '\n \tcd \"${base_path}\" &&\n \tcd main &&\n-\tGIT_TRACE=1 git add sub 2>&1 | grep \"Skipping submodule due to ignore=all: sub\" &&\n-\t! git status --porcelain | grep \"^M  sub$\" &&\n+\tGIT_TRACE=1 git add sub >../actual 2>&1 &&\n+\ttest_grep \"Skipping submodule due to ignore=all: sub\" ../actual &&\n+\tgit status --porcelain >../actual &&\n+\ttest_grep ! \"^M  sub$\" ../actual &&\n \techo\n '\n \n@@ -118,15 +128,20 @@ test_expect_success 'main: check force add sub and ./sub/ and status'  '\n \tcd main &&\n \techo \"Adding with --force should work: git add --force sub\" &&\n \tGIT_TRACE=1 git add --force sub &&\n-\tgit status --porcelain | grep \"^M  sub$\" &&\n+\tgit status --porcelain >../actual &&\n+\ttest_grep \"^M  sub$\" ../actual &&\n \tgit restore --staged sub &&\n-\t! git status --porcelain | grep \"^M  sub$\" &&\n+\tgit status --porcelain >../actual &&\n+\ttest_grep ! \"^M  sub$\" ../actual &&\n \techo \"Adding with --force should work: git add --force ./sub/\" &&\n \tGIT_TRACE=1 git add --force ./sub/ &&\n-\tgit status --porcelain | grep \"^M  sub$\" &&\n+\tgit status --porcelain >../actual &&\n+\ttest_grep \"^M  sub$\" ../actual &&\n \tgit commit -m \"update submodule pointer\" &&\n-\t! git status --porcelain | grep \"^ M sub$\" &&\n-\tgit log --ignore-submodules=none --name-only --oneline | grep \"^sub$\" &&\n+\tgit status --porcelain >../actual &&\n+\ttest_grep ! \"^ M sub$\" ../actual &&\n+\tgit log --ignore-submodules=none --name-only --oneline >../actual &&\n+\ttest_grep \"^sub$\" ../actual &&\n \techo\n '\n \n-- \n2.43.0\n\n"},{"id":"540307","messageId":"xmqqpl4nh3b3.fsf@gitster.g","threadId":"65376","inReplyTo":"20260328200255.247759-1-vikingtc4@gmail.com","subject":"Re: [GSoC PATCH 00/16] Microproject: avoid suppressing git's exit code","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-03-29T00:44:48Z","receivedAt":"2026-03-29T00:44:51Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Trieu Huynh <vikingtc4@gmail.com> writes:\n\n> Piping git command output directly to subsequent command (eg. grep)\n> hides the exit code of git behind the pipe.  A crash in git would go\n> unnoticed because the shell only sees grep's exit code.\n>\n> This series extends the same fix to 16 more test files, following the\n> approach introduced in t8003 [1] (redirect output to a temporary file,\n> then use test_grep on that file).\n>\n> Note: t2206 is a special case -- some tests cd into a subdirectory\n> that is itself a git repo and run 'git add .' on the whole working\n> tree.  To prevent the temporary file from being accidentally staged,\n> it is written as '../actual', outside the inner repo.\n>\n> Related-to: https://lore.kernel.org/git/20260328132955.172262-1-vikingtc4@gmail.com/T/#t\n> See-also: https://lore.kernel.org/git/xmqq4im2sjnu.fsf@gitster.g/T/#t\n\nSee also https://git.github.io/General-Microproject-Information/#:~:text=Only%20ONE%20quality%20focused%20microproject%20per%20applicant\n\nThanks.\n"},{"id":"540325","messageId":"ftwnrutdbvyf7phr4ad76agt2jvzgieqnxprvmoyw2vzwbhgqy@z4x2g2n3ft4r","threadId":"65376","inReplyTo":"xmqqpl4nh3b3.fsf@gitster.g","subject":"Re: [GSoC PATCH 00/16] Microproject: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-29T12:59:21Z","receivedAt":"2026-03-29T12:59:28Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"On Sat, Mar 28, 2026 at 05:44:48PM -0700, Junio C Hamano wrote:\n> Trieu Huynh <vikingtc4@gmail.com> writes:\n> \n> > Piping git command output directly to subsequent command (eg. grep)\n> > hides the exit code of git behind the pipe.  A crash in git would go\n> > unnoticed because the shell only sees grep's exit code.\n> >\n> > This series extends the same fix to 16 more test files, following the\n> > approach introduced in t8003 [1] (redirect output to a temporary file,\n> > then use test_grep on that file).\n> >\n> > Note: t2206 is a special case -- some tests cd into a subdirectory\n> > that is itself a git repo and run 'git add .' on the whole working\n> > tree.  To prevent the temporary file from being accidentally staged,\n> > it is written as '../actual', outside the inner repo.\n> >\n> > Related-to: https://lore.kernel.org/git/20260328132955.172262-1-vikingtc4@gmail.com/T/#t\n> > See-also: https://lore.kernel.org/git/xmqq4im2sjnu.fsf@gitster.g/T/#t\n> \n> See also https://git.github.io/General-Microproject-Information/#:~:text=Only%20ONE%20quality%20focused%20microproject%20per%20applicant\n> \n> Thanks.\nAck, I missed that point. Could you clarify how many patches or\nfiles changed are considered appropriate for the microproject?\n\nBRs,\n"},{"id":"540331","messageId":"3575e53a-a675-4e55-bc17-cce9cff1423f@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-8-vikingtc4@gmail.com","subject":"Re: [GSoC PATCH 07/16] t4153: avoid suppressing git's exit code","fromName":"Tian Yuchen","fromEmail":"a3205153416@gmail.com","sentAt":"2026-03-29T15:59:19Z","receivedAt":"2026-03-29T15:59:23Z","isPatch":true,"sender":{"key":"cat@malon.dev","avatar":"https://avatars.githubusercontent.com/u/232002048?v=4"},"body":"On 3/29/26 04:02, Trieu Huynh wrote:\n> Update t4153-am-resume-override-opts.sh to redirect git-cmds\n> output to a temporary file instead of piping it directly to\n> not hide the exit code of git commands behind pipes, as a crash\n> in git might go unnoticed.\n> \n> Signed-off-by: Trieu Huynh <vikingtc4@gmail.com>\n> ---\n>   t/t4153-am-resume-override-opts.sh | 3 ++-\n>   1 file changed, 2 insertions(+), 1 deletion(-)\n> \n> diff --git a/t/t4153-am-resume-override-opts.sh b/t/t4153-am-resume-override-opts.sh\n> index 9bec989a0e..30137aec20 100755\n> --- a/t/t4153-am-resume-override-opts.sh\n> +++ b/t/t4153-am-resume-override-opts.sh\n> @@ -81,7 +81,8 @@ test_expect_success '--signoff overrides --no-signoff' '\n>   \n>   \t# Applied side1 will be signed off\n>   \techo \"Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>\" >expected &&\n> -\tgit cat-file commit HEAD^ | grep \"Signed-off-by:\" >actual &&\n> +\tgit cat-file commit HEAD^ >commit_raw &&\n> +\ttest_grep \"Signed-off-by:\" commit_raw >actual &&\n\nThe behavior of 'test_grep' is the opposite of what you might expect. It \ndoes nothing when the input matches, and only reports an error when it \ndoesn't match. Therefore, 'actual' is empty here...\n\n>   \ttest_cmp expected actual &&\n>   \n>   \t# Applied side2 will not be signed off\n\n...and this test is bound to fail.\n\nRegards, Yuchen\n"},{"id":"540332","messageId":"acce32dc-b7ef-4b28-a36f-8ab90ccdc825@gmail.com","threadId":"65376","inReplyTo":"20260328200255.247759-12-vikingtc4@gmail.com","subject":"Re: [GSoC PATCH 11/16] t3903: avoid suppressing git's exit code","fromName":"Tian Yuchen","fromEmail":"a3205153416@gmail.com","sentAt":"2026-03-29T16:14:07Z","receivedAt":"2026-03-29T16:14:11Z","isPatch":true,"sender":{"key":"cat@malon.dev","avatar":"https://avatars.githubusercontent.com/u/232002048?v=4"},"body":"On 3/29/26 04:02, Trieu Huynh wrote:\n> Update t3903-stash.sh to redirect git-cmds output to a temporary\n> file instead of piping it directly to not hide the exit code\n> of git commands behind pipes, as a crash in git might go\n> unnoticed.\n> \n> Signed-off-by: Trieu Huynh <vikingtc4@gmail.com>\n> ---\n>   t/t3903-stash.sh | 5 +++--\n>   1 file changed, 3 insertions(+), 2 deletions(-)\n> \n> diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh\n> index 70879941c2..b67cf23fbb 100755\n> --- a/t/t3903-stash.sh\n> +++ b/t/t3903-stash.sh\n> @@ -962,7 +962,8 @@ test_expect_success 'store updates stash ref and reflog' '\n>   \ttest_path_is_missing bazzy &&\n>   \tgit stash store -m quuxery $STASH_ID &&\n>   \ttest $(git rev-parse stash) = $STASH_ID &&\n> -\tgit reflog --format=%H stash| grep $STASH_ID &&\n> +\tgit reflog --format=%H stash >actual &&\n> +\ttest_grep \"$STASH_ID\" actual &&\n>   \tgit stash pop &&\n>   \tgrep quux bazzy\n>   '\n> @@ -976,7 +977,7 @@ test_expect_success 'handle stash specification with spaces' '\n>   \techo cow >file &&\n>   \tgit stash &&\n>   \tgit stash apply \"stash@{$stamp}\" &&\n> -\tgrep pig file\n> +\ttest_grep pig file\n\nWhat does this have to do with the title of this patch? There is no pipe \noperator here, not even a single Git command. I suspect you wrote a \nscript to generate this series of patches. The commit messages are the \nsame for every patch.\n\nAs mentioned in the link provided by Junio, what matters in \nmicroprojects is quality, not quantity. Are these patches meaningful in \nand of themselves? Of course they are, but are they *necessary*? That’s \na matter of opinion. What really matters is that the Git community \nevaluates your overall performance to determine whether you have the \nability to write code according to the code guidelines, test your own \nwork, and communicate with other developers — not how useful the patch \nitself is.\n\n>   '\n>   \n>   test_expect_success 'setup stash with index and worktree changes' '\n\nKeep learning, and welcome to the Git community!\n\nRegards, Yuchen\n\n"},{"id":"540359","messageId":"CAOLa=ZTqySjCZitN9-ZWxMuwTaOg1TR8hiLEohWVwp2=coSQtA@mail.gmail.com","threadId":"65376","inReplyTo":"ftwnrutdbvyf7phr4ad76agt2jvzgieqnxprvmoyw2vzwbhgqy@z4x2g2n3ft4r","subject":"Re: [GSoC PATCH 00/16] Microproject: avoid suppressing git's exit code","fromName":"Karthik Nayak","fromEmail":"karthik.188@gmail.com","sentAt":"2026-03-30T09:51:10Z","receivedAt":"2026-03-30T09:51:12Z","isPatch":true,"sender":{"key":"karthik.188@gmail.com","avatar":"https://avatars.githubusercontent.com/u/1786334?v=4"},"body":"Trieu Huynh <vikingtc4@gmail.com> writes:\n\n> On Sat, Mar 28, 2026 at 05:44:48PM -0700, Junio C Hamano wrote:\n>> Trieu Huynh <vikingtc4@gmail.com> writes:\n>>\n>> > Piping git command output directly to subsequent command (eg. grep)\n>> > hides the exit code of git behind the pipe.  A crash in git would go\n>> > unnoticed because the shell only sees grep's exit code.\n>> >\n>> > This series extends the same fix to 16 more test files, following the\n>> > approach introduced in t8003 [1] (redirect output to a temporary file,\n>> > then use test_grep on that file).\n>> >\n>> > Note: t2206 is a special case -- some tests cd into a subdirectory\n>> > that is itself a git repo and run 'git add .' on the whole working\n>> > tree.  To prevent the temporary file from being accidentally staged,\n>> > it is written as '../actual', outside the inner repo.\n>> >\n>> > Related-to: https://lore.kernel.org/git/20260328132955.172262-1-vikingtc4@gmail.com/T/#t\n>> > See-also: https://lore.kernel.org/git/xmqq4im2sjnu.fsf@gitster.g/T/#t\n>>\n>> See also https://git.github.io/General-Microproject-Information/#:~:text=Only%20ONE%20quality%20focused%20microproject%20per%20applicant\n>>\n>> Thanks.\n> Ack, I missed that point. Could you clarify how many patches or\n> files changed are considered appropriate for the microproject?\n>\n> BRs,\n\nHello,\n\nThe microprojects are meant for contributors to get a hang of\ncontributing to the project. As such, we expect only a single file\nchange. This is also listed in the Guidelines [1].\n\nThanks\n\n[1]: https://git.github.io/General-Microproject-Information/\n"},{"id":"540391","messageId":"xmqqbjg5fjls.fsf@gitster.g","threadId":"65376","inReplyTo":"ftwnrutdbvyf7phr4ad76agt2jvzgieqnxprvmoyw2vzwbhgqy@z4x2g2n3ft4r","subject":"Re: [GSoC PATCH 00/16] Microproject: avoid suppressing git's exit code","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-03-30T15:00:15Z","receivedAt":"2026-03-30T15:00:18Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Trieu Huynh <vikingtc4@gmail.com> writes:\n\n> Ack, I missed that point. Could you clarify how many patches or\n> files changed are considered appropriate for the microproject?\n\nThe end product (i.e., a patch that could be applied to my tree) of\na microproject is not expected to have any value to improve the\nproject codebase.  The process has two objectives.  One is to help\nnew people experience the end-to-end process of sending their first\npatch, getting it reviewed, engaging in a dialog with the reviewer\nand communicating with others in the community, and polishing and\nresubmitting the patch.  And the other is to help us see how well\neach candidate can work with reviewers and others in the community.\n\nThe size of a microproject submission to allow us achieve the two\ngoals may ideally be one-liner change ;-) but it may be a bit too\nhard to gauge the effectiveness of the candidate with such a small\npatch, so in practice the lower bound would be a single file with a\nfew hunks, with two paragraphs in the proposed log message.\n\nAnd we certainly do not need 16-patch series, each doing very\nsimilar things and likely to be making similar mistakes at the same\ntime.  Interactions with reviewers on just one patch would be\nsufficient for them to learn the community norm, and for us to gauge\nhow effective the canidate is, without doing the same or similar\nexchanges for the other 15 patches.\n\n"},{"id":"540420","messageId":"fgbqroyrek47qqnzyeuhbijonj4y4h24kafwzs6z5om52lxflh@3on4ynvhgxf2","threadId":"65376","inReplyTo":"xmqqbjg5fjls.fsf@gitster.g","subject":"Re: [GSoC PATCH 00/16] Microproject: avoid suppressing git's exit code","fromName":"Trieu Huynh","fromEmail":"vikingtc4@gmail.com","sentAt":"2026-03-30T18:50:29Z","receivedAt":"2026-03-30T18:50:34Z","isPatch":true,"sender":{"key":"vikingtc4@gmail.com","avatar":"https://avatars.githubusercontent.com/u/86428744?v=4"},"body":"On Mon, Mar 30, 2026 at 08:00:15AM -0700, Junio C Hamano wrote:\n> Trieu Huynh <vikingtc4@gmail.com> writes:\n> \n> > Ack, I missed that point. Could you clarify how many patches or\n> > files changed are considered appropriate for the microproject?\n> \n> The end product (i.e., a patch that could be applied to my tree) of\n> a microproject is not expected to have any value to improve the\n> project codebase.  The process has two objectives.  One is to help\n> new people experience the end-to-end process of sending their first\n> patch, getting it reviewed, engaging in a dialog with the reviewer\n> and communicating with others in the community, and polishing and\n> resubmitting the patch.  And the other is to help us see how well\n> each candidate can work with reviewers and others in the community.\n> \n> The size of a microproject submission to allow us achieve the two\n> goals may ideally be one-liner change ;-) but it may be a bit too\n> hard to gauge the effectiveness of the candidate with such a small\n> patch, so in practice the lower bound would be a single file with a\n> few hunks, with two paragraphs in the proposed log message.\n> \n> And we certainly do not need 16-patch series, each doing very\n> similar things and likely to be making similar mistakes at the same\n> time.  Interactions with reviewers on just one patch would be\n> sufficient for them to learn the community norm, and for us to gauge\n> how effective the canidate is, without doing the same or similar\n> exchanges for the other 15 patches.\n> \nHello, I appreciate all your kind comments. Thank you.\nDrop this series here.\n\nBRs,\n"}]}