Re: a slight anomaly in '--unified=0' diff output for one particular commit?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Ray Lehtiniemi <rayl@xxxxxxxx> writes:

> i get the same output for both these commands in the git repository using 
> v1.5.0-rc3-1-ge4b0e4a. 
>
>   # git show --unified=1 9299c4f147bcff603eef187eb04fe38153571d30
>   # git show --unified=0 9299c4f147bcff603eef187eb04fe38153571d30
>
> in both cases, i get the following single line of context at the end of the 
> diff:
>
>   glossary.html : glossary.txt sort_glossary.pl
>
> i'm also not sure the numbers in the '@@@' line look correct for 
> the 'unified=0' case...

That's sick.

-- >8 --
[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 <junkio@xxxxxxx>
---
 combine-diff.c |   34 ++++++++++++++++++++++++++++++----
 1 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/combine-diff.c b/combine-diff.c
index 29d0c9c..a5f2c8d 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++) {

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]