diff options
Diffstat (limited to 'src/diff_print.c')
| -rw-r--r-- | src/diff_print.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/src/diff_print.c b/src/diff_print.c index b04b11515..712402864 100644 --- a/src/diff_print.c +++ b/src/diff_print.c @@ -18,6 +18,7 @@ typedef struct { uint32_t flags; int oid_strlen; git_diff_line line; + git_error_state error; } diff_print_info; static int diff_print_info_init( @@ -33,6 +34,7 @@ static int diff_print_info_init( pi->print_cb = cb; pi->payload = payload; pi->buf = out; + memset(&pi->error, 0, sizeof(pi->error)); if (diff) pi->flags = diff->opts.flags; @@ -89,12 +91,6 @@ char git_diff_status_char(git_delta_t status) return code; } -static int callback_error(void) -{ - giterr_clear(); - return GIT_EUSER; -} - static int diff_print_one_name_only( const git_diff_delta *delta, float progress, void *data) { @@ -111,14 +107,14 @@ static int diff_print_one_name_only( if (git_buf_puts(out, delta->new_file.path) < 0 || git_buf_putc(out, '\n')) - return -1; + return giterr_capture(&pi->error, -1); pi->line.origin = GIT_DIFF_LINE_FILE_HDR; pi->line.content = git_buf_cstr(out); pi->line.content_len = git_buf_len(out); if (pi->print_cb(delta, NULL, &pi->line, pi->payload)) - return callback_error(); + return giterr_user_cancel(); return 0; } @@ -156,14 +152,14 @@ static int diff_print_one_name_status( git_buf_printf(out, "%c\t%s\n", code, delta->old_file.path); if (git_buf_oom(out)) - return -1; + return giterr_capture(&pi->error, -1); pi->line.origin = GIT_DIFF_LINE_FILE_HDR; pi->line.content = git_buf_cstr(out); pi->line.content_len = git_buf_len(out); if (pi->print_cb(delta, NULL, &pi->line, pi->payload)) - return callback_error(); + return giterr_user_cancel(); return 0; } @@ -202,14 +198,14 @@ static int diff_print_one_raw( delta->old_file.path : delta->new_file.path); if (git_buf_oom(out)) - return -1; + return giterr_capture(&pi->error, -1); pi->line.origin = GIT_DIFF_LINE_FILE_HDR; pi->line.content = git_buf_cstr(out); pi->line.content_len = git_buf_len(out); if (pi->print_cb(delta, NULL, &pi->line, pi->payload)) - return callback_error(); + return giterr_user_cancel(); return 0; } @@ -315,14 +311,14 @@ static int diff_print_patch_file( if (git_diff_delta__format_file_header( pi->buf, delta, oldpfx, newpfx, pi->oid_strlen) < 0) - return -1; + return giterr_capture(&pi->error, -1); pi->line.origin = GIT_DIFF_LINE_FILE_HDR; pi->line.content = git_buf_cstr(pi->buf); pi->line.content_len = git_buf_len(pi->buf); if (pi->print_cb(delta, NULL, &pi->line, pi->payload)) - return callback_error(); + return giterr_user_cancel(); if ((delta->flags & GIT_DIFF_FLAG_BINARY) == 0) return 0; @@ -332,7 +328,7 @@ static int diff_print_patch_file( if (diff_delta_format_with_paths( pi->buf, delta, oldpfx, newpfx, "Binary files %s%s and %s%s differ\n") < 0) - return -1; + return giterr_capture(&pi->error, -1); pi->line.origin = GIT_DIFF_LINE_BINARY; pi->line.content = git_buf_cstr(pi->buf); @@ -340,7 +336,7 @@ static int diff_print_patch_file( pi->line.num_lines = 1; if (pi->print_cb(delta, NULL, &pi->line, pi->payload)) - return callback_error(); + return giterr_user_cancel(); return 0; } @@ -360,7 +356,7 @@ static int diff_print_patch_hunk( pi->line.content_len = h->header_len; if (pi->print_cb(d, h, &pi->line, pi->payload)) - return callback_error(); + return giterr_user_cancel(); return 0; } @@ -377,7 +373,7 @@ static int diff_print_patch_line( return 0; if (pi->print_cb(delta, hunk, line, pi->payload)) - return callback_error(); + return giterr_user_cancel(); return 0; } @@ -421,9 +417,14 @@ int git_diff_print( if (!(error = diff_print_info_init( &pi, &buf, diff, format, print_cb, payload))) + { error = git_diff_foreach( diff, print_file, print_hunk, print_line, &pi); + if (error == GIT_EUSER && pi.error.error_code) + error = giterr_restore(&pi.error); + } + git_buf_free(&buf); return error; @@ -444,10 +445,15 @@ int git_patch_print( if (!(error = diff_print_info_init( &pi, &temp, git_patch__diff(patch), GIT_DIFF_FORMAT_PATCH, print_cb, payload))) + { error = git_patch__invoke_callbacks( patch, diff_print_patch_file, diff_print_patch_hunk, diff_print_patch_line, &pi); + if (error && error != GIT_EUSER) + error = giterr_restore(&pi.error); + } + git_buf_free(&temp); return error; @@ -483,8 +489,10 @@ int git_patch_to_str( /* GIT_EUSER means git_buf_put in print_to_buffer_cb returned -1, * meaning a memory allocation failure, so just map to -1... */ - if (error == GIT_EUSER) + if (error == GIT_EUSER) { + giterr_set_oom(); error = -1; + } *string = git_buf_detach(&output); |
