vendor/libgit2/src/diff_print.c in rugged-1.0.1 vs vendor/libgit2/src/diff_print.c in rugged-1.1.0

- old
+ new

@@ -335,11 +335,11 @@ newpath = "/dev/null"; return git_buf_printf(out, template, oldpath, newpath); } -int diff_delta_format_similarity_header( +static int diff_delta_format_similarity_header( git_buf *out, const git_diff_delta *delta) { git_buf old_path = GIT_BUF_INIT, new_path = GIT_BUF_INIT; const char *type; @@ -349,21 +349,20 @@ git_error_set(GIT_ERROR_PATCH, "invalid similarity %d", delta->similarity); error = -1; goto done; } + GIT_ASSERT(delta->status == GIT_DELTA_RENAMED || delta->status == GIT_DELTA_COPIED); if (delta->status == GIT_DELTA_RENAMED) type = "rename"; - else if (delta->status == GIT_DELTA_COPIED) - type = "copy"; else - abort(); + type = "copy"; if ((error = git_buf_puts(&old_path, delta->old_file.path)) < 0 || - (error = git_buf_puts(&new_path, delta->new_file.path)) < 0 || - (error = git_buf_quote(&old_path)) < 0 || - (error = git_buf_quote(&new_path)) < 0) + (error = git_buf_puts(&new_path, delta->new_file.path)) < 0 || + (error = git_buf_quote(&old_path)) < 0 || + (error = git_buf_quote(&new_path)) < 0) goto done; git_buf_printf(out, "similarity index %d%%\n" "%s from %s\n" @@ -426,12 +425,15 @@ git_buf_clear(out); git_buf_printf(out, "diff --git %s %s\n", old_path.ptr, new_path.ptr); + if (unchanged && delta->old_file.mode != delta->new_file.mode) + diff_print_modes(out, delta); + if (delta->status == GIT_DELTA_RENAMED || - (delta->status == GIT_DELTA_COPIED && unchanged)) { + (delta->status == GIT_DELTA_COPIED && unchanged)) { if ((error = diff_delta_format_similarity_header(out, delta)) < 0) goto done; } if (!unchanged) { @@ -442,13 +444,10 @@ if ((delta->flags & GIT_DIFF_FLAG_BINARY) == 0) diff_delta_format_with_paths(out, delta, "--- %s\n+++ %s\n", old_path.ptr, new_path.ptr); } - if (unchanged && delta->old_file.mode != delta->new_file.mode) - diff_print_modes(out, delta); - if (git_buf_oom(out)) error = -1; done: git_buf_dispose(&old_path); @@ -490,35 +489,34 @@ scan += chunk_len; pi->line.num_lines++; } git_buf_putc(pi->buf, '\n'); + if (git_buf_oom(pi->buf)) + return -1; + return 0; } static int diff_print_patch_file_binary_noshow( diff_print_info *pi, git_diff_delta *delta, const char *old_pfx, const char *new_pfx) { git_buf old_path = GIT_BUF_INIT, new_path = GIT_BUF_INIT; int error; - if ((error = diff_delta_format_path( - &old_path, old_pfx, delta->old_file.path)) < 0 || - (error = diff_delta_format_path( - &new_path, new_pfx, delta->new_file.path)) < 0) + if ((error = diff_delta_format_path(&old_path, old_pfx, delta->old_file.path)) < 0 || + (error = diff_delta_format_path(&new_path, new_pfx, delta->new_file.path)) < 0 || + (error = diff_delta_format_with_paths(pi->buf, delta, "Binary files %s and %s differ\n", + old_path.ptr, new_path.ptr)) < 0) goto done; pi->line.num_lines = 1; - error = diff_delta_format_with_paths( - pi->buf, delta, "Binary files %s and %s differ\n", - old_path.ptr, new_path.ptr); done: git_buf_dispose(&old_path); git_buf_dispose(&new_path); - return error; } static int diff_print_patch_file_binary( diff_print_info *pi, git_diff_delta *delta, @@ -538,14 +536,13 @@ pre_binary_size = pi->buf->size; git_buf_printf(pi->buf, "GIT binary patch\n"); pi->line.num_lines++; if ((error = format_binary(pi, binary->new_file.type, binary->new_file.data, - binary->new_file.datalen, binary->new_file.inflatedlen)) < 0 || - (error = format_binary(pi, binary->old_file.type, binary->old_file.data, - binary->old_file.datalen, binary->old_file.inflatedlen)) < 0) { - + binary->new_file.datalen, binary->new_file.inflatedlen)) < 0 || + (error = format_binary(pi, binary->old_file.type, binary->old_file.data, + binary->old_file.datalen, binary->old_file.inflatedlen)) < 0) { if (error == GIT_EBUFS) { git_error_clear(); git_buf_truncate(pi->buf, pre_binary_size); return diff_print_patch_file_binary_noshow( @@ -578,20 +575,19 @@ delta->new_file.id_abbrev; GIT_UNUSED(progress); if (S_ISDIR(delta->new_file.mode) || - delta->status == GIT_DELTA_UNMODIFIED || - delta->status == GIT_DELTA_IGNORED || - delta->status == GIT_DELTA_UNREADABLE || - (delta->status == GIT_DELTA_UNTRACKED && + delta->status == GIT_DELTA_UNMODIFIED || + delta->status == GIT_DELTA_IGNORED || + delta->status == GIT_DELTA_UNREADABLE || + (delta->status == GIT_DELTA_UNTRACKED && (pi->flags & GIT_DIFF_SHOW_UNTRACKED_CONTENT) == 0)) return 0; - if ((error = git_diff_delta__format_file_header( - pi->buf, delta, oldpfx, newpfx, - id_strlen, print_index)) < 0) + if ((error = git_diff_delta__format_file_header(pi->buf, delta, oldpfx, newpfx, + id_strlen, print_index)) < 0) return error; 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); @@ -697,21 +693,20 @@ default: git_error_set(GIT_ERROR_INVALID, "unknown diff output format (%d)", format); return -1; } - if (!(error = diff_print_info_init_fromdiff( - &pi, &buf, diff, format, print_cb, payload))) { - error = git_diff_foreach( - diff, print_file, print_binary, print_hunk, print_line, &pi); + if ((error = diff_print_info_init_fromdiff(&pi, &buf, diff, format, print_cb, payload)) < 0) + goto out; - if (error) /* make sure error message is set */ - git_error_set_after_callback_function(error, "git_diff_print"); + if ((error = git_diff_foreach(diff, print_file, print_binary, print_hunk, print_line, &pi)) != 0) { + git_error_set_after_callback_function(error, "git_diff_print"); + goto out; } +out: git_buf_dispose(&buf); - return error; } int git_diff_print_callback__to_buf( const git_diff_delta *delta, @@ -726,12 +721,12 @@ git_error_set(GIT_ERROR_INVALID, "buffer pointer must be provided"); return -1; } if (line->origin == GIT_DIFF_LINE_ADDITION || - line->origin == GIT_DIFF_LINE_DELETION || - line->origin == GIT_DIFF_LINE_CONTEXT) + line->origin == GIT_DIFF_LINE_DELETION || + line->origin == GIT_DIFF_LINE_CONTEXT) git_buf_putc(output, line->origin); return git_buf_put(output, line->content, line->content_len); } @@ -740,57 +735,65 @@ const git_diff_hunk *hunk, const git_diff_line *line, void *payload) { FILE *fp = payload ? payload : stdout; + int error; - GIT_UNUSED(delta); GIT_UNUSED(hunk); + GIT_UNUSED(delta); + GIT_UNUSED(hunk); if (line->origin == GIT_DIFF_LINE_CONTEXT || - line->origin == GIT_DIFF_LINE_ADDITION || - line->origin == GIT_DIFF_LINE_DELETION) - fputc(line->origin, fp); - fwrite(line->content, 1, line->content_len, fp); + line->origin == GIT_DIFF_LINE_ADDITION || + line->origin == GIT_DIFF_LINE_DELETION) { + while ((error = fputc(line->origin, fp)) == EINTR) + continue; + if (error) { + git_error_set(GIT_ERROR_OS, "could not write status"); + return -1; + } + } + + if (fwrite(line->content, line->content_len, 1, fp) != 1) { + git_error_set(GIT_ERROR_OS, "could not write line"); + return -1; + } + return 0; } /* print a git_diff to a git_buf */ int git_diff_to_buf(git_buf *out, git_diff *diff, git_diff_format_t format) { assert(out && diff); git_buf_sanitize(out); - return git_diff_print( - diff, format, git_diff_print_callback__to_buf, out); + return git_diff_print(diff, format, git_diff_print_callback__to_buf, out); } /* print a git_patch to an output callback */ int git_patch_print( git_patch *patch, git_diff_line_cb print_cb, void *payload) { - int error; git_buf temp = GIT_BUF_INIT; diff_print_info pi; + int error; assert(patch && print_cb); - if (!(error = diff_print_info_init_frompatch( - &pi, &temp, patch, - GIT_DIFF_FORMAT_PATCH, print_cb, payload))) - { - error = git_patch__invoke_callbacks( - patch, - diff_print_patch_file, diff_print_patch_binary, - diff_print_patch_hunk, diff_print_patch_line, - &pi); + if ((error = diff_print_info_init_frompatch(&pi, &temp, patch, + GIT_DIFF_FORMAT_PATCH, print_cb, payload)) < 0) + goto out; - if (error) /* make sure error message is set */ - git_error_set_after_callback_function(error, "git_patch_print"); + if ((error = git_patch__invoke_callbacks(patch, diff_print_patch_file, diff_print_patch_binary, + diff_print_patch_hunk, diff_print_patch_line, &pi)) < 0) { + git_error_set_after_callback_function(error, "git_patch_print"); + goto out; } +out: git_buf_dispose(&temp); - return error; } /* print a git_patch to a git_buf */ int git_patch_to_buf(git_buf *out, git_patch *patch)