[PATCH 4/4] diff: turn on rename detection progress reporting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]