All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] t: add and use a commit_body test helper
@ 2026-07-26 22:48 Shlok Kulshreshtha
  2026-07-26 22:48 ` [PATCH 1/2] test-lib-functions: add commit_body helper Shlok Kulshreshtha
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Shlok Kulshreshtha @ 2026-07-26 22:48 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Shlok Kulshreshtha

While reviewing "t7614: avoid hiding git's exit code in a pipe"
(now in master as b6b276974e), Junio pointed out that the pattern
fixed there by hand -- "cat-file the commit object, and strip away
the object header with sed" -- recurs throughout the test suite, and
suggested factoring it into a helper (cf. <xmqq1pd4m4ea.fsf@gitster.g>):

    commit_body () {
        git cat-file commit "$1" >.commit &&
        sed -e "1,/^$/d" .commit &&
        rm -f .commit
    }

I said I would take this up as a follow-up once t7614 landed. It has,
so here it is.

Scope:

  1/2 adds the helper to t/test-lib-functions.sh, following Junio's
      sketch, with a t/README entry.

  2/2 converts the existing call sites: 60 sites across 11 files.
      The idiom appears in four equivalent spellings (piped or
      written to a file first, "sed -e" or plain "sed", "\$" or "$"
      in the address) that all produce byte-identical output and
      collapse to the same commit_body call. Two sites needed more
      than a mechanical substitution and are explained individually
      in that commit's message; a few more are left alone because
      they are not extracting a commit's message body at all (email
      headers, a hand-built object for fsck, a .patch file).

Converting the piped sites also closes the same exit-code hole t7614
fixed: the exit status of a pipeline is that of its last command, so
a crashing "git cat-file" was previously masked by "sed" succeeding
on empty input.

Verification: all 11 touched test scripts pass in full (build clean,
no new failures), and a deliberately failing "git cat-file" now fails
a converted test that previously passed, confirming the exit-code fix
is real.

Shlok Kulshreshtha (2):
  test-lib-functions: add commit_body helper
  t: use commit_body to extract commit message bodies

 t/README                                  | 11 ++++
 t/t3405-rebase-malformed.sh               |  8 +--
 t/t3408-rebase-multi-line.sh              |  4 +-
 t/t3434-rebase-i18n.sh                    |  3 +-
 t/t3900-i18n-commit.sh                    |  4 +-
 t/t4150-am.sh                             |  8 +--
 t/t7500-commit-template-squash-signoff.sh |  4 +-
 t/t7501-commit-basic-functionality.sh     | 21 +++----
 t/t7502-commit-porcelain.sh               | 77 ++++++++---------------
 t/t7600-merge.sh                          | 14 ++---
 t/t7604-merge-custom-message.sh           | 18 ++----
 t/t7614-merge-signoff.sh                  |  9 +--
 t/test-lib-functions.sh                   |  8 +++
 13 files changed, 81 insertions(+), 108 deletions(-)

-- 
2.52.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/2] test-lib-functions: add commit_body helper
  2026-07-26 22:48 [PATCH 0/2] t: add and use a commit_body test helper Shlok Kulshreshtha
@ 2026-07-26 22:48 ` Shlok Kulshreshtha
  2026-07-26 22:48 ` [PATCH 2/2] t: use commit_body to extract commit message bodies Shlok Kulshreshtha
  2026-07-27  8:15 ` [PATCH 0/2] t: add and use a commit_body test helper Junio C Hamano
  2 siblings, 0 replies; 8+ messages in thread
From: Shlok Kulshreshtha @ 2026-07-26 22:48 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Shlok Kulshreshtha

Extracting the message body of a commit -- running "git cat-file commit"
and stripping everything up to and including the first blank line with
"sed" -- is spelled out in about 60 places across the test suite.

Add a helper for it, so that the operation is written once instead of
being copied around.

The commit object goes to a temporary file rather than into a pipe,
because a pipeline reports only its last command's exit status, so a
failure of "git cat-file" would go unnoticed.

Signed-off-by: Shlok Kulshreshtha <diy2903@gmail.com>
---
 t/README                | 11 +++++++++++
 t/test-lib-functions.sh |  8 ++++++++
 2 files changed, 19 insertions(+)

diff --git a/t/README b/t/README
index 4252774f86..9a9daaf2af 100644
--- a/t/README
+++ b/t/README
@@ -945,6 +945,17 @@ see test-lib-functions.sh for the full list and their options.
    Merges the given rev using the given message.  Like test_commit,
    creates a tag and calls test_tick before committing.
 
+ - commit_body <rev>
+
+   Print the message body of <rev>, i.e. the contents of its commit
+   object with the header removed.  Use this instead of piping
+   "git cat-file commit" into "sed", which would hide a failure of
+   the git command.
+
+   Example:
+
+	commit_body HEAD >actual
+
  - test_set_prereq <prereq>
 
    Set a test prerequisite to be used later with test_have_prereq. The
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 809c662124..03bf31d8ef 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -1433,6 +1433,14 @@ test_commit_message () {
 	test_cmp "$msg_file" actual.msg
 }
 
