git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Jeff King <peff@peff.net>
Date
Mar 24, 2011, 17:51 UTC
Message-ID
<20110324175124.GD30685@sigill.intra.peff.net>
In-Reply-To
<20110324174556.GA30661@sigill.intra.peff.net>

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@peff.net>
---
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
Previous: Jeff KingNext: Johannes Sixt
Message 21 of 24 in “builtin/diff.c: remove duplicated call to diff_result_code()”
  1. builtin/diff.c: remove duplicated call to diff_result_code()Junio C Hamano, Mar 22, 2011
  2. 1/3 diffcore-rename: refactor "too many candidates" logicJunio C Hamano, Mar 22, 2011
  3. 2/3 diffcore-rename: record filepair for rename srcJunio C Hamano, Mar 22, 2011
  4. 3/3 diffcore-rename: fall back to -C when -C -C busts the rename limitJunio C Hamano, Mar 22, 2011
  5. Jeff KingMar 23, 2011
  6. Junio C HamanoMar 23, 2011
  7. Jeff KingMar 23, 2011
  8. Jeff KingMar 23, 2011
  9. 1/3 pager: save the original stderr when redirecting to pagerJeff King, Mar 23, 2011
  10. 2/3 progress: use pager's original_stderr if availableJeff King, Mar 23, 2011
  11. 3/3 show: turn on rename progressJeff King, Mar 23, 2011
  12. Junio C HamanoMar 23, 2011
  13. Jeff KingMar 24, 2011
  14. Junio C HamanoMar 24, 2011
  15. Jeff KingMar 24, 2011
  16. 1/4 pager: save the original stderr when redirecting to pagerJeff King, Mar 24, 2011
  17. 2/4 progress: use pager's original_stderr if availableJeff King, Mar 24, 2011
  18. 3/4 show: turn on rename detection progress reportingJeff King, Mar 24, 2011
  19. Junio C HamanoMar 24, 2011
  20. Jeff KingMar 25, 2011
  21. 4/4 diff: turn on rename detection progress reportingJeff King, Mar 24, 2011
  22. Johannes SixtMar 25, 2011
  23. Jeff KingMar 25, 2011
  24. Junio C HamanoMar 24, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.