Commit 254e0a33ee66c65948e15efbe93a810c4077e324

Patrick Steinhardt 2015-11-24T13:43:43

diff: include commit message when formatting patch When formatting a patch as email we do not include the commit's message in the formatted patch output. Implement this and add a test that verifies behavior.

diff --git a/include/git2/diff.h b/include/git2/diff.h
index cbffdb4..3eb2656 100644
--- a/include/git2/diff.h
+++ b/include/git2/diff.h
@@ -1286,12 +1286,15 @@ typedef struct {
 	/** Summary of the change */
 	const char *summary;
 
+	/** Commit message's body */
+	const char *body;
+
 	/** Author of the change */
 	const git_signature *author;
 } git_diff_format_email_options;
 
 #define GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION 1
-#define GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT {GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION, 0, 1, 1, NULL, NULL, NULL}
+#define GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT {GIT_DIFF_FORMAT_EMAIL_OPTIONS_VERSION, 0, 1, 1, NULL, NULL, NULL, NULL}
 
 /**
  * Create an e-mail ready patch from a diff.
diff --git a/src/diff.c b/src/diff.c
index 9402b6e..67fab07 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -1659,6 +1659,7 @@ int git_diff_format_email__append_header_tobuf(
 	const git_oid *id,
 	const git_signature *author,
 	const char *summary,
+	const char *body,
 	size_t patch_no,
 	size_t total_patches,
 	bool exclude_patchno_marker)
@@ -1698,6 +1699,13 @@ int git_diff_format_email__append_header_tobuf(
 
 	error = git_buf_printf(out, "%s\n\n", summary);
 
+	if (body) {
+		git_buf_puts(out, body);
+
+		if (out->ptr[out->size - 1] != '\n')
+			git_buf_putc(out, '\n');
+	}
+
 	return error;
 }
 
@@ -1775,7 +1783,7 @@ int git_diff_format_email(
 
 	error = git_diff_format_email__append_header_tobuf(out,
 				opts->id, opts->author, summary == NULL ? opts->summary : summary,
-				opts->patch_no, opts->total_patches, ignore_marker);
+				opts->body, opts->patch_no, opts->total_patches, ignore_marker);
 
 	if (error < 0)
 		goto on_error;
@@ -1818,6 +1826,7 @@ int git_diff_commit_as_email(
 	opts.total_patches = total_patches;
 	opts.id = git_commit_id(commit);
 	opts.summary = git_commit_summary(commit);
+	opts.body = git_commit_body(commit);
 	opts.author = git_commit_author(commit);
 
 	if ((error = git_diff__commit(&diff, repo, commit, diff_opts)) < 0)
diff --git a/tests/diff/format_email.c b/tests/diff/format_email.c
index 18ad99b..8a01288 100644
--- a/tests/diff/format_email.c
+++ b/tests/diff/format_email.c
@@ -97,6 +97,47 @@ void test_diff_format_email__simple(void)
 		email, "9264b96c6d104d0e07ae33d3007b6a48246c6f92", &opts);
 }
 
+void test_diff_format_email__with_message(void)
+{
+	git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT;
+	const char *email = "From 627e7e12d87e07a83fad5b6bfa25e86ead4a5270 Mon Sep 17 00:00:00 2001\n" \
+	"From: Patrick Steinhardt <ps@pks.im>\n" \
+	"Date: Tue, 24 Nov 2015 13:34:39 +0100\n" \
+	"Subject: [PATCH] Modify content with message\n" \
+	"\n" \
+	"Modify content of file3.txt by appending a new line. Make this\n" \
+	"commit message somewhat longer to test behavior with newlines\n" \
+	"embedded in the message body.\n" \
+	"\n" \
+	"Also test if new paragraphs are included correctly.\n" \
+	"---\n" \
+	" file3.txt | 1 +\n" \
+	" 1 file changed, 1 insertion(+), 0 deletions(-)\n" \
+	"\n" \
+	"diff --git a/file3.txt b/file3.txt\n" \
+	"index 9a2d780..7309653 100644\n" \
+	"--- a/file3.txt\n" \
+	"+++ b/file3.txt\n" \
+	"@@ -3,3 +3,4 @@ file3!\n" \
+	" file3\n" \
+	" file3\n" \
+	" file3\n" \
+	"+file3\n" \
+	"--\n" \
+	"libgit2 0.23.0\n" \
+	"\n";
+
+	opts.body = "Modify content of file3.txt by appending a new line. Make this\n" \
+	"commit message somewhat longer to test behavior with newlines\n" \
+	"embedded in the message body.\n" \
+	"\n" \
+	"Also test if new paragraphs are included correctly.";
+
+	assert_email_match(
+		email, "627e7e12d87e07a83fad5b6bfa25e86ead4a5270", &opts);
+}
+
+
 void test_diff_format_email__multiple(void)
 {
 	git_oid oid;
diff --git a/tests/resources/diff_format_email/.gitted/index b/tests/resources/diff_format_email/.gitted/index
index f73027e..d94f87d 100644
Binary files a/tests/resources/diff_format_email/.gitted/index and b/tests/resources/diff_format_email/.gitted/index differ
diff --git a/tests/resources/diff_format_email/.gitted/objects/62/7e7e12d87e07a83fad5b6bfa25e86ead4a5270 b/tests/resources/diff_format_email/.gitted/objects/62/7e7e12d87e07a83fad5b6bfa25e86ead4a5270
new file mode 100644
index 0000000..269a5bc
--- /dev/null
+++ b/tests/resources/diff_format_email/.gitted/objects/62/7e7e12d87e07a83fad5b6bfa25e86ead4a5270
@@ -0,0 +1 @@
+xMN0YGر]	!8@%$Nqb5#{Jq+`ޛE!*RR8=5(MT b)⺗AQގE3` W3-		cZLO{}O3Bh.Px쇾gޏ$;f\Ntkzc⊼O{|L3Hx5&hN]G5oxYܺRL޾7SnG15jl׎׵~1f.f_*
wt6T;
\ No newline at end of file
diff --git a/tests/resources/diff_format_email/.gitted/objects/73/09653445ecf038d3e3dd9ed55edb6cb541a4ba b/tests/resources/diff_format_email/.gitted/objects/73/09653445ecf038d3e3dd9ed55edb6cb541a4ba
new file mode 100644
index 0000000..ba9c5fa
Binary files /dev/null and b/tests/resources/diff_format_email/.gitted/objects/73/09653445ecf038d3e3dd9ed55edb6cb541a4ba differ
diff --git a/tests/resources/diff_format_email/.gitted/objects/d5/ff67764c82f729b13c26a09576570d884d9687 b/tests/resources/diff_format_email/.gitted/objects/d5/ff67764c82f729b13c26a09576570d884d9687
new file mode 100644
index 0000000..e838eeb
Binary files /dev/null and b/tests/resources/diff_format_email/.gitted/objects/d5/ff67764c82f729b13c26a09576570d884d9687 differ
diff --git a/tests/resources/diff_format_email/.gitted/refs/heads/master b/tests/resources/diff_format_email/.gitted/refs/heads/master
index f0f3f93..3bc734d 100644
--- a/tests/resources/diff_format_email/.gitted/refs/heads/master
+++ b/tests/resources/diff_format_email/.gitted/refs/heads/master
@@ -1 +1 @@
-873806f6f27e631eb0b23e4b56bea2bfac14a373
+627e7e12d87e07a83fad5b6bfa25e86ead4a5270
diff --git a/tests/resources/diff_format_email/file3.txt b/tests/resources/diff_format_email/file3.txt
index 9a2d780..7309653 100644
--- a/tests/resources/diff_format_email/file3.txt
+++ b/tests/resources/diff_format_email/file3.txt
@@ -3,3 +3,4 @@ file3!
 file3
 file3
 file3
+file3