Make git_message_prettify return bytes written If you want to be absolutely safe with git_message_prettify, you can now pass a NULL pointer for the buffer and get back the number of bytes that would be copied into the buffer. This means that an error is a non-negative return code and a success will be greater than zero from this function.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
diff --git a/include/git2/message.h b/include/git2/message.h
index 7f25585..b42cb76 100644
--- a/include/git2/message.h
+++ b/include/git2/message.h
@@ -23,8 +23,9 @@ GIT_BEGIN_DECL
*
* Optionally, can remove lines starting with a "#".
*
- * @param message_out The user allocated buffer which will be filled with
- * the cleaned up message.
+ * @param message_out The user allocated buffer which will be filled with
+ * the cleaned up message. Pass NULL if you just want to get the size of the
+ * prettified message as the output value.
*
* @param size The size of the allocated buffer message_out.
*
@@ -32,7 +33,8 @@ GIT_BEGIN_DECL
*
* @param strip_comments 1 to remove lines starting with a "#", 0 otherwise.
*
- * @return GIT_SUCCESS or an error code
+ * @return -1 on error, else number of characters in prettified message
+ * including the trailing NUL byte
*/
GIT_EXTERN(int) git_message_prettify(char *message_out, size_t buffer_size, const char *message, int strip_comments);
diff --git a/src/message.c b/src/message.c
index a5cc262..e6dedc9 100644
--- a/src/message.c
+++ b/src/message.c
@@ -62,23 +62,25 @@ int git_message__prettify(git_buf *message_out, const char *message, int strip_c
int git_message_prettify(char *message_out, size_t buffer_size, const char *message, int strip_comments)
{
git_buf buf = GIT_BUF_INIT;
+ ssize_t out_size = -1;
- assert(message_out && buffer_size);
+ if (message_out && buffer_size)
+ *message_out = '\0';
- *message_out = '\0';
+ if (git_message__prettify(&buf, message, strip_comments) < 0)
+ goto done;
- if (git_message__prettify(&buf, message, strip_comments) < 0) {
- git_buf_free(&buf);
- return -1;
- }
-
- if (buf.size + 1 > buffer_size) { /* +1 for NUL byte */
+ if (message_out && buf.size + 1 > buffer_size) { /* +1 for NUL byte */
giterr_set(GITERR_INVALID, "Buffer too short to hold the cleaned message");
- return -1;
+ goto done;
}
- git_buf_copy_cstr(message_out, buffer_size, &buf);
- git_buf_free(&buf);
+ if (message_out)
+ git_buf_copy_cstr(message_out, buffer_size, &buf);
- return 0;
+ out_size = buf.size + 1;
+
+done:
+ git_buf_free(&buf);
+ return out_size;
}
diff --git a/tests-clar/object/commit/commitstagedfile.c b/tests-clar/object/commit/commitstagedfile.c
index 1e4affb..882fb49 100644
--- a/tests-clar/object/commit/commitstagedfile.c
+++ b/tests-clar/object/commit/commitstagedfile.c
@@ -109,7 +109,7 @@ void test_object_commit_commitstagedfile__generate_predictable_object_ids(void)
cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60));
cl_git_pass(git_tree_lookup(&tree, repo, &tree_oid));
- cl_git_pass(git_message_prettify(buffer, 128, "Initial commit", 0));
+ cl_assert_equal_i(16, git_message_prettify(buffer, 128, "Initial commit", 0));
cl_git_pass(git_commit_create_v(
&commit_oid,
@@ -133,34 +133,35 @@ void test_object_commit_commitstagedfile__message_prettify(void)
{
char buffer[100];
- cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "", 0));
+ cl_assert(git_message_prettify(buffer, sizeof(buffer), "", 0) == 1);
cl_assert_equal_s(buffer, "");
- cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "", 1));
+ cl_assert(git_message_prettify(buffer, sizeof(buffer), "", 1) == 1);
cl_assert_equal_s(buffer, "");
- cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "Short", 0));
- cl_assert_equal_s(buffer, "Short\n");
- cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "Short", 1));
- cl_assert_equal_s(buffer, "Short\n");
+ cl_assert_equal_i(7, git_message_prettify(buffer, sizeof(buffer), "Short", 0));
+ cl_assert_equal_s("Short\n", buffer);
+ cl_assert_equal_i(7, git_message_prettify(buffer, sizeof(buffer), "Short", 1));
+ cl_assert_equal_s("Short\n", buffer);
- cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "This is longer\nAnd multiline\n# with some comments still in\n", 0));
+ cl_assert(git_message_prettify(buffer, sizeof(buffer), "This is longer\nAnd multiline\n# with some comments still in\n", 0) > 0);
cl_assert_equal_s(buffer, "This is longer\nAnd multiline\n# with some comments still in\n");
- cl_git_pass(git_message_prettify(buffer, sizeof(buffer), "This is longer\nAnd multiline\n# with some comments still in\n", 1));
+
+ cl_assert(git_message_prettify(buffer, sizeof(buffer), "This is longer\nAnd multiline\n# with some comments still in\n", 1) > 0);
cl_assert_equal_s(buffer, "This is longer\nAnd multiline\n");
/* try out overflow */
- cl_git_pass(git_message_prettify(buffer, sizeof(buffer),
+ cl_assert(git_message_prettify(buffer, sizeof(buffer),
"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
"1234567890" "1234567890" "1234567890" "1234567890" "12345678",
- 0));
+ 0) > 0);
cl_assert_equal_s(buffer,
"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
"1234567890" "1234567890" "1234567890" "1234567890" "12345678\n");
- cl_git_pass(git_message_prettify(buffer, sizeof(buffer),
+ cl_assert(git_message_prettify(buffer, sizeof(buffer),
"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
"1234567890" "1234567890" "1234567890" "1234567890" "12345678\n",
- 0));
+ 0) > 0);
cl_assert_equal_s(buffer,
"1234567890" "1234567890" "1234567890" "1234567890" "1234567890"
"1234567890" "1234567890" "1234567890" "1234567890" "12345678\n");
@@ -182,9 +183,13 @@ void test_object_commit_commitstagedfile__message_prettify(void)
"1234567890" "1234567890" "1234567890" "1234567890" "1234567890""x",
0));
- cl_git_pass(git_message_prettify(buffer, sizeof(buffer),
+ cl_assert(git_message_prettify(buffer, sizeof(buffer),
"1234567890" "1234567890" "1234567890" "1234567890" "1234567890\n"
"# 1234567890" "1234567890" "1234567890" "1234567890" "1234567890\n"
"1234567890",
- 1));
+ 1) > 0);
+
+ cl_assert(git_message_prettify(NULL, 0, "", 0) == 1);
+ cl_assert(git_message_prettify(NULL, 0, "Short test", 0) == 12);
+ cl_assert(git_message_prettify(NULL, 0, "Test\n# with\nComments", 1) == 15);
}