From: Junio C Hamano <hidden> Date: 2016-06-15 22:45:07
Karl Hasselström [off-list ref] writes:
In addition to accepting lines with one or more commits, it now
accepts lines with precisely two trees.
Hmm, slightly dissapointed (I actually was hoping you would also handle
more than two trees and run -m or -c or --cc on them).
"On the command line, you can give exactly two trees, not three nor one;
this two-tree form is now also supported in --stdin mode." --- that
justfication sounds like a good one (and that is why my dissapointment is
only "slight").
But the following two sentences are a bit confusing, especially it is
unclear what "This" refers to in the last sentence.
When diffing trees, 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. This is the same behavior
you get when specifying two trees on the command line instead of with
--stdin.
Perhaps swap the sentences in the log message like this?
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.
Thanks, now we can update that documentation change.
From: Karl Hasselström <hidden> Date: 2016-06-15 22:45:07
On 2008-08-08 14:22:45 -0700, Junio C Hamano wrote:
Karl Hasselström [off-list ref] writes:
quoted
In addition to accepting lines with one or more commits, it now
accepts lines with precisely two trees.
Hmm, slightly dissapointed (I actually was hoping you would also
handle more than two trees and run -m or -c or --cc on them).
I decided to not attempt that -- I'm unsure enough of my git
programming skills that I decided the smaller jump would provide
sufficient material for constructive criticism. And, perhaps more
importantly, I personally don't have a need for anything beyond what I
implemented. (And, I'm not burning any bridges -- the multiple-tree
forms can be added in the future. Along with handling them on the
command line too, hopefully.)
But the following two sentences are a bit confusing, especially it
is unclear what "This" refers to in the last sentence.
quoted
When diffing trees, 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. This is the same
behavior you get when specifying two trees on the command line
instead of with --stdin.
Perhaps swap the sentences in the log message like this?
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.
Will do. Thanks.
Thanks, now we can update that documentation change.
I think your doc patch is obsoleted by my patch. I'll make sure it's
all taken care of in the resend.
--
Karl Hasselström, kha@treskal.com
www.treskal.com/kalle
From: Karl Hasselström <hidden> Date: 2016-06-15 22:45:07
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 <redacted>
---
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(-)
@@ -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
@@ -42,21 +42,48 @@ static int stdin_diff_commit(struct commit *commit, char *line, int len)returnlog_tree_commit(&log_tree_opt,commit);}+/* Diff two trees. */+staticintstdin_diff_trees(structtree*tree1,char*line,intlen)+{+unsignedcharsha1[20];+structtree*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);+return0;+}+staticintdiff_tree_stdin(char*line){intlen=strlen(line);unsignedcharsha1[20];-structcommit*commit;+structobject*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;-returnstdin_diff_commit(commit,line,len);+if(obj->type==OBJ_COMMIT)+returnstdin_diff_commit((structcommit*)obj,line,len);+if(obj->type==OBJ_TREE)+returnstdin_diff_trees((structtree*)obj,line,len);+error("Object %s is a %s, not a commit or tree",+sha1_to_hex(sha1),typename(obj->type));+return-1;}staticconstchardiff_tree_usage[]=
From: Junio C Hamano <hidden> Date: 2016-06-15 22:45:07
Karl Hasselström [off-list ref] writes:
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.
I've commented on this part already; -m, -c, --cc are excluded because
they make sense only when you are dealing with three or more trees.
@@ -42,21 +42,48 @@ static int stdin_diff_commit(struct commit *commit, char *line, int len)returnlog_tree_commit(&log_tree_opt,commit);}+/* Diff two trees. */+staticintstdin_diff_trees(structtree*tree1,char*line,intlen)+{+unsignedcharsha1[20];+structtree*tree2;+if(len!=82||!isspace(line[40])||get_sha1_hex(line+41,sha1)){+error("Need precisely two trees, separated by one space");+return-1;+}
error() returns -1, so:
if (len != 82 || !isspace(line[40]) || get_sha1_hex(line + 41, sha1))
return error("Need two trees, separated by one space");
Since this is strictly for Porcelain's use, you may want to document this
output format.
Two-tree form from the command line does not have anything like this, and
two-commit form from --stdin have either a single object name, the log
message under -v or --pretty options. I notice that these are not
documented but we may want to document it while at it.
Other than that, the patch looks good. Thanks.
From: Karl Hasselström <hidden> Date: 2016-06-15 22:45:07
On 2008-08-09 13:41:23 -0700, Junio C Hamano wrote:
Karl Hasselström [off-list ref] writes:
quoted
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.
I've commented on this part already; -m, -c, --cc are excluded
because they make sense only when you are dealing with three or more
trees.
Fixed.
quoted
+ if (len != 82 || !isspace(line[40]) || get_sha1_hex(line + 41, sha1)) {
+ error("Need precisely two trees, separated by one space");
+ return -1;
+ }
error() returns -1, so:
if (len != 82 || !isspace(line[40]) || get_sha1_hex(line + 41, sha1))
return error("Need two trees, separated by one space");
Since this is strictly for Porcelain's use, you may want to document
this output format.
Yes. Fixed.
Two-tree form from the command line does not have anything like
this, and two-commit form from --stdin have either a single object
name, the log message under -v or --pretty options. I notice that
these are not documented but we may want to document it while at it.
I'll whip something up and send it out as a separate patch.
Other than that, the patch looks good. Thanks.
Thanks for the feedback.
--
Karl Hasselström, kha@treskal.com
www.treskal.com/kalle
@@ -169,6 +169,20 @@ test_expect_success \cmp-s.test-a.test-recursive-AB' test_expect_success\+'diff-tree --stdin of known trees.'\+'echo$tree_A$tree_B|gitdiff-tree--stdin>.test-a&&+echo$tree_A$tree_B>.test-plain-ABx&&+cat.test-plain-AB>>.test-plain-ABx&&+cmp-s.test-a.test-plain-ABx'++test_expect_success\+'diff-tree --stdin of known trees.'\+'echo$tree_A$tree_B|gitdiff-tree-r--stdin>.test-a&&+echo$tree_A$tree_B>.test-recursive-ABx&&+cat.test-recursive-AB>>.test-recursive-ABx&&+cmp-s.test-a.test-recursive-ABx'++test_expect_success\'diff-cache O with A in cache'\'gitread-tree$tree_A&&gitdiff-index--cached$tree_O>.test-a&&
From: Karl Hasselström <hidden> Date: 2016-06-15 22:45:07
Into a first half that determines what operation to do, and a second
half that does it.
Currently the only operation is diffing one or more commits, but a
later patch will add diffing of trees, at which point this refactoring
will pay off.
Signed-off-by: Karl Hasselström <redacted>
---
builtin-diff-tree.c | 31 +++++++++++++++++++------------
1 files changed, 19 insertions(+), 12 deletions(-)
@@ -14,20 +14,10 @@ static int diff_tree_commit_sha1(const unsigned char *sha1)returnlog_tree_commit(&log_tree_opt,commit);}-staticintdiff_tree_stdin(char*line)+/* Diff one or more commits. */+staticintstdin_diff_commit(structcommit*commit,char*line,intlen){-intlen=strlen(line);unsignedcharsha1[20];-structcommit*commit;--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))-return-1;if(isspace(line[40])&&!get_sha1_hex(line+41,sha1)){/* Graft the fake parents locally to the commit */intpos=41;
From: Karl Hasselström <hidden> Date: 2016-06-15 22:45:07
It's sort of already documented with the --no-commit-id command-line
flag, but let's not hide important information from the user.
Signed-off-by: Karl Hasselström <redacted>
---
Documentation/git-diff-tree.txt | 10 +++++++---
1 files changed, 7 insertions(+), 3 deletions(-)
@@ -52,10 +52,14 @@ include::diff-options.txt[] reads either one <commit> or a list of <commit> separated with a single space from its standard input. +-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 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 ID of the first (or only) commit, followed by a newline, is+printed before the differences.+++The following flags further affects its behavior. -m:: By default, 'git-diff-tree --stdin' does not show
From: Karl Hasselström <hidden> Date: 2016-06-15 22:45:08
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 -s, -v, --pretty, --abbrev-commit, --encoding,
--no-commit-id, and --always options are ignored, since they do not
apply to trees; and the -m, -c, and --cc options are ignored since
they would require three trees, which is not supported (yet).
Signed-off-by: Karl Hasselström <redacted>
---
Documentation/git-diff-tree.txt | 15 ++++++++++-----
builtin-diff-tree.c | 33 +++++++++++++++++++++++++++++----
2 files changed, 39 insertions(+), 9 deletions(-)
@@ -49,17 +49,22 @@ 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 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 ID of the first (or only) commit, followed by a newline, is-printed before the differences.+When comparing two trees, the ID of both trees (separated by a space+and terminated by a newline) is printed before the difference. When+comparing commits, the ID of the first (or only) commit, followed by a+newline, is printed. +-The following flags further affects its behavior.+The following flags further affects the behavior when comparing+commits (but not trees). -m:: By default, 'git-diff-tree --stdin' does not show
@@ -42,21 +42,46 @@ static int stdin_diff_commit(struct commit *commit, char *line, int len)returnlog_tree_commit(&log_tree_opt,commit);}+/* Diff two trees. */+staticintstdin_diff_trees(structtree*tree1,char*line,intlen)+{+unsignedcharsha1[20];+structtree*tree2;+if(len!=82||!isspace(line[40])||get_sha1_hex(line+41,sha1))+returnerror("Need precisely two trees, separated by a space");+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);+return0;+}+staticintdiff_tree_stdin(char*line){intlen=strlen(line);unsignedcharsha1[20];-structcommit*commit;+structobject*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;-returnstdin_diff_commit(commit,line,len);+if(obj->type==OBJ_COMMIT)+returnstdin_diff_commit((structcommit*)obj,line,len);+if(obj->type==OBJ_TREE)+returnstdin_diff_trees((structtree*)obj,line,len);+error("Object %s is a %s, not a commit or tree",+sha1_to_hex(sha1),typename(obj->type));+return-1;}staticconstchardiff_tree_usage[]=
From: Karl Hasselström <hidden> Date: 2016-06-15 22:45:08
Updated after Junio's comments. (Patch 1/4 and 4/4 have not changed
but I'm resending them anyway for convenience.)
---
Karl Hasselström (4):
Add test for diff-tree --stdin with two trees
Teach git diff-tree --stdin to diff trees
diff-tree: Note that the commit ID is printed with --stdin
Refactoring: Split up diff_tree_stdin
Documentation/git-diff-tree.txt | 19 ++++++++++---
builtin-diff-tree.c | 56 +++++++++++++++++++++++++++++++--------
t/t4002-diff-basic.sh | 14 ++++++++++
3 files changed, 72 insertions(+), 17 deletions(-)
--
Karl Hasselström, kha@treskal.com
www.treskal.com/kalle