Teach git diff-tree --stdin to diff trees
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 be meaningful only with three or more trees, which is not supported (yet). Signed-off-by: Karl Hasselström <kha@treskal.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7cccfaa280
commit
140b378d07
@ -49,17 +49,22 @@ include::diff-options.txt[]
|
|||||||
--stdin::
|
--stdin::
|
||||||
When '--stdin' is specified, the command does not take
|
When '--stdin' is specified, the command does not take
|
||||||
<tree-ish> arguments from the command line. Instead, it
|
<tree-ish> arguments from the command line. Instead, it
|
||||||
reads either one <commit> or a list of <commit>
|
reads lines containing either two <tree>, one <commit>, or a
|
||||||
separated with a single space from its standard input.
|
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
|
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. The remaining commits, when given, are used as if they are
|
||||||
parents of the first commit.
|
parents of the first commit.
|
||||||
+
|
+
|
||||||
The ID of the first (or only) commit, followed by a newline, is
|
When comparing two trees, the ID of both trees (separated by a space
|
||||||
printed before the differences.
|
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::
|
-m::
|
||||||
By default, 'git-diff-tree --stdin' does not show
|
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)
|
|||||||
return log_tree_commit(&log_tree_opt, commit);
|
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))
|
||||||
|
return error("Need exactly 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);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int diff_tree_stdin(char *line)
|
static int diff_tree_stdin(char *line)
|
||||||
{
|
{
|
||||||
int len = strlen(line);
|
int len = strlen(line);
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
struct commit *commit;
|
struct object *obj;
|
||||||
|
|
||||||
if (!len || line[len-1] != '\n')
|
if (!len || line[len-1] != '\n')
|
||||||
return -1;
|
return -1;
|
||||||
line[len-1] = 0;
|
line[len-1] = 0;
|
||||||
if (get_sha1_hex(line, sha1))
|
if (get_sha1_hex(line, sha1))
|
||||||
return -1;
|
return -1;
|
||||||
commit = lookup_commit(sha1);
|
obj = lookup_object(sha1);
|
||||||
if (!commit || parse_commit(commit))
|
obj = obj ? obj : parse_object(sha1);
|
||||||
|
if (!obj)
|
||||||
return -1;
|
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[] =
|
static const char diff_tree_usage[] =
|
||||||
|
Loading…
Reference in New Issue
Block a user