зеркало из https://github.com/microsoft/git.git
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:
Родитель
a9d1836b10
Коммит
3b0f5e88ee
|
@ -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++) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче