From 450e8e9e623b8c172ba4628c146838cbf4c56519 Mon Sep 17 00:00:00 2001 From: Nicolas Hake Date: Wed, 22 Jan 2014 13:22:15 +0100 Subject: [PATCH] Expose patch serialization to git_buf Returning library-allocated strings from libgit2 works fine on Linux, but may cause problems on Windows because there is no one C Runtime that everything links against. With libgit2 not exposing its own allocator, freeing the string is a gamble. git_patch_to_str already serializes to a buffer, then returns the underlying memory. Expose the functionality directly, so callers can use the git_buf_free function to free the memory later. --- include/git2/patch.h | 10 ++++++++++ src/diff_print.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/include/git2/patch.h b/include/git2/patch.h index e09f625c0..e5dd5d8d4 100644 --- a/include/git2/patch.h +++ b/include/git2/patch.h @@ -242,6 +242,16 @@ GIT_EXTERN(int) git_patch_to_str( char **string, git_patch *patch); +/** + * Get the content of a patch as a single diff text. + * + * @param out The git_buf to be filled in + * @param patch A git_patch representing changes to one file + * @return 0 on success, <0 on failure. + */ +GIT_EXTERN(int) git_patch_to_buf( + git_buf *out, + git_patch *patch); GIT_END_DECL diff --git a/src/diff_print.c b/src/diff_print.c index 7a70e2b18..0ab21d033 100644 --- a/src/diff_print.c +++ b/src/diff_print.c @@ -452,7 +452,15 @@ static int diff_print_to_buffer_cb( return git_buf_put(output, line->content, line->content_len); } -/* print a git_patch to a string buffer */ +/* print a git_patch to a git_buf */ +int git_patch_to_buf( + git_buf *out, + git_patch *patch) +{ + return git_patch_print(patch, diff_print_to_buffer_cb, out); +} + +/* print a git_patch to a char* */ int git_patch_to_str( char **string, git_patch *patch) @@ -460,7 +468,7 @@ int git_patch_to_str( int error; git_buf output = GIT_BUF_INIT; - if (!(error = git_patch_print(patch, diff_print_to_buffer_cb, &output))) + if (!(error = git_patch_to_buf(&output, patch))) *string = git_buf_detach(&output); else { git_buf_free(&output);