All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Karl Hasselström" <kha@treskal.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org
Subject: [PATCH 2/3 v2] Teach git diff-tree --stdin to diff trees
Date: Sat, 09 Aug 2008 14:11:18 +0200	[thread overview]
Message-ID: <20080809120816.11085.66578.stgit@yoghurt> (raw)
In-Reply-To: <20080809095605.GA10804@diana.vm.bytemark.co.uk>

When feeding trees on the command line, you can give exactly two
trees, not three nor one; --stdin now supports this "two tree" form on
its input, in addition to accepting lines with one or more commits.

When diffing trees (either specified on the command line or from the
standard input), the -m, -s, -v, --pretty, --abbrev-commit,
--encoding, --no-commit-id, -c, --cc, and --always options are
ignored, since they do not apply to trees.

Signed-off-by: Karl Hasselström <kha@treskal.com>

---

With updated commit message. (And I checked -- your earlier doc patch
_is_ obsoleted by this patch, so I saw no need to change anything
else.)

 Documentation/git-diff-tree.txt |   14 +++++++++-----
 builtin-diff-tree.c             |   35 +++++++++++++++++++++++++++++++----
 2 files changed, 40 insertions(+), 9 deletions(-)


diff --git a/Documentation/git-diff-tree.txt b/Documentation/git-diff-tree.txt
index 1fdf20d..0b1ade8 100644
--- a/Documentation/git-diff-tree.txt
+++ b/Documentation/git-diff-tree.txt
@@ -49,13 +49,17 @@ include::diff-options.txt[]
 --stdin::
 	When '--stdin' is specified, the command does not take
 	<tree-ish> arguments from the command line.  Instead, it
-	reads either one <commit> or a list of <commit>
-	separated with a single space from its standard input.
+	reads lines containing either two <tree>, one <commit>, or a
+	list of <commit> from its standard input.  (Use a single space
+	as separator.)
 +
-When a single commit is given on one line of such input, it compares
-the commit with its parents.  The following flags further affects its
-behavior.  The remaining commits, when given, are used as if they are
+When two trees are given, it compares the first tree with the second.
+When a single commit is given, it compares the commit with its
+parents.  The remaining commits, when given, are used as if they are
 parents of the first commit.
++
+The following flags further affects the behavior when comparing
+commits (but not trees).
 
 -m::
 	By default, 'git-diff-tree --stdin' does not show
diff --git a/builtin-diff-tree.c b/builtin-diff-tree.c
index ebbd631..0bdb1cf 100644
--- a/builtin-diff-tree.c
+++ b/builtin-diff-tree.c
@@ -42,21 +42,48 @@ static int stdin_diff_commit(struct commit *commit, char *line, int len)
 	return log_tree_commit(&log_tree_opt, commit);
 }
 
+/* Diff two trees. */
+static int stdin_diff_trees(struct tree *tree1, char *line, int len)
+{
+	unsigned char sha1[20];
+	struct tree *tree2;
+	if (len != 82 || !isspace(line[40]) || get_sha1_hex(line + 41, sha1)) {
+		error("Need precisely two trees, separated by one space");
+		return -1;
+	}
+	tree2 = lookup_tree(sha1);
+	if (!tree2 || parse_tree(tree2))
+		return -1;
+	printf("%s %s\n", sha1_to_hex(tree1->object.sha1),
+			  sha1_to_hex(tree2->object.sha1));
+	diff_tree_sha1(tree1->object.sha1, tree2->object.sha1,
+		       "", &log_tree_opt.diffopt);
+	log_tree_diff_flush(&log_tree_opt);
+	return 0;
+}
+
 static int diff_tree_stdin(char *line)
 {
 	int len = strlen(line);
 	unsigned char sha1[20];
-	struct commit *commit;
+	struct object *obj;
 
 	if (!len || line[len-1] != '\n')
 		return -1;
 	line[len-1] = 0;
 	if (get_sha1_hex(line, sha1))
 		return -1;
-	commit = lookup_commit(sha1);
-	if (!commit || parse_commit(commit))
+	obj = lookup_object(sha1);
+	obj = obj ? obj : parse_object(sha1);
+	if (!obj)
 		return -1;
-	return stdin_diff_commit(commit, line, len);
+	if (obj->type == OBJ_COMMIT)
+		return stdin_diff_commit((struct commit *)obj, line, len);
+	if (obj->type == OBJ_TREE)
+		return stdin_diff_trees((struct tree *)obj, line, len);
+	error("Object %s is a %s, not a commit or tree",
+	      sha1_to_hex(sha1), typename(obj->type));
+	return -1;
 }
 
 static const char diff_tree_usage[] =

  reply	other threads:[~2008-08-09 12:12 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-05 16:48 [BUG] git diff-tree --stdin doesn't accept two trees Karl Hasselström
2008-08-05 20:07 ` Junio C Hamano
2008-08-06  5:32   ` [PATCH] fix diff-tree --stdin documentation Junio C Hamano
2008-08-06 10:04     ` Karl Hasselström
2008-08-06 11:53   ` [BUG] git diff-tree --stdin doesn't accept two trees Karl Hasselström
2008-08-06 15:31     ` Junio C Hamano
2008-08-08 20:48       ` [PATCH 0/3] Teach git diff-tree --stdin to diff trees Karl Hasselström
2008-08-08 20:48         ` [PATCH 1/3] Refactoring: Split up diff_tree_stdin Karl Hasselström
2008-08-08 20:48         ` [PATCH 2/3] Teach git diff-tree --stdin to diff trees Karl Hasselström
2008-08-08 21:22           ` Junio C Hamano
2008-08-09  9:56             ` Karl Hasselström
2008-08-09 12:11               ` Karl Hasselström [this message]
2008-08-09 20:41                 ` [PATCH 2/3 v2] " Junio C Hamano
2008-08-10 15:38                   ` Karl Hasselström
2008-08-10 16:12                     ` [PATCH v3 0/4] " Karl Hasselström
2008-08-10 16:12                       ` [PATCH v3 1/4] Refactoring: Split up diff_tree_stdin Karl Hasselström
2008-08-10 16:12                       ` [PATCH v3 2/4] diff-tree: Note that the commit ID is printed with --stdin Karl Hasselström
2008-08-10 16:12                       ` [PATCH v3 3/4] Teach git diff-tree --stdin to diff trees Karl Hasselström
2008-08-10 16:13                       ` [PATCH v3 4/4] Add test for diff-tree --stdin with two trees Karl Hasselström
2008-08-10 17:04                       ` [PATCH v3 0/4] Teach git diff-tree --stdin to diff trees Karl Hasselström
2008-08-09 20:07               ` [PATCH 2/3] " Junio C Hamano
2008-08-09 20:36                 ` Karl Hasselström
2008-08-08 21:45           ` Jeff King
2008-08-09 10:00             ` Karl Hasselström
2008-08-11 22:28               ` Jeff King
2008-08-08 20:48         ` [PATCH 3/3] Add test for diff-tree --stdin with two trees Karl Hasselström

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080809120816.11085.66578.stgit@yoghurt \
    --to=kha@treskal.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.