Commit Diff


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? */