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 <junkio@cox.net>
This commit is contained in:
parent
a9d1836b10
commit
3b0f5e88ee
@ -482,11 +482,11 @@ static int make_hunks(struct sline *sline, unsigned long cnt,
|
|||||||
return has_interesting;
|
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];
|
l0 = sline[l0].p_lno[n];
|
||||||
l1 = sline[l1].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)
|
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 hunk_end;
|
||||||
unsigned long rlines;
|
unsigned long rlines;
|
||||||
const char *hunk_comment = NULL;
|
const char *hunk_comment = NULL;
|
||||||
|
unsigned long null_context = 0;
|
||||||
|
|
||||||
while (lno <= cnt && !(sline[lno].flag & mark)) {
|
while (lno <= cnt && !(sline[lno].flag & mark)) {
|
||||||
if (hunk_comment_line(sline[lno].bol))
|
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;
|
rlines = hunk_end - lno;
|
||||||
if (cnt < hunk_end)
|
if (cnt < hunk_end)
|
||||||
rlines--; /* pointing at the last delete hunk */
|
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);
|
fputs(c_frag, stdout);
|
||||||
for (i = 0; i <= num_parent; i++) putchar(combine_marker);
|
for (i = 0; i <= num_parent; i++) putchar(combine_marker);
|
||||||
for (i = 0; i < num_parent; i++)
|
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);
|
printf(" +%lu,%lu ", lno+1, rlines);
|
||||||
for (i = 0; i <= num_parent; i++) putchar(combine_marker);
|
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)
|
if (cnt < lno)
|
||||||
break;
|
break;
|
||||||
p_mask = 1;
|
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);
|
fputs(c_plain, stdout);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
fputs(c_new, stdout);
|
fputs(c_new, stdout);
|
||||||
for (j = 0; j < num_parent; j++) {
|
for (j = 0; j < num_parent; j++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user