+# Print the message body of a commit
+# Usage: commit_body <rev>
+commit_body () {
+	git cat-file commit "$1" >.commit &&
+	sed -e "1,/^$/d" .commit &&
+	rm -f .commit
+}
+
 # Compare paths respecting core.ignoreCase
 test_cmp_fspath () {
 	if test "x$1" = "x$2"
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/2] t: use commit_body to extract commit message bodies
  2026-07-26 22:48 [PATCH 0/2] t: add and use a commit_body test helper Shlok Kulshreshtha
  2026-07-26 22:48 ` [PATCH 1/2] test-lib-functions: add commit_body helper Shlok Kulshreshtha
@ 2026-07-26 22:48 ` Shlok Kulshreshtha
  2026-07-27  8:15 ` [PATCH 0/2] t: add and use a commit_body test helper Junio C Hamano
  2 siblings, 0 replies; 8+ messages in thread
From: Shlok Kulshreshtha @ 2026-07-26 22:48 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Shlok Kulshreshtha

Replace the "git cat-file commit | sed" idiom with commit_body across the
test suite: 60 sites in 11 files. The idiom appears in four equivalent
spellings -- piped or written to a file first, "sed -e" or plain "sed",
"\$" or "$" in the address -- all producing byte-identical output; they
all collapse to the same commit_body call.

Two sites needed more than a mechanical substitution:

* t7600.sh ("merge --no-ff --edit") greps the raw commit object for a
  phrase before stripping its header for the final comparison. The
  phrase is part of the commit body, not the header, so the grep can
  run against the already-stripped body instead, letting both steps
  share one commit_body call.

* t3900-i18n-commit.sh pipes the stripped body into "iconv" to test
  re-encoding. Piping commit_body's output into "iconv" would reintroduce
  an exit-code hole one line after removing it elsewhere, so this site
  writes the body to a file first and reads that, keeping the &&-chain
  intact.

Some greps for sed -e "1,/^\*$/d" left unconverted, as they are not extracting a commit's message body:

* t9001-send-email.sh strips mail headers from a message file, not a
  commit object.
* t1450-fsck.sh strips the header off a hand-built commit object while
  constructing a malformed one for fsck to reject.
* t4014-format-patch.sh runs the same sed address on a ".patch" file,
  with an additional expression.

All converted files pass in full, and a deliberately failing
"git cat-file" now fails a converted test that previously passed.

Signed-off-by: Shlok Kulshreshtha <diy2903@gmail.com>
---
 t/t3405-rebase-malformed.sh               |  8 +--
 t/t3408-rebase-multi-line.sh              |  4 +-
 t/t3434-rebase-i18n.sh                    |  3 +-
 t/t3900-i18n-commit.sh                    |  4 +-
 t/t4150-am.sh                             |  8 +--
 t/t7500-commit-template-squash-signoff.sh |  4 +-
 t/t7501-commit-basic-functionality.sh     | 21 +++----
 t/t7502-commit-porcelain.sh               | 77 ++++++++---------------
 t/t7600-merge.sh                          | 14 ++---
 t/t7604-merge-custom-message.sh           | 18 ++----
 t/t7614-merge-signoff.sh                  |  9 +--
 11 files changed, 62 insertions(+), 108 deletions(-)

diff --git a/t/t3405-rebase-malformed.sh b/t/t3405-rebase-malformed.sh
index 2524331861..271195fc11 100755
--- a/t/t3405-rebase-malformed.sh
+++ b/t/t3405-rebase-malformed.sh
@@ -37,7 +37,7 @@ test_expect_success setup '
 	test_tick &&
 	git commit -F F &&
 
-	git cat-file commit HEAD | sed -e "1,/^\$/d" >F0 &&
+	commit_body HEAD >F0 &&
 
 	git checkout diff-in-message &&
 	echo "commit log message containing a diff" >G &&
@@ -48,7 +48,7 @@ test_expect_success setup '
 	test_tick &&
 	git commit -F G &&
 
-	git cat-file commit HEAD | sed -e "1,/^\$/d" >G0 &&
+	commit_body HEAD >G0 &&
 
 	git checkout empty-message-merge &&
 	echo file3 >file3 &&
@@ -66,7 +66,7 @@ test_expect_success setup '
 test_expect_success 'rebase commit with multi-line subject' '
 
 	git rebase main multi-line-subject &&
-	git cat-file commit HEAD | sed -e "1,/^\$/d" >F1 &&
+	commit_body HEAD >F1 &&
 
 	test_cmp F0 F1 &&
 	test_cmp F F0
@@ -74,7 +74,7 @@ test_expect_success 'rebase commit with multi-line subject' '
 
 test_expect_success 'rebase commit with diff in message' '
 	git rebase main diff-in-message &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >G1 &&
+	commit_body HEAD >G1 &&
 	test_cmp G0 G1 &&
 	test_cmp G G0
 '
diff --git a/t/t3408-rebase-multi-line.sh b/t/t3408-rebase-multi-line.sh
index cde3562e3a..2ab89e1a7d 100755
--- a/t/t3408-rebase-multi-line.sh
+++ b/t/t3408-rebase-multi-line.sh
@@ -50,8 +50,8 @@ test_expect_success rebase '
 
 	git checkout side &&
 	git rebase main &&
-	git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
-	git cat-file commit side@{1} | sed -e "1,/^\$/d" >expect &&
+	commit_body HEAD >actual &&
+	commit_body side@{1} >expect &&
 	test_cmp expect actual
 
 '
diff --git a/t/t3434-rebase-i18n.sh b/t/t3434-rebase-i18n.sh
index 8c94fdffc4..0f93a239f8 100755
--- a/t/t3434-rebase-i18n.sh
+++ b/t/t3434-rebase-i18n.sh
@@ -27,8 +27,7 @@ fi
 
 compare_msg () {
 	iconv -f "$2" -t "$3" "$TEST_DIRECTORY/t3434/$1" >expect &&
-	git cat-file commit HEAD >raw &&
-	sed "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 }
 
diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh
index 3c930ec202..b3f03bcbd0 100755
--- a/t/t3900-i18n-commit.sh
+++ b/t/t3900-i18n-commit.sh
@@ -232,8 +232,8 @@ test_commit_autosquash_multi_encoding () {
 		git rev-list HEAD >actual &&
 		test_line_count = 3 actual &&
 		iconv -f $old -t UTF-8 "$TEST_DIRECTORY"/t3900/$msg >expect &&
-		git cat-file commit HEAD^ >raw &&
-		(sed "1,/^$/d" raw | iconv -f $new -t utf-8) >actual &&
+		commit_body HEAD^ >raw &&
+		iconv -f $new -t utf-8 <raw >actual &&
 		test_cmp expect actual
 	'
 }
diff --git a/t/t4150-am.sh b/t/t4150-am.sh
index 61c3ce9018..ee96223668 100755
--- a/t/t4150-am.sh
+++ b/t/t4150-am.sh
@@ -1018,7 +1018,7 @@ test_expect_success 'am -s unexpected trailer block' '
 	Signed-off-by: J C H <j@c.h>
 	EOF
 	git commit -F msg &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >original &&
+	commit_body HEAD >original &&
 	git format-patch --stdout -1 >patch &&
 
 	git reset --hard HEAD^ &&
@@ -1027,7 +1027,7 @@ test_expect_success 'am -s unexpected trailer block' '
 		cat original &&
 		echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
 	) >expect &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual &&
 
 	cat >msg <<-\EOF &&
@@ -1038,7 +1038,7 @@ test_expect_success 'am -s unexpected trailer block' '
 	EOF
 	git reset HEAD^ &&
 	git commit -F msg file &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >original &&
+	commit_body HEAD >original &&
 	git format-patch --stdout -1 >patch &&
 
 	git reset --hard HEAD^ &&
@@ -1049,7 +1049,7 @@ test_expect_success 'am -s unexpected trailer block' '
 		echo &&
 		echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
 	) >expect &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
diff --git a/t/t7500-commit-template-squash-signoff.sh b/t/t7500-commit-template-squash-signoff.sh
index 66aff8e097..5e782ad8d7 100755
--- a/t/t7500-commit-template-squash-signoff.sh
+++ b/t/t7500-commit-template-squash-signoff.sh
@@ -59,7 +59,7 @@ test_expect_success 'nonexistent template file in config should return error' '
 test_expect_success 'nonexistent optional template file in config' '
 	test_config commit.template ":(optional)$(pwd)"/notexist &&
 	GIT_EDITOR="echo hello >" git commit --allow-empty &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >actual &&
+	commit_body HEAD >actual &&
 	echo hello >expect &&
 	test_cmp expect actual
 '
@@ -204,7 +204,7 @@ EOF
 test_expect_success '--signoff' '
 	echo "yet another content *narf*" >> foo &&
 	echo "zort" | git commit -s -F - foo &&
-	git cat-file commit HEAD | sed "1,/^\$/d" > output &&
+	commit_body HEAD >output &&
 	test_cmp expect output
 '
 
diff --git a/t/t7501-commit-basic-functionality.sh b/t/t7501-commit-basic-functionality.sh
index 7794babe46..d0af38df20 100755
--- a/t/t7501-commit-basic-functionality.sh
+++ b/t/t7501-commit-basic-functionality.sh
@@ -491,8 +491,7 @@ test_expect_success 'sign off (1)' '
 	echo 1 >positive &&
 	git add positive &&
 	git commit -s -m "thank you" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo thank you &&
 		echo &&
@@ -511,8 +510,7 @@ test_expect_success 'sign off (2)' '
 	git commit -s -m "thank you
 
 $existing" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo thank you &&
 		echo &&
@@ -532,8 +530,7 @@ test_expect_success 'signoff gap' '
 	git commit -s -m "welcome
 
 $alt" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo welcome &&
 		echo &&
@@ -553,8 +550,7 @@ test_expect_success 'signoff gap 2' '
 
 We have now
 $alt" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo welcome &&
 		echo &&
@@ -575,8 +571,7 @@ test_expect_success 'signoff respects trailer config' '
 
 non-trailer line
 Myfooter: x" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo subject &&
 		echo &&
@@ -593,8 +588,7 @@ Myfooter: x" &&
 
 non-trailer line
 Myfooter: x" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo subject &&
 		echo &&
@@ -626,8 +620,7 @@ test_expect_success 'multiple -m' '
 	>negative &&
 	git add negative &&
 	git commit -m "one" -m "two" -m "three" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo one &&
 		echo &&
diff --git a/t/t7502-commit-porcelain.sh b/t/t7502-commit-porcelain.sh
index 62e3970e3f..2adfe70b3d 100755
--- a/t/t7502-commit-porcelain.sh
+++ b/t/t7502-commit-porcelain.sh
@@ -175,8 +175,7 @@ test_expect_success 'commit --trailer with "="' '
 	Reported-by: C3 E3
 	Mentored-by: C4 E4
 	EOF
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -195,8 +194,7 @@ test_expect_success 'commit --trailer with -c and "replace" as ifexists' '
 		commit --trailer "Mentored-by: C4 E4" \
 		 --trailer "Helped-by: C3 E3" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -217,8 +215,7 @@ test_expect_success 'commit --trailer with -c and "add" as ifexists' '
 		commit --trailer "Reported-by: C3 E3" \
 		--trailer "Mentored-by: C4 E4" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -238,8 +235,7 @@ test_expect_success 'commit --trailer with -c and "donothing" as ifexists' '
 		commit --trailer "Mentored-by: C5 E5" \
 		--trailer "Reviewed-by: C6 E6" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -259,8 +255,7 @@ test_expect_success 'commit --trailer with -c and "addIfDifferent" as ifexists'
 		commit --trailer "Reported-by: C3 E3" \
 		--trailer "Mentored-by: C5 E5" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -280,8 +275,7 @@ test_expect_success 'commit --trailer with -c and "addIfDifferentNeighbor" as if
 		commit --trailer "Mentored-by: C4 E4" \
 		--trailer "Reported-by: C3 E3" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -302,8 +296,7 @@ test_expect_success 'commit --trailer with -c and "end" as where' '
 		commit --trailer "Reported-by: C3 E3" \
 		--trailer "Mentored-by: C4 E4" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -323,8 +316,7 @@ test_expect_success 'commit --trailer with -c and "start" as where' '
 		commit --trailer "Signed-off-by: C O Mitter <committer@example.com>" \
 		--trailer "Signed-off-by: C1 E1" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -344,8 +336,7 @@ test_expect_success 'commit --trailer with -c and "after" as where' '
 		commit --trailer "Mentored-by: C4 E4" \
 		--trailer "Mentored-by: C5 E5" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -366,8 +357,7 @@ test_expect_success 'commit --trailer with -c and "before" as where' '
 		commit --trailer "Mentored-by: C3 E3" \
 		--trailer "Mentored-by: C2 E2" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -387,8 +377,7 @@ test_expect_success 'commit --trailer with -c and "donothing" as ifmissing' '
 		commit --trailer "Helped-by: C5 E5" \
 		--trailer "Based-by: C6 E6" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -409,8 +398,7 @@ test_expect_success 'commit --trailer with -c and "add" as ifmissing' '
 		commit --trailer "Helped-by: C5 E5" \
 		--trailer "Based-by: C6 E6" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -424,8 +412,7 @@ test_expect_success 'commit --trailer with -c ack.key ' '
 	EOF
 	git -c trailer.ack.key="Acked-by" \
 		commit --trailer "ack = Peff" -m "hello" &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -440,8 +427,7 @@ test_expect_success 'commit --trailer with -c and ":=#" as separators' '
 	git -c trailer.separators=":=#" \
 		-c trailer.bug.key="Bug #" \
 		commit --trailer "bug = 42" -m "I hate bug" &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -461,8 +447,7 @@ test_expect_success 'commit --trailer with -c and command' '
 		-c trailer.report.command="NAME=\"\$ARG\"; test -n \"\$NAME\" && \
 		git log --author=\"\$NAME\" -1 --format=\"format:%aN <%aE>\" || true" \
 		commit --trailer "report = author" --amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -480,8 +465,7 @@ test_expect_success 'commit --trailer not confused by --- separator' '
 		echo &&
 		echo "my-trailer: value"
 	} >expected &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -498,8 +482,7 @@ test_expect_success 'commit --trailer with --verbose' '
 		echo &&
 		echo "my-trailer: value"
 	} >expected &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -508,7 +491,7 @@ test_expect_success 'multiple -m' '
 	>negative &&
 	git add negative &&
 	git commit -m "one" -m "two" -m "three" &&
-	actual=$(git cat-file commit HEAD >tmp && sed -e "1,/^\$/d" tmp && rm tmp) &&
+	actual=$(commit_body HEAD) &&
 	expected=$(test_write_lines "one" "" "two" "" "three") &&
 	test "z$actual" = "z$expected"
 
@@ -545,8 +528,7 @@ test_expect_success 'cleanup commit messages (verbatim option,-t)' '
 
 	echo >>negative &&
 	git commit --cleanup=verbatim --no-status -t expect -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -555,8 +537,7 @@ test_expect_success 'cleanup commit messages (verbatim option,-F)' '
 
 	echo >>negative &&
 	git commit --cleanup=verbatim -F expect -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -565,8 +546,7 @@ test_expect_success 'cleanup commit messages (verbatim option,-m)' '
 
 	echo >>negative &&
 	git commit --cleanup=verbatim -m "$mesg_with_comment_and_newlines" -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -577,8 +557,7 @@ test_expect_success 'cleanup commit messages (whitespace option,-F)' '
 	test_write_lines "" "# text" "" >text &&
 	echo "# text" >expect &&
 	git commit --cleanup=whitespace -F text -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -605,8 +584,7 @@ test_expect_success 'cleanup commit messages (scissors option,-F,-e)' '
 	# to be kept, too
 	EOF
 	git commit --cleanup=scissors -e -F text -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -618,8 +596,7 @@ test_expect_success 'cleanup commit messages (scissors option,-F,-e, scissors on
 	to be removed
 	EOF
 	git commit --cleanup=scissors -e -F text -a --allow-empty-message &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_must_be_empty actual
 '
 
@@ -629,8 +606,7 @@ test_expect_success 'cleanup commit messages (strip option,-F)' '
 	test_write_lines "" "# text" "sample" "" >text &&
 	echo sample >expect &&
 	git commit --cleanup=strip -F text -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -849,8 +825,7 @@ test_expect_success 'A single-liner subject with a token plus colon is not a foo
 
 	git reset --hard &&
 	git commit -s -m "hello: kitty" --allow-empty &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_line_count = 3 actual
 
 '
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index 7f2a1db16d..64cb83284c 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -332,8 +332,7 @@ test_expect_success 'merge --squash c3 with c7' '
 	# Conflicts:
 	#	file
 	EOF
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -363,8 +362,7 @@ test_expect_success 'merge c3 with c7 with commit.cleanup = scissors' '
 	# Conflicts:
 	#	file
 	EOF
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -387,8 +385,7 @@ test_expect_success 'merge c3 with c7 with --squash commit.cleanup = scissors' '
 	# Conflicts:
 	#	file
 	EOF
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -989,9 +986,8 @@ test_expect_success 'merge --no-ff --edit' '
 	git reset --hard c0 &&
 	EDITOR=./editor git merge --no-ff --edit c1 &&
 	verify_parents $c0 $c1 &&
-	git cat-file commit HEAD >raw &&
-	test_grep "work done on the side branch" raw &&
-	sed "1,/^$/d" >actual raw &&
+	commit_body HEAD >actual &&
+	test_grep "work done on the side branch" actual &&
 	test_cmp expected actual
 '
 
diff --git a/t/t7604-merge-custom-message.sh b/t/t7604-merge-custom-message.sh
index cd4f9607dc..3a7d1ae858 100755
--- a/t/t7604-merge-custom-message.sh
+++ b/t/t7604-merge-custom-message.sh
@@ -36,16 +36,14 @@ test_expect_success 'setup' '
 test_expect_success 'merge c2 with a custom message' '
 	git reset --hard c1 &&
 	git merge -m "$(cat exp.subject)" c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp exp.subject actual
 '
 
 test_expect_success 'merge --log appends to custom message' '
 	git reset --hard c1 &&
 	git merge --log -m "$(cat exp.subject)" c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp exp.log actual
 '
 
@@ -61,8 +59,7 @@ test_expect_success 'prepare file with comment line and trailing newlines'  '
 test_expect_success 'cleanup commit messages (verbatim option)' '
 	git reset --hard c1 &&
 	git merge --cleanup=verbatim -F expect c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -71,8 +68,7 @@ test_expect_success 'cleanup commit messages (whitespace option)' '
 	test_write_lines "" "# text" "" >text &&
 	echo "# text" >expect &&
 	git merge --cleanup=whitespace -F text c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -97,8 +93,7 @@ test_expect_success 'cleanup merge messages (scissors option)' '
 	# to be kept, too
 	EOF
 	git merge --cleanup=scissors -e -F text c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -107,8 +102,7 @@ test_expect_success 'cleanup commit messages (strip option)' '
 	test_write_lines "" "# text" "sample" "" >text &&
 	echo sample >expect &&
 	git merge --cleanup=strip -F text c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
diff --git a/t/t7614-merge-signoff.sh b/t/t7614-merge-signoff.sh
index e58bf07b7a..b078eaf8a3 100755
--- a/t/t7614-merge-signoff.sh
+++ b/t/t7614-merge-signoff.sh
@@ -45,8 +45,7 @@ test_expect_success 'git merge --signoff adds a sign-off line' '
 	test_commit main-branch-2 file2 2 &&
 	git checkout other-branch &&
 	git merge main --signoff --no-edit &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected-signed actual
 '
 
@@ -56,8 +55,7 @@ test_expect_success 'git merge does not add a sign-off line' '
 	test_commit main-branch-3 file3 3 &&
 	git checkout other-branch &&
 	git merge main --no-edit &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected-unsigned actual
 '
 
@@ -67,8 +65,7 @@ test_expect_success 'git merge --no-signoff flag cancels --signoff flag' '
 	test_commit main-branch-4 file4 4 &&
 	git checkout other-branch &&
 	git merge main --no-edit --signoff --no-signoff &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected-unsigned actual
 '
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] t: add and use a commit_body test helper
  2026-07-26 22:48 [PATCH 0/2] t: add and use a commit_body test helper Shlok Kulshreshtha
  2026-07-26 22:48 ` [PATCH 1/2] test-lib-functions: add commit_body helper Shlok Kulshreshtha
  2026-07-26 22:48 ` [PATCH 2/2] t: use commit_body to extract commit message bodies Shlok Kulshreshtha
@ 2026-07-27  8:15 ` Junio C Hamano
  2026-07-27  9:28   ` Shlok Kulshreshtha
  2026-07-27  9:56   ` [PATCH v2 " Shlok Kulshreshtha
  2 siblings, 2 replies; 8+ messages in thread
From: Junio C Hamano @ 2026-07-27  8:15 UTC (permalink / raw)
  To: Shlok Kulshreshtha; +Cc: git

Shlok Kulshreshtha <diy2903@gmail.com> writes:

>  t/README                                  | 11 ++++
>  t/t3405-rebase-malformed.sh               |  8 +--
>  t/t3408-rebase-multi-line.sh              |  4 +-
>  t/t3434-rebase-i18n.sh                    |  3 +-
>  t/t3900-i18n-commit.sh                    |  4 +-
>  t/t4150-am.sh                             |  8 +--
>  t/t7500-commit-template-squash-signoff.sh |  4 +-
>  t/t7501-commit-basic-functionality.sh     | 21 +++----
>  t/t7502-commit-porcelain.sh               | 77 ++++++++---------------
>  t/t7600-merge.sh                          | 14 ++---
>  t/t7604-merge-custom-message.sh           | 18 ++----
>  t/t7614-merge-signoff.sh                  |  9 +--
>  t/test-lib-functions.sh                   |  8 +++
>  13 files changed, 81 insertions(+), 108 deletions(-)

Doesn't 'message_body' t7509 has follow the same pattern to hide
exit code from 'git cat-file commit'?

Thanks.



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] t: add and use a commit_body test helper
  2026-07-27  8:15 ` [PATCH 0/2] t: add and use a commit_body test helper Junio C Hamano
@ 2026-07-27  9:28   ` Shlok Kulshreshtha
  2026-07-27  9:56   ` [PATCH v2 " Shlok Kulshreshtha
  1 sibling, 0 replies; 8+ messages in thread
From: Shlok Kulshreshtha @ 2026-07-27  9:28 UTC (permalink / raw)
  To: gitster; +Cc: git, Shlok Kulshreshtha

Junio C Hamano <gitster@pobox.com> writes:

> Doesn't 'message_body' t7509 has follow the same pattern to hide
> exit code from 'git cat-file commit'?

Yes, you are right, I had missed that one. t7509 defines its own
local message_body() helper:

    message_body () {
	git cat-file commit "$1" |
	sed -e '1,/^$/d'
    }

which pipes "git cat-file commit" into "sed", the same
exit-code-hiding idiom commit_body was introduced to replace.
While rechecking, I found one more site with the same problem in
t3404-rebase-interactive.sh, a spacing variant of the idiom
("sed -e 1,/^\$/d" without quotes around the address) that didn't
match the four spellings I had searched for in the original patch.

I've replaced both -- the message_body helper (and its call sites)
in t7509, and the inline pipe in t3404 -- with commit_body. Will send
a v2 with these folded in.

Thanks.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 0/2] t: add and use a commit_body test helper
  2026-07-27  8:15 ` [PATCH 0/2] t: add and use a commit_body test helper Junio C Hamano
  2026-07-27  9:28   ` Shlok Kulshreshtha
@ 2026-07-27  9:56   ` Shlok Kulshreshtha
  2026-07-27  9:56     ` [PATCH v2 1/2] test-lib-functions: add commit_body helper Shlok Kulshreshtha
  2026-07-27  9:56     ` [PATCH v2 2/2] t: use commit_body to extract commit message bodies Shlok Kulshreshtha
  1 sibling, 2 replies; 8+ messages in thread
From: Shlok Kulshreshtha @ 2026-07-27  9:56 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Shlok Kulshreshtha

Junio pointed out that t7509-commit-authorship.sh defines its own local
message_body() helper that wraps the same "git cat-file commit | sed"
idiom commit_body was introduced to replace, which the first version of
this series missed. Rechecking the whole idiom by its sed
address, rather than by grepping for "cat-file", turned up one more
inline occurrence with a spacing/escaping variant in
t3404-rebase-interactive.sh that also didn't match the four spellings
enumerated in v1.

Changes since v1:

  2/2: fold in t7509's message_body helper (drop it, convert its six
       call sites to commit_body) and the missed inline site in t3404.
       Site count is now 61 in 12 files, plus the removed helper.

Shlok Kulshreshtha (2):
  test-lib-functions: add commit_body helper
  t: use commit_body to extract commit message bodies

 t/README                                  | 11 ++++
 t/t3404-rebase-interactive.sh             |  2 +-
 t/t3405-rebase-malformed.sh               |  8 +--
 t/t3408-rebase-multi-line.sh              |  4 +-
 t/t3434-rebase-i18n.sh                    |  3 +-
 t/t3900-i18n-commit.sh                    |  4 +-
 t/t4150-am.sh                             |  8 +--
 t/t7500-commit-template-squash-signoff.sh |  4 +-
 t/t7501-commit-basic-functionality.sh     | 21 +++----
 t/t7502-commit-porcelain.sh               | 77 ++++++++---------------
 t/t7509-commit-authorship.sh              | 23 +++----
 t/t7600-merge.sh                          | 14 ++---
 t/t7604-merge-custom-message.sh           | 18 ++----
 t/t7614-merge-signoff.sh                  |  9 +--
 t/test-lib-functions.sh                   |  8 +++
 15 files changed, 91 insertions(+), 123 deletions(-)

