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

Re: [PATCH] show changed tree objects with recursive git-diff-tree

From
Junio C Hamano <junkio@cox.net>
Date
May 25, 2005, 06:24 UTC
Message-ID
<7vmzqjn7qh.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.62.0505231724270.16151@localhost.localdomain>
Sorry, I did not get back to you earlier.

My only hesitation is that I'd rather want to see outputs from "git-diff-tree -r $O $A" and "git-read-tree $A && git-diff-cache --cached $O" exactly match by default, but this is quite minor (I cannot even justify why myself).

As you already know, diff-helper knows it cannot do anything about trees, so that is not a reason to fear your change.

That said, I have already acquired a habit of running diff-tree with raw output to see what files have changed between two trees, relying on the traditional behaviour of showing only blobs and not trees, so turning this "tree" output on by default is a minor nuisance to adjust to (it is minor --- I just need to filter them out by looking at the first 7 bytes of each line).

How about this patch instead? Does it do what you need? My understanding of your needs is that you do not like having to call diff-tree (w/o recursive) only to get tree IDs involved, because you are indeed interested in the whole tree and prefer recursive behaviour; for that reason I made -t to imply -r.

Only lightly tested.
Signed-off-by: Junio C Hamano <junkio@cox.net>
---
diff --git a/diff-tree.c b/diff-tree.c
--- a/diff-tree.c
+++ b/diff-tree.c
@@ -6,6 +6,7 @@ static int show_root_diff = 0;
 static int verbose_header = 0;
 static int ignore_merges = 1;
 static int recursive = 0;
+static int show_tree_entry_in_recursive = 0;
 static int read_stdin = 0;
 static int diff_output_format = DIFF_FORMAT_HUMAN;
 static int detect_rename = 0;
@@ -123,6 +124,8 @@ static int compare_tree_entry(void *tree
 	if (recursive && S_ISDIR(mode1)) {
 		int retval;
 		char *newbase = malloc_base(base, path1, pathlen1);
+		if (show_tree_entry_in_recursive)
+			diff_change(mode1, mode2, sha1, sha2, base, path1);
 		retval = diff_tree_sha1(sha1, sha2, newbase);
 		free(newbase);
 		return retval;
@@ -463,7 +466,7 @@ static int diff_tree_stdin(char *line)
 }
 
 static char *diff_tree_usage =
-"git-diff-tree [-p] [-r] [-z] [--stdin] [-M] [-C] [-R] [-S<string>] [-m] [-s] [-v] <tree-ish> <tree-ish>";
+"git-diff-tree [-p] [-r] [-z] [--stdin] [-M] [-C] [-R] [-S<string>] [-m] [-s] [-v] [-t] <tree-ish> <tree-ish>";
 
 int main(int argc, const char **argv)
 {
@@ -498,6 +501,10 @@ int main(int argc, const char **argv)
 			recursive = 1;
 			continue;
 		}
+		if (!strcmp(arg, "-t")) {
+			recursive = show_tree_entry_in_recursive = 1;
+			continue;
+		}
 		if (!strcmp(arg, "-R")) {
 			reverse_diff = 1;
 			continue;

diff --git a/Documentation/git-diff-tree.txt b/Documentation/git-diff-tree.txt
--- a/Documentation/git-diff-tree.txt
+++ b/Documentation/git-diff-tree.txt
@@ -9,7 +9,7 @@ git-diff-tree - Compares the content and
 
 SYNOPSIS
 --------
-'git-diff-tree' [-p] [-r] [-z] [--stdin] [-M] [-R] [-C] [-S<string>] [-m] [-s] [-v] <tree-ish> <tree-ish> [<pattern>]\*
+'git-diff-tree' [-p] [-r] [-z] [--stdin] [-M] [-R] [-C] [-S<string>] [-m] [-s] [-v] [-t] <tree-ish> <tree-ish> [<pattern>]\*
 
 DESCRIPTION
 -----------
@@ -48,6 +48,9 @@ OPTIONS
 -r::
 	recurse
 
+-t::
+	show tree entry itself as well as subtrees.  Implies -r.
+
 -z::
 	\0 line termination on output
 
Previous: Nicolas PitreNext: Nicolas Pitre
Message 5 of 9 in “show changed tree objects with recursive git-diff-tree”
  1. show changed tree objects with recursive git-diff-treeNicolas Pitre, May 21, 2005
  2. Junio C HamanoMay 21, 2005
  3. Linus TorvaldsMay 21, 2005
  4. Nicolas PitreMay 23, 2005
  5. Junio C HamanoMay 25, 2005
  6. Nicolas PitreMay 25, 2005
  7. Junio C HamanoMay 25, 2005
  8. Linus TorvaldsMay 21, 2005
  9. Junio C HamanoMay 21, 2005

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.