git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] combine-diff: move formatting logic to show_combined_diff()

From
Junio C Hamano <junkio@cox.net>
Date
Feb 9, 2006, 23:49 UTC
Message-ID
<7vbqxg6qkj.fsf_-_@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.64.0602091216460.2458@g5.osdl.org>
Linus Torvalds <torvalds@osdl.org> writes:
Show 9 quoted lines
> On Thu, 9 Feb 2006, Junio C Hamano wrote:
>>
>> I was wondering if we could teach not diff_tree_combined_merge
>> but show_combined_diff to do this, so that diff-files -c would
>> benefit from the raw output as wel.
>
> I wanted to do it that way, but it seemed less intrusive this way.
>
> I agree that it is the correct thing to do, though.
This comes on top of the earlier "use diffcore_std()" patch.

-- >8 -- This way, diff-files can make use of it. Also implement the full suite of what diff_flush_raw() supports just for consistency. With this, 'diff-tree -c -r --name-status' would show what is expected.

There is no way to get the historical output (useful for debugging and low-level Plumbing work) anymore, so tentatively it makes '-m' to mean "do not combine and show individual diffs with parents".

diff-files matches diff-tree to produce raw output for -c. For textual combined diff, use -p -c.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 combine-diff.c |   85 ++++++++++++++++++++++++++++++++++++++------------------
 diff-files.c   |    6 ++--
 diff-tree.c    |    2 +
 diff.h         |    3 +-
 4 files changed, 64 insertions(+), 32 deletions(-)
0a798076b8d1a4a31bf2b24c564e2a99fd1c43a1
diff --git a/combine-diff.c b/combine-diff.c
index 6d78305..9aa099b 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -618,8 +618,8 @@ static void reuse_combine_diff(struct sl
 	sline->p_lno[i] = sline->p_lno[j];
 }
 
-int show_combined_diff(struct combine_diff_path *elem, int num_parent,
-		       int dense, const char *header)
+static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
+			   int dense, const char *header)
 {
 	unsigned long size, cnt, lno;
 	char *result, *cp, *ep;
@@ -791,32 +791,69 @@ static void show_raw_diff(struct combine
 
 	if (header)
 		puts(header);
-	offset = strlen(COLONS) - num_parent;
-	if (offset < 0)
-		offset = 0;
-	prefix = COLONS + offset;
 
-	/* Show the modes */
 	for (i = 0; i < num_parent; i++) {
-		int mode = p->parent[i].mode;
-		if (mode)
+		if (p->parent[i].mode)
 			mod_type = 'M';
-		printf("%s%06o", prefix, mode);
-		prefix = " ";
 	}
-	printf("%s%06o", prefix, p->mode);
 	if (!p->mode)
 		mod_type = 'D';
 
-	/* Show sha1's */
-	for (i = 0; i < num_parent; i++) {
-		printf("%s%s", prefix, diff_unique_abbrev(p->parent[i].sha1, opt->abbrev));
-		prefix = " ";
+	if (opt->output_format == DIFF_FORMAT_RAW) {
+		offset = strlen(COLONS) - num_parent;
+		if (offset < 0)
+			offset = 0;
+		prefix = COLONS + offset;
+
+		/* Show the modes */
+		for (i = 0; i < num_parent; i++) {
+			printf("%s%06o", prefix, p->parent[i].mode);
+			prefix = " ";
+		}
+		printf("%s%06o", prefix, p->mode);
+
+		/* Show sha1's */
+		for (i = 0; i < num_parent; i++)
+			printf(" %s", diff_unique_abbrev(p->parent[i].sha1,
+							 opt->abbrev));
+		printf(" %s ", diff_unique_abbrev(p->sha1, opt->abbrev));
+	}
+
+	if (opt->output_format == DIFF_FORMAT_RAW ||
+	    opt->output_format == DIFF_FORMAT_NAME_STATUS)
+		printf("%c%c", mod_type, inter_name_termination);
+
+	if (line_termination) {
+		if (quote_c_style(p->path, NULL, NULL, 0))
+			quote_c_style(p->path, NULL, stdout, 0);
+		else
+			printf("%s", p->path);
+		putchar(line_termination);
 	}
-	printf("%s%s", prefix, diff_unique_abbrev(p->sha1, opt->abbrev));
+	else {
+		printf("%s%c", p->path, line_termination);
+	}
+}
 
-	/* Modification type, terminations, filename */
-	printf(" %c%c%s%c", mod_type, inter_name_termination, p->path, line_termination);
+int show_combined_diff(struct combine_diff_path *p,
+		       int num_parent,
+		       int dense,
+		       const char *header,
+		       struct diff_options *opt)
+{
+	if (!p->len)
+		return 0;
+	switch (opt->output_format) {
+	case DIFF_FORMAT_RAW:
+	case DIFF_FORMAT_NAME_STATUS:
+	case DIFF_FORMAT_NAME:
+		show_raw_diff(p, num_parent, header, opt);
+		return 1;
+
+	default:
+	case DIFF_FORMAT_PATCH:
+		return show_patch_diff(p, num_parent, dense, header);
+	}
 }
 
 const char *diff_tree_combined_merge(const unsigned char *sha1,
@@ -858,14 +895,8 @@ const char *diff_tree_combined_merge(con
 	}
 	if (num_paths) {
 		for (p = paths; p; p = p->next) {
-			if (!p->len)
-				continue;
-			if (opt->output_format == DIFF_FORMAT_RAW) {
-				show_raw_diff(p, num_parent, header, opt);
-				header = NULL;
-				continue;
-			}
-			if (show_combined_diff(p, num_parent, dense, header))
+			if (show_combined_diff(p, num_parent, dense,
+					       header, opt))
 				header = NULL;
 		}
 	}
diff --git a/diff-files.c b/diff-files.c
index d24d11c..7db5ce6 100644
--- a/diff-files.c
+++ b/diff-files.c
@@ -88,9 +88,8 @@ int main(int argc, const char **argv)
 		}
 		argv++; argc--;
 	}
-	if (combine_merges) {
+	if (dense_combined_merges)
 		diff_options.output_format = DIFF_FORMAT_PATCH;
-	}
 
 	/* Find the directory, and set up the pathspec */
 	pathspec = get_pathspec(prefix, argv + 1);
@@ -166,7 +165,8 @@ int main(int argc, const char **argv)
 			if (combine_merges && num_compare_stages == 2) {
 				show_combined_diff(&combine.p, 2,
 						   dense_combined_merges,
-						   NULL);
+						   NULL,
+						   &diff_options);
 				free(combine.p.path);
 				continue;
 			}