-- 
2.52.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v2 1/2] test-lib-functions: add commit_body helper
  2026-07-27  9:56   ` [PATCH v2 " Shlok Kulshreshtha
@ 2026-07-27  9:56     ` Shlok Kulshreshtha
  2026-07-27  9:56     ` [PATCH v2 2/2] t: use commit_body to extract commit message bodies Shlok Kulshreshtha
  1 sibling, 0 replies; 8+ messages in thread
From: Shlok Kulshreshtha @ 2026-07-27  9:56 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Shlok Kulshreshtha

Extracting the message body of a commit -- running "git cat-file commit"
and stripping everything up to and including the first blank line with
"sed" -- is spelled out in about 60 places across the test suite.

Add a helper for it, so that the operation is written once instead of
being copied around.

The commit object goes to a temporary file rather than into a pipe,
because a pipeline reports only its last command's exit status, so a
failure of "git cat-file" would go unnoticed.

Signed-off-by: Shlok Kulshreshtha <diy2903@gmail.com>
---
 t/README                | 11 +++++++++++
 t/test-lib-functions.sh |  8 ++++++++
 2 files changed, 19 insertions(+)

diff --git a/t/README b/t/README
index 4252774f86..9a9daaf2af 100644
--- a/t/README
+++ b/t/README
@@ -945,6 +945,17 @@ see test-lib-functions.sh for the full list and their options.
    Merges the given rev using the given message.  Like test_commit,
    creates a tag and calls test_tick before committing.
 
+ - commit_body <rev>
+
+   Print the message body of <rev>, i.e. the contents of its commit
+   object with the header removed.  Use this instead of piping
+   "git cat-file commit" into "sed", which would hide a failure of
+   the git command.
+
+   Example:
+
+	commit_body HEAD >actual
+
  - test_set_prereq <prereq>
 
    Set a test prerequisite to be used later with test_have_prereq. The
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 809c662124..03bf31d8ef 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -1433,6 +1433,14 @@ test_commit_message () {
 	test_cmp "$msg_file" actual.msg
 }
 
+# Print the message body of a commit
+# Usage: commit_body <rev>
+commit_body () {
+	git cat-file commit "$1" >.commit &&
+	sed -e "1,/^$/d" .commit &&
+	rm -f .commit
+}
+
 # Compare paths respecting core.ignoreCase
 test_cmp_fspath () {
 	if test "x$1" = "x$2"
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/2] t: use commit_body to extract commit message bodies
  2026-07-27  9:56   ` [PATCH v2 " Shlok Kulshreshtha
  2026-07-27  9:56     ` [PATCH v2 1/2] test-lib-functions: add commit_body helper Shlok Kulshreshtha
@ 2026-07-27  9:56     ` Shlok Kulshreshtha
  1 sibling, 0 replies; 8+ messages in thread
From: Shlok Kulshreshtha @ 2026-07-27  9:56 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Shlok Kulshreshtha

Replace the "git cat-file commit | sed" idiom with commit_body across the
test suite: 61 sites in 12 files, plus one local helper that wrapped the
same idiom. The idiom appears in four equivalent spellings -- piped or
written to a file first, "sed -e" or plain "sed", "\$" or "$" in the
address -- all producing byte-identical output; they all collapse to the
same commit_body call.

t7509-commit-authorship.sh defined its own local message_body() helper
around the idiom instead of spelling it out at each call site; remove the
helper and convert its six call sites to commit_body directly.

Two sites needed more than a mechanical substitution:

* t7600.sh ("merge --no-ff --edit") greps the raw commit object for a
  phrase before stripping its header for the final comparison. The
  phrase is part of the commit body, not the header, so the grep can
  run against the already-stripped body instead, letting both steps
  share one commit_body call.

* t3900-i18n-commit.sh pipes the stripped body into "iconv" to test
  re-encoding. Piping commit_body's output into "iconv" would reintroduce
  an exit-code hole one line after removing it elsewhere, so this site
  writes the body to a file first and reads that, keeping the &&-chain
  intact.

Some greps for sed -e "1,/^\*$/d" left unconverted, as they are not extracting a commit's message body:

* t9001-send-email.sh strips mail headers from a message file, not a
  commit object.
* t1450-fsck.sh strips the header off a hand-built commit object while
  constructing a malformed one for fsck to reject.
* t4014-format-patch.sh runs the same sed address on a ".patch" file,
  with an additional expression.

All converted files pass in full, and a deliberately failing
"git cat-file" now fails a converted test that previously passed.

Signed-off-by: Shlok Kulshreshtha <diy2903@gmail.com>
---
 t/t3404-rebase-interactive.sh             |  2 +-
 t/t3405-rebase-malformed.sh               |  8 +--
 t/t3408-rebase-multi-line.sh              |  4 +-
 t/t3434-rebase-i18n.sh                    |  3 +-
 t/t3900-i18n-commit.sh                    |  4 +-
 t/t4150-am.sh                             |  8 +--
 t/t7500-commit-template-squash-signoff.sh |  4 +-
 t/t7501-commit-basic-functionality.sh     | 21 +++----
 t/t7502-commit-porcelain.sh               | 77 ++++++++---------------
 t/t7509-commit-authorship.sh              | 23 +++----
 t/t7600-merge.sh                          | 14 ++---
 t/t7604-merge-custom-message.sh           | 18 ++----
 t/t7614-merge-signoff.sh                  |  9 +--
 13 files changed, 72 insertions(+), 123 deletions(-)

diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index e64816770a..a952e2b49d 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -484,7 +484,7 @@ test_expect_success 'squash and fixup generate correct log messages' '
 			EXPECT_HEADER_COUNT=4 \
 			git rebase -i $base
 	) &&
