commit b16ee0699b6283b06cc57cca68c87d89a96630dc from: Stefan Sperling date: Tue Oct 11 17:09:32 2022 UTC sync files from diff.git 674563ab136a2aa34dc4d93043d92235a2ae98ba commit - 3b95caf0b7910e22d23ee16cd50fab25471e1e20 commit + b16ee0699b6283b06cc57cca68c87d89a96630dc blob - dd6b2aa9dd850690d77fb00149d2331f76b827e3 blob + 238ecb9d0ee975efd8eacc55de14b8cfb69792de --- lib/diff_atomize_text.c +++ lib/diff_atomize_text.c @@ -64,7 +64,7 @@ diff_data_atomize_text_lines_fd(struct diff_data *d) while (eol == 0 && line_end < end) { r = fread(buf, sizeof(char), sizeof(buf), d->root->f); if (r == 0 && ferror(d->root->f)) - return errno; + return EIO; i = 0; while (eol == 0 && i < r) { if (buf[i] != '\r' && buf[i] != '\n') { @@ -91,7 +91,7 @@ diff_data_atomize_text_lines_fd(struct diff_data *d) return errno; r = fread(buf, sizeof(char), sizeof(buf), d->root->f); if (r == 0 && ferror(d->root->f)) - return errno; + return EIO; if (r > 0 && buf[0] == '\n') line_end++; } blob - 0ed8a5e2244549f0bc385a02aa8eb6f5d610deac blob + 4b7ec8090638d2752cd946046f2333347bf244ae --- lib/diff_debug.h +++ lib/diff_debug.h @@ -58,8 +58,6 @@ dump_atom(const struct diff_data *left, const struct d int i; r = fread(buf, 1, MIN(remain, sizeof(buf)), atom->root->f); - if (r == -1) - abort(); /* cannot return error */ if (r == 0) break; remain -= r; blob - be72763dedcb12e2baabb6fda64e06d2fcf5f598 blob + 7c2bfddb8f77a9026ec782026f3775a07e004f5e --- lib/diff_internal.h +++ lib/diff_internal.h @@ -51,11 +51,6 @@ diff_range_len(const struct diff_range *r) return r->end - r->start; } -/* List of all possible return codes of a diff invocation. */ -#define DIFF_RC_USE_DIFF_ALGO_FALLBACK -1 -#define DIFF_RC_OK 0 -/* Any positive return values are errno values from sys/errno.h */ - /* Indicate whether two given diff atoms match. */ int diff_atom_same(bool *same, blob - c531ad29bc45c650dd4e3dbc4773479aafd7676b blob + 00a42243cafc3f305b117bd3a861bb075aeee435 --- lib/diff_main.c +++ lib/diff_main.c @@ -43,7 +43,7 @@ read_at(FILE *f, off_t at_pos, unsigned char *buf, siz return errno; r = fread(buf, sizeof(char), len, f); if ((r == 0 || r < len) && ferror(f)) - return errno; + return EIO; if (r != len) return EIO; return 0; @@ -627,4 +627,20 @@ diff_result_free(struct diff_result *result) return; ARRAYLIST_FREE(result->chunks); free(result); +} + +int +diff_result_contains_printable_chunks(struct diff_result *result) +{ + struct diff_chunk *c; + enum diff_chunk_type t; + + for (int i = 0; i < result->chunks.len; i++) { + c = &result->chunks.head[i]; + t = diff_chunk_type(c); + if (t == CHUNK_MINUS || t == CHUNK_PLUS) + return 1; + } + + return 0; } blob - 5e816ae10b5948c0aeacd27365a91f3147b96baf blob + fa9dc982956eab298f65b4b9ffca114a46b50b76 --- lib/diff_main.h +++ lib/diff_main.h @@ -251,3 +251,4 @@ struct diff_result *diff_main(const struct diff_config struct diff_data *left, struct diff_data *right); void diff_result_free(struct diff_result *result); +int diff_result_contains_printable_chunks(struct diff_result *result); blob - 74b22eb8207ab2c5f154a22229051900a3d7b1ce blob + b20dabf6658691770d21bfe3c1227ae815223474 --- lib/diff_output_unidiff.c +++ lib/diff_output_unidiff.c @@ -391,6 +391,11 @@ output_unidiff_chunk(struct diff_output_info *outinfo, cc->left.end - chunk_end_line); if (rc) return rc; + + rc = diff_output_trailing_newline_msg(outinfo, dest, + &result->chunks.head[result->chunks.len - 1]); + if (rc != DIFF_RC_OK) + return rc; } return DIFF_RC_OK;