commit 7021523c6d7788c452572f0b48f0dcba23199dac from: Stefan Sperling date: Fri Oct 16 00:55:41 2020 UTC print "\ No newline at end of file" message like UNIX diff(1) does Not adding new tests since this behaviour is covered by tests in Got. commit - 26595c7df947f97507904fa391034b6a52bfca7d commit + 7021523c6d7788c452572f0b48f0dcba23199dac blob - 0450a007a948e500aa26ebd54a8aa533da5bbd63 blob + d3fb08b4f85c7df22caa8b63d284698ef9a26235 --- lib/diff_internal.h +++ lib/diff_internal.h @@ -216,6 +216,10 @@ int diff_output_lines(struct diff_output_info *output_ const char *prefix, struct diff_atom *start_atom, unsigned int count); +int diff_output_trailing_newline_msg(struct diff_output_info *outinfo, + FILE *dest, + const struct diff_chunk *c); + struct diff_output_info *diff_output_info_alloc(void); void blob - c3b2ac5dc419e89767ba81d0b11e159efef02bc9 blob + 8fdb333fafc6ce71b39dd9e58a8c572346c797c2 --- lib/diff_output.c +++ lib/diff_output.c @@ -188,6 +188,54 @@ diff_output_chunk_right_version(struct diff_output_inf return DIFF_RC_OK; } +int +diff_output_trailing_newline_msg(struct diff_output_info *outinfo, FILE *dest, + const struct diff_chunk *c) +{ + enum diff_chunk_type chunk_type = diff_chunk_type(c); + struct diff_atom *atom, *start_atom; + unsigned int atom_count; + int rc, ch; + off_t outoff = 0, *offp; + + if (chunk_type == CHUNK_MINUS || chunk_type == CHUNK_SAME) { + start_atom = c->left_start; + atom_count = c->left_count; + } else if (chunk_type == CHUNK_PLUS) { + start_atom = c->right_start; + atom_count = c->right_count; + } else + return EINVAL; + + /* Locate the last atom. */ + foreach_diff_atom(atom, start_atom, atom_count - 1) { + /* do nothing */; + } + + rc = get_atom_byte(&ch, atom, atom->len - 1); + if (rc != DIFF_RC_OK) + return rc; + + if (ch != '\n') { + if (outinfo && outinfo->line_offsets.len > 0) { + unsigned int idx = outinfo->line_offsets.len - 1; + outoff = outinfo->line_offsets.head[idx]; + } + rc = fprintf(dest, "\\ No newline at end of file\n"); + if (rc < 0) + return errno; + if (outinfo) { + ARRAYLIST_ADD(offp, outinfo->line_offsets); + if (offp == NULL) + return ENOMEM; + outoff += rc; + *offp = outoff; + } + } + + return DIFF_RC_OK; +} + struct diff_output_info * diff_output_info_alloc(void) { blob - eaea44c1044a8f6ee273c5559c2945e50f2475c9 blob + 1ca6f80e8c29baa9241a9768b18d41e97cf079be --- lib/diff_output_unidiff.c +++ lib/diff_output_unidiff.c @@ -261,6 +261,12 @@ output_unidiff_chunk(struct diff_output_info *outinfo, c->right_start, c->right_count); if (rc) return rc; + + if (cc->chunk.end == result->chunks.len) { + rc = diff_output_trailing_newline_msg(outinfo, dest, c); + if (rc != DIFF_RC_OK) + return rc; + } } /* Trailing context? */