-	git cat-file commit HEAD | sed -e 1,/^\$/d > actual-squash-fixup &&
+	commit_body HEAD >actual-squash-fixup &&
 	test_cmp expect-squash-fixup actual-squash-fixup &&
 	git cat-file commit HEAD@{2} >actual &&
 	test_grep "^# This is a combination of 3 commits\." actual &&
diff --git a/t/t3405-rebase-malformed.sh b/t/t3405-rebase-malformed.sh
index 2524331861..271195fc11 100755
--- a/t/t3405-rebase-malformed.sh
+++ b/t/t3405-rebase-malformed.sh
@@ -37,7 +37,7 @@ test_expect_success setup '
 	test_tick &&
 	git commit -F F &&
 
-	git cat-file commit HEAD | sed -e "1,/^\$/d" >F0 &&
+	commit_body HEAD >F0 &&
 
 	git checkout diff-in-message &&
 	echo "commit log message containing a diff" >G &&
@@ -48,7 +48,7 @@ test_expect_success setup '
 	test_tick &&
 	git commit -F G &&
 
-	git cat-file commit HEAD | sed -e "1,/^\$/d" >G0 &&
+	commit_body HEAD >G0 &&
 
 	git checkout empty-message-merge &&
 	echo file3 >file3 &&
@@ -66,7 +66,7 @@ test_expect_success setup '
 test_expect_success 'rebase commit with multi-line subject' '
 
 	git rebase main multi-line-subject &&