diff --git a/diff-tree.c b/diff-tree.c
index df6fd97..b170b03 100644
--- a/diff-tree.c
+++ b/diff-tree.c
@@ -248,7 +248,7 @@ int main(int argc, const char **argv)
 			continue;
 		}
 		if (!strcmp(arg, "-m")) {
-			ignore_merges = 0;
+			combine_merges = ignore_merges = 0;
 			continue;
 		}
 		if (!strcmp(arg, "-c")) {
diff --git a/diff.h b/diff.h
index 9088519..946a406 100644
--- a/diff.h
+++ b/diff.h
@@ -75,7 +75,8 @@ struct combine_diff_path {
 	 sizeof(struct combine_diff_parent) * (n) + (l) + 1)
 
 extern int show_combined_diff(struct combine_diff_path *elem, int num_parent,
-			      int dense, const char *header);
+			      int dense, const char *header,
+			      struct diff_options *);
 
 extern const char *diff_tree_combined_merge(const unsigned char *sha1, const char *, int, struct diff_options *opt);
 
-- 
1.1.6.gce16
Previous: Junio C HamanoNext: Kay Sievers
Message 26 of 27 in “gitweb using "--cc"?”
  1. Linus TorvaldsFeb 8, 2006
  2. Junio C HamanoFeb 8, 2006
  3. Use describe to come up with the closest tag.Junio C Hamano, Feb 9, 2006
  4. Allow using --cc when showing a merge.Junio C Hamano, Feb 9, 2006
  5. Brian GerstFeb 9, 2006
  6. Linus TorvaldsFeb 9, 2006
  7. Junio C HamanoFeb 9, 2006
  8. Linus TorvaldsFeb 9, 2006
  9. Linus TorvaldsFeb 9, 2006
  10. Linus TorvaldsFeb 9, 2006
  11. Junio C HamanoFeb 9, 2006
  12. Linus TorvaldsFeb 9, 2006
  13. Linus TorvaldsFeb 9, 2006
  14. Junio C HamanoFeb 9, 2006
  15. Junio C HamanoFeb 9, 2006
  16. Junio C HamanoFeb 9, 2006
  17. Junio C HamanoFeb 9, 2006
  18. Junio C HamanoFeb 9, 2006
  19. Marco CostalbaFeb 11, 2006
  20. Junio C HamanoFeb 11, 2006
  21. Junio C HamanoFeb 11, 2006
  22. Junio C HamanoFeb 9, 2006
  23. Linus TorvaldsFeb 9, 2006
  24. Junio C HamanoFeb 9, 2006
  25. combine-diff: Record diff status a bit more faithfullyJunio C Hamano, Feb 10, 2006
  26. combine-diff: move formatting logic to show_combined_diff()Junio C Hamano, Feb 9, 2006
  27. Kay SieversFeb 9, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.