From: Paul Mackerras Date: Tue, 30 May 2006 02:01:38 +0000 (-0700) Subject: Make git-diff-tree indicate when it flushes X-Git-Tag: v1.4.0-rc1~42 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=e0c97ca6;p=git.git Make git-diff-tree indicate when it flushes There are times when gitk needs to know that the commits it has sent to git-diff-tree --stdin did not match, and it needs to know in a timely fashion even if none of them match. At the moment, git-diff-tree outputs nothing for non-matching commits, so it is impossible for gitk to distinguish between git-diff-tree being slow and git-diff-tree saying no. This makes git-diff-tree flush its output and echo back the input line when it is not a valid-looking object name. Gitk, or other users of git-diff-tree --stdin, can use a blank line or any other "marker line" to indicate that git-diff-tree has processed all the commits on its input up to the echoed back marker line, and any commits that have not been output do not match. [jc: re-done after a couple of back-and-forth discussion on the list.] Signed-off-by: Paul Mackerras Signed-off-by: Junio C Hamano --- diff --git a/builtin-diff-tree.c b/builtin-diff-tree.c index cc53b81a..58cf6585 100644 --- a/builtin-diff-tree.c +++ b/builtin-diff-tree.c @@ -138,11 +138,15 @@ int cmd_diff_tree(int argc, const char **argv, char **envp) if (opt->diffopt.detect_rename) opt->diffopt.setup |= (DIFF_SETUP_USE_SIZE_CACHE | DIFF_SETUP_USE_CACHE); - while (fgets(line, sizeof(line), stdin)) - if (line[0] == '\n') + while (fgets(line, sizeof(line), stdin)) { + unsigned char sha1[20]; + + if (get_sha1_hex(line, sha1)) { + fputs(line, stdout); fflush(stdout); + } else diff_tree_stdin(line); - + } return 0; }