-	git cat-file commit HEAD | sed -e "1,/^\$/d" >F1 &&
+	commit_body HEAD >F1 &&
 
 	test_cmp F0 F1 &&
 	test_cmp F F0
@@ -74,7 +74,7 @@ test_expect_success 'rebase commit with multi-line subject' '
 
 test_expect_success 'rebase commit with diff in message' '
 	git rebase main diff-in-message &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >G1 &&
+	commit_body HEAD >G1 &&
 	test_cmp G0 G1 &&
 	test_cmp G G0
 '
diff --git a/t/t3408-rebase-multi-line.sh b/t/t3408-rebase-multi-line.sh
index cde3562e3a..2ab89e1a7d 100755
--- a/t/t3408-rebase-multi-line.sh
+++ b/t/t3408-rebase-multi-line.sh
@@ -50,8 +50,8 @@ test_expect_success rebase '
 
 	git checkout side &&
 	git rebase main &&
-	git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
-	git cat-file commit side@{1} | sed -e "1,/^\$/d" >expect &&
+	commit_body HEAD >actual &&
+	commit_body side@{1} >expect &&
 	test_cmp expect actual
 
 '
diff --git a/t/t3434-rebase-i18n.sh b/t/t3434-rebase-i18n.sh
index 8c94fdffc4..0f93a239f8 100755
--- a/t/t3434-rebase-i18n.sh
+++ b/t/t3434-rebase-i18n.sh
@@ -27,8 +27,7 @@ fi
 
 compare_msg () {
 	iconv -f "$2" -t "$3" "$TEST_DIRECTORY/t3434/$1" >expect &&
-	git cat-file commit HEAD >raw &&
-	sed "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 }
 
diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh
index 3c930ec202..b3f03bcbd0 100755
--- a/t/t3900-i18n-commit.sh
+++ b/t/t3900-i18n-commit.sh
@@ -232,8 +232,8 @@ test_commit_autosquash_multi_encoding () {
 		git rev-list HEAD >actual &&
 		test_line_count = 3 actual &&
 		iconv -f $old -t UTF-8 "$TEST_DIRECTORY"/t3900/$msg >expect &&
-		git cat-file commit HEAD^ >raw &&
-		(sed "1,/^$/d" raw | iconv -f $new -t utf-8) >actual &&
+		commit_body HEAD^ >raw &&
+		iconv -f $new -t utf-8 <raw >actual &&
 		test_cmp expect actual
 	'
 }
diff --git a/t/t4150-am.sh b/t/t4150-am.sh
index 61c3ce9018..ee96223668 100755
--- a/t/t4150-am.sh
+++ b/t/t4150-am.sh
@@ -1018,7 +1018,7 @@ test_expect_success 'am -s unexpected trailer block' '
 	Signed-off-by: J C H <j@c.h>
 	EOF
 	git commit -F msg &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >original &&
+	commit_body HEAD >original &&
 	git format-patch --stdout -1 >patch &&
 
 	git reset --hard HEAD^ &&
@@ -1027,7 +1027,7 @@ test_expect_success 'am -s unexpected trailer block' '
 		cat original &&
 		echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
 	) >expect &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual &&
 
 	cat >msg <<-\EOF &&
@@ -1038,7 +1038,7 @@ test_expect_success 'am -s unexpected trailer block' '
 	EOF
 	git reset HEAD^ &&
 	git commit -F msg file &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >original &&
+	commit_body HEAD >original &&
 	git format-patch --stdout -1 >patch &&
 
 	git reset --hard HEAD^ &&
@@ -1049,7 +1049,7 @@ test_expect_success 'am -s unexpected trailer block' '
 		echo &&
 		echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
 	) >expect &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
diff --git a/t/t7500-commit-template-squash-signoff.sh b/t/t7500-commit-template-squash-signoff.sh
index 66aff8e097..5e782ad8d7 100755
--- a/t/t7500-commit-template-squash-signoff.sh
+++ b/t/t7500-commit-template-squash-signoff.sh
@@ -59,7 +59,7 @@ test_expect_success 'nonexistent template file in config should return error' '
 test_expect_success 'nonexistent optional template file in config' '
 	test_config commit.template ":(optional)$(pwd)"/notexist &&
 	GIT_EDITOR="echo hello >" git commit --allow-empty &&
-	git cat-file commit HEAD | sed -e "1,/^$/d" >actual &&
+	commit_body HEAD >actual &&
 	echo hello >expect &&
 	test_cmp expect actual
 '
@@ -204,7 +204,7 @@ EOF
 test_expect_success '--signoff' '
 	echo "yet another content *narf*" >> foo &&
 	echo "zort" | git commit -s -F - foo &&
-	git cat-file commit HEAD | sed "1,/^\$/d" > output &&
+	commit_body HEAD >output &&
 	test_cmp expect output
 '
 
diff --git a/t/t7501-commit-basic-functionality.sh b/t/t7501-commit-basic-functionality.sh
index 7794babe46..d0af38df20 100755
--- a/t/t7501-commit-basic-functionality.sh
+++ b/t/t7501-commit-basic-functionality.sh
@@ -491,8 +491,7 @@ test_expect_success 'sign off (1)' '
 	echo 1 >positive &&
 	git add positive &&
 	git commit -s -m "thank you" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo thank you &&
 		echo &&
