From 3b0f5e88ee039e96822d7d0127a59d78936c222f Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 3 Feb 2007 12:37:54 -0800 Subject: [PATCH] combine-diff: special case --unified=0 Even when --unified=0 is given, the main loop to show the combined textual diff needs to handle a line that is unchanged but has lines that were deleted relative to a parent before it (because that is where the lost lines hang). However, such a line should not be emitted in the final output. Signed-off-by: Junio C Hamano --- combine-diff.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/combine-diff.c b/combine-diff.c index 29d0c9cf95..a5f2c8dd4a 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -482,11 +482,11 @@ static int make_hunks(struct sline *sline, unsigned long cnt, return has_interesting; } -static void show_parent_lno(struct sline *sline, unsigned long l0, unsigned long l1, int n) +static void show_parent_lno(struct sline *sline, unsigned long l0, unsigned long l1, int n, unsigned long null_context) { l0 = sline[l0].p_lno[n]; l1 = sline[l1].p_lno[n]; - printf(" -%lu,%lu", l0, l1-l0); + printf(" -%lu,%lu", l0, l1-l0-null_context); } static int hunk_comment_line(const char *bol) @@ -519,6 +519,7 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent, unsigned long hunk_end; unsigned long rlines; const char *hunk_comment = NULL; + unsigned long null_context = 0; while (lno <= cnt && !(sline[lno].flag & mark)) { if (hunk_comment_line(sline[lno].bol)) @@ -535,10 +536,28 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent, rlines = hunk_end - lno; if (cnt < hunk_end) rlines--; /* pointing at the last delete hunk */ + + if (!context) { + /* + * Even when running with --unified=0, all + * lines in the hunk needs to be processed in + * the loop below in order to show the + * deletion recorded in lost_head. However, + * we do not want to show the resulting line + * with all blank context markers in such a + * case. Compensate. + */ + unsigned long j; + for (j = lno; j < hunk_end; j++) + if (!(sline[j].flag & (mark-1))) + null_context++; + rlines -= null_context; + } + fputs(c_frag, stdout); for (i = 0; i <= num_parent; i++) putchar(combine_marker); for (i = 0; i < num_parent; i++) - show_parent_lno(sline, lno, hunk_end, i); + show_parent_lno(sline, lno, hunk_end, i, null_context); printf(" +%lu,%lu ", lno+1, rlines); for (i = 0; i <= num_parent; i++) putchar(combine_marker); @@ -578,8 +597,15 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent, if (cnt < lno) break; p_mask = 1; - if (!(sl->flag & (mark-1))) + if (!(sl->flag & (mark-1))) { + /* + * This sline was here to hang the + * lost lines in front of it. + */ + if (!context) + continue; fputs(c_plain, stdout); + } else fputs(c_new, stdout); for (j = 0; j < num_parent; j++) {