Since all of the progress happens before we generate any output, this looks OK, even when output goes to a pager. We do the usual --progress/--no-progress options and check isatty(2) to enable the feature. The argument parsing is a little ad-hoc, but we currently have no parse-options infrastructure here at all. However, it should be safe to parse like this, because the prior call to setup_revisions will have removed any options that take an argument, and our parsing removes --progress from argv for later parsers. The one exception is diff_no_index, which may get called early, and needs to learn to ignore --progress. Signed-off-by: Jeff King <peff@xxxxxxxx> --- New since the last iteration. I'm not happy about the option parsing, but converting the whole of "git diff" to a saner parsing structure is more than I want to take on for this series. One thing that would make it easier is if the diff parser understood --progress and stored the result for the caller to check. I was tempted to do that because the code ends up cleaner, but it feels wrong. Documentation/git-diff.txt | 7 +++++++ builtin/diff.c | 28 ++++++++++++++++++++++++++++ diff-no-index.c | 2 ++ 3 files changed, 37 insertions(+), 0 deletions(-) diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.txt index f8d0819..dbebc93 100644 --- a/Documentation/git-diff.txt +++ b/Documentation/git-diff.txt @@ -87,6 +87,13 @@ OPTIONS :git-diff: 1 include::diff-options.txt[] +--no-progress:: +--progress:: + Disable or enable progress reporting during long computations; + the default is to enable progress reporting when stderr is a + terminal. Currently the only computation with progress support + is inexact rename detection. + <path>...:: The <paths> parameters, when given, are used to limit the diff to the named paths (you can give directory diff --git a/builtin/diff.c b/builtin/diff.c index 4c9deb2..82ecc1d 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -255,6 +255,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix) struct blobinfo blob[2]; int nongit; int result = 0; + int progress = -1; + int unknown_argc, parsed_argc; /* * We could get N tree-ish in the rev.pending_objects list. @@ -307,6 +309,32 @@ int cmd_diff(int argc, const char **argv, const char *prefix) die("diff_setup_done failed"); } + parsed_argc = 0; + for (unknown_argc = i = 1; i < argc; i++) { + const char *arg = argv[i]; + if (!strcmp(arg, "--") || arg[0] != '-') { + int j; + for (j = i; j < argc; j++) + argv[unknown_argc++] = argv[j]; + break; + } + else if (!strcmp(argv[i], "--progress")) + progress = 1; + else if (!strcmp(argv[i], "--no-progress")) + progress = 0; + else { + argv[unknown_argc++] = argv[i]; + continue; + } + parsed_argc++; + } + argc -= parsed_argc; + + if (progress == -1) + progress = isatty(2); + if (progress) + rev.diffopt.show_rename_progress = 1; + DIFF_OPT_SET(&rev.diffopt, RECURSIVE); /* diff --git a/diff-no-index.c b/diff-no-index.c index 3a36144..42cb413 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -212,6 +212,8 @@ void diff_no_index(struct rev_info *revs, options |= DIFF_SILENT_ON_REMOVED; i++; } + else if (!strcmp(argv[i], "--progress")) + ; /* handled elsewhere */ else if (!strcmp(argv[i], "--")) i++; else { -- 1.7.4.41.g423da -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html