@@ -511,8 +510,7 @@ test_expect_success 'sign off (2)' '
 	git commit -s -m "thank you
 
 $existing" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo thank you &&
 		echo &&
@@ -532,8 +530,7 @@ test_expect_success 'signoff gap' '
 	git commit -s -m "welcome
 
 $alt" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo welcome &&
 		echo &&
@@ -553,8 +550,7 @@ test_expect_success 'signoff gap 2' '
 
 We have now
 $alt" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo welcome &&
 		echo &&
@@ -575,8 +571,7 @@ test_expect_success 'signoff respects trailer config' '
 
 non-trailer line
 Myfooter: x" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo subject &&
 		echo &&
@@ -593,8 +588,7 @@ Myfooter: x" &&
 
 non-trailer line
 Myfooter: x" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo subject &&
 		echo &&
@@ -626,8 +620,7 @@ test_expect_success 'multiple -m' '
 	>negative &&
 	git add negative &&
 	git commit -m "one" -m "two" -m "three" &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	(
 		echo one &&
 		echo &&
diff --git a/t/t7502-commit-porcelain.sh b/t/t7502-commit-porcelain.sh
index 62e3970e3f..2adfe70b3d 100755
--- a/t/t7502-commit-porcelain.sh
+++ b/t/t7502-commit-porcelain.sh
@@ -175,8 +175,7 @@ test_expect_success 'commit --trailer with "="' '
 	Reported-by: C3 E3
 	Mentored-by: C4 E4
 	EOF
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -195,8 +194,7 @@ test_expect_success 'commit --trailer with -c and "replace" as ifexists' '
 		commit --trailer "Mentored-by: C4 E4" \
 		 --trailer "Helped-by: C3 E3" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -217,8 +215,7 @@ test_expect_success 'commit --trailer with -c and "add" as ifexists' '
 		commit --trailer "Reported-by: C3 E3" \
 		--trailer "Mentored-by: C4 E4" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -238,8 +235,7 @@ test_expect_success 'commit --trailer with -c and "donothing" as ifexists' '
 		commit --trailer "Mentored-by: C5 E5" \
 		--trailer "Reviewed-by: C6 E6" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -259,8 +255,7 @@ test_expect_success 'commit --trailer with -c and "addIfDifferent" as ifexists'
 		commit --trailer "Reported-by: C3 E3" \
 		--trailer "Mentored-by: C5 E5" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -280,8 +275,7 @@ test_expect_success 'commit --trailer with -c and "addIfDifferentNeighbor" as if
 		commit --trailer "Mentored-by: C4 E4" \
 		--trailer "Reported-by: C3 E3" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d"  commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -302,8 +296,7 @@ test_expect_success 'commit --trailer with -c and "end" as where' '
 		commit --trailer "Reported-by: C3 E3" \
 		--trailer "Mentored-by: C4 E4" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -323,8 +316,7 @@ test_expect_success 'commit --trailer with -c and "start" as where' '
 		commit --trailer "Signed-off-by: C O Mitter <committer@example.com>" \
 		--trailer "Signed-off-by: C1 E1" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -344,8 +336,7 @@ test_expect_success 'commit --trailer with -c and "after" as where' '
 		commit --trailer "Mentored-by: C4 E4" \
 		--trailer "Mentored-by: C5 E5" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -366,8 +357,7 @@ test_expect_success 'commit --trailer with -c and "before" as where' '
 		commit --trailer "Mentored-by: C3 E3" \
 		--trailer "Mentored-by: C2 E2" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -387,8 +377,7 @@ test_expect_success 'commit --trailer with -c and "donothing" as ifmissing' '
 		commit --trailer "Helped-by: C5 E5" \
 		--trailer "Based-by: C6 E6" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -409,8 +398,7 @@ test_expect_success 'commit --trailer with -c and "add" as ifmissing' '
 		commit --trailer "Helped-by: C5 E5" \
 		--trailer "Based-by: C6 E6" \
 		--amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -424,8 +412,7 @@ test_expect_success 'commit --trailer with -c ack.key ' '
 	EOF
 	git -c trailer.ack.key="Acked-by" \
 		commit --trailer "ack = Peff" -m "hello" &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -440,8 +427,7 @@ test_expect_success 'commit --trailer with -c and ":=#" as separators' '
 	git -c trailer.separators=":=#" \
 		-c trailer.bug.key="Bug #" \
 		commit --trailer "bug = 42" -m "I hate bug" &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -461,8 +447,7 @@ test_expect_success 'commit --trailer with -c and command' '
 		-c trailer.report.command="NAME=\"\$ARG\"; test -n \"\$NAME\" && \
 		git log --author=\"\$NAME\" -1 --format=\"format:%aN <%aE>\" || true" \
 		commit --trailer "report = author" --amend &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -480,8 +465,7 @@ test_expect_success 'commit --trailer not confused by --- separator' '
 		echo &&
 		echo "my-trailer: value"
 	} >expected &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -498,8 +482,7 @@ test_expect_success 'commit --trailer with --verbose' '
 		echo &&
 		echo "my-trailer: value"
 	} >expected &&
-	git cat-file commit HEAD >commit.msg &&
-	sed -e "1,/^\$/d" commit.msg >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -508,7 +491,7 @@ test_expect_success 'multiple -m' '
 	>negative &&
 	git add negative &&
 	git commit -m "one" -m "two" -m "three" &&
-	actual=$(git cat-file commit HEAD >tmp && sed -e "1,/^\$/d" tmp && rm tmp) &&
+	actual=$(commit_body HEAD) &&
 	expected=$(test_write_lines "one" "" "two" "" "three") &&
 	test "z$actual" = "z$expected"
 
@@ -545,8 +528,7 @@ test_expect_success 'cleanup commit messages (verbatim option,-t)' '
 
 	echo >>negative &&
 	git commit --cleanup=verbatim --no-status -t expect -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -555,8 +537,7 @@ test_expect_success 'cleanup commit messages (verbatim option,-F)' '
 
 	echo >>negative &&
 	git commit --cleanup=verbatim -F expect -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -565,8 +546,7 @@ test_expect_success 'cleanup commit messages (verbatim option,-m)' '
 
 	echo >>negative &&
 	git commit --cleanup=verbatim -m "$mesg_with_comment_and_newlines" -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -577,8 +557,7 @@ test_expect_success 'cleanup commit messages (whitespace option,-F)' '
 	test_write_lines "" "# text" "" >text &&
 	echo "# text" >expect &&
 	git commit --cleanup=whitespace -F text -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -605,8 +584,7 @@ test_expect_success 'cleanup commit messages (scissors option,-F,-e)' '
 	# to be kept, too
 	EOF
 	git commit --cleanup=scissors -e -F text -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -618,8 +596,7 @@ test_expect_success 'cleanup commit messages (scissors option,-F,-e, scissors on
 	to be removed
 	EOF
 	git commit --cleanup=scissors -e -F text -a --allow-empty-message &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_must_be_empty actual
 '
 
@@ -629,8 +606,7 @@ test_expect_success 'cleanup commit messages (strip option,-F)' '
 	test_write_lines "" "# text" "sample" "" >text &&
 	echo sample >expect &&
 	git commit --cleanup=strip -F text -a &&
-	git cat-file -p HEAD >raw &&
-	sed -e "1,/^\$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 
 '
@@ -849,8 +825,7 @@ test_expect_success 'A single-liner subject with a token plus colon is not a foo
 
 	git reset --hard &&
 	git commit -s -m "hello: kitty" --allow-empty &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_line_count = 3 actual
 
 '
diff --git a/t/t7509-commit-authorship.sh b/t/t7509-commit-authorship.sh
index 8e373b566b..561c19a219 100755
--- a/t/t7509-commit-authorship.sh
+++ b/t/t7509-commit-authorship.sh
@@ -12,11 +12,6 @@ author_header () {
 	sed -n -e '/^$/q' -e '/^author /p'
 }
 
-message_body () {
-	git cat-file commit "$1" |
-	sed -e '1,/^$/d'
-}
-
 test_expect_success '-C option copies authorship and message' '
 	test_commit --author Frigate\ \<flying@over.world\> \
 		"Initial Commit" foo Initial Initial &&
@@ -27,8 +22,8 @@ test_expect_success '-C option copies authorship and message' '
 	author_header HEAD >actual &&
 	test_cmp expect actual &&
 
-	message_body Initial >expect &&
-	message_body HEAD >actual &&
+	commit_body Initial >expect &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -40,8 +35,8 @@ test_expect_success '-C option copies only the message with --reset-author' '
 	author_header HEAD >actual &&
 	test_cmp expect actual &&
 
-	message_body Initial >expect &&
-	message_body HEAD >actual &&
+	commit_body Initial >expect &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -62,8 +57,8 @@ test_expect_success '-c option copies only the message with --reset-author' '
 	author_header HEAD >actual &&
 	test_cmp expect actual &&
 
-	message_body Initial >expect &&
-	message_body HEAD >actual &&
+	commit_body Initial >expect &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -77,7 +72,7 @@ test_expect_success '--amend option copies authorship' '
 	test_cmp expect actual &&
 
 	echo "amend test" >expect &&
-	message_body HEAD >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -124,7 +119,7 @@ test_expect_success '--reset-author makes the commit ours even with --amend opti
 	test_cmp expect actual &&
 
 	echo "Changed again" >expect &&
-	message_body HEAD >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -157,7 +152,7 @@ test_expect_success 'commit respects CHERRY_PICK_HEAD and MERGE_MSG' '
 	test_cmp expect actual &&
 
 	echo "This is a MERGE_MSG" >expect &&
-	message_body HEAD >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index 7f2a1db16d..64cb83284c 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -332,8 +332,7 @@ test_expect_success 'merge --squash c3 with c7' '
 	# Conflicts:
 	#	file
 	EOF
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -363,8 +362,7 @@ test_expect_success 'merge c3 with c7 with commit.cleanup = scissors' '
 	# Conflicts:
 	#	file
 	EOF
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -387,8 +385,7 @@ test_expect_success 'merge c3 with c7 with --squash commit.cleanup = scissors' '
 	# Conflicts:
 	#	file
 	EOF
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -989,9 +986,8 @@ test_expect_success 'merge --no-ff --edit' '
 	git reset --hard c0 &&
 	EDITOR=./editor git merge --no-ff --edit c1 &&
 	verify_parents $c0 $c1 &&
-	git cat-file commit HEAD >raw &&
-	test_grep "work done on the side branch" raw &&
-	sed "1,/^$/d" >actual raw &&
+	commit_body HEAD >actual &&
+	test_grep "work done on the side branch" actual &&
 	test_cmp expected actual
 '
 
diff --git a/t/t7604-merge-custom-message.sh b/t/t7604-merge-custom-message.sh
index cd4f9607dc..3a7d1ae858 100755
--- a/t/t7604-merge-custom-message.sh
+++ b/t/t7604-merge-custom-message.sh
@@ -36,16 +36,14 @@ test_expect_success 'setup' '
 test_expect_success 'merge c2 with a custom message' '
 	git reset --hard c1 &&
 	git merge -m "$(cat exp.subject)" c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp exp.subject actual
 '
 
 test_expect_success 'merge --log appends to custom message' '
 	git reset --hard c1 &&
 	git merge --log -m "$(cat exp.subject)" c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp exp.log actual
 '
 
@@ -61,8 +59,7 @@ test_expect_success 'prepare file with comment line and trailing newlines'  '
 test_expect_success 'cleanup commit messages (verbatim option)' '
 	git reset --hard c1 &&
 	git merge --cleanup=verbatim -F expect c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -71,8 +68,7 @@ test_expect_success 'cleanup commit messages (whitespace option)' '
 	test_write_lines "" "# text" "" >text &&
 	echo "# text" >expect &&
 	git merge --cleanup=whitespace -F text c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -97,8 +93,7 @@ test_expect_success 'cleanup merge messages (scissors option)' '
 	# to be kept, too
 	EOF
 	git merge --cleanup=scissors -e -F text c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
@@ -107,8 +102,7 @@ test_expect_success 'cleanup commit messages (strip option)' '
 	test_write_lines "" "# text" "sample" "" >text &&
 	echo sample >expect &&
 	git merge --cleanup=strip -F text c2 &&
-	git cat-file commit HEAD >raw &&
-	sed -e "1,/^$/d" raw >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expect actual
 '
 
diff --git a/t/t7614-merge-signoff.sh b/t/t7614-merge-signoff.sh
index e58bf07b7a..b078eaf8a3 100755
--- a/t/t7614-merge-signoff.sh
+++ b/t/t7614-merge-signoff.sh
@@ -45,8 +45,7 @@ test_expect_success 'git merge --signoff adds a sign-off line' '
 	test_commit main-branch-2 file2 2 &&
 	git checkout other-branch &&
 	git merge main --signoff --no-edit &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected-signed actual
 '
 
@@ -56,8 +55,7 @@ test_expect_success 'git merge does not add a sign-off line' '
 	test_commit main-branch-3 file3 3 &&
 	git checkout other-branch &&
 	git merge main --no-edit &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected-unsigned actual
 '
 
@@ -67,8 +65,7 @@ test_expect_success 'git merge --no-signoff flag cancels --signoff flag' '
 	test_commit main-branch-4 file4 4 &&
 	git checkout other-branch &&
 	git merge main --no-edit --signoff --no-signoff &&
-	git cat-file commit HEAD >commit &&
-	sed -e "1,/^\$/d" commit >actual &&
+	commit_body HEAD >actual &&
 	test_cmp expected-unsigned actual
 '
 
-- 
2.52.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-07-27  9:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-26 22:48 [PATCH 0/2] t: add and use a commit_body test helper Shlok Kulshreshtha
2026-07-26 22:48 ` [PATCH 1/2] test-lib-functions: add commit_body helper Shlok Kulshreshtha
2026-07-26 22:48 ` [PATCH 2/2] t: use commit_body to extract commit message bodies Shlok Kulshreshtha
2026-07-27  8:15 ` [PATCH 0/2] t: add and use a commit_body test helper Junio C Hamano
2026-07-27  9:28   ` Shlok Kulshreshtha
2026-07-27  9:56   ` [PATCH v2 " Shlok Kulshreshtha
2026-07-27  9:56     ` [PATCH v2 1/2] test-lib-functions: add commit_body helper Shlok Kulshreshtha
2026-07-27  9:56     ` [PATCH v2 2/2] t: use commit_body to extract commit message bodies Shlok Kulshreshtha

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.