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

[PATCH] checkout: make delayed checkout respect --quiet and --no-progress

From
Matheus Tavares <matheus.bernardino@usp.br>
Date
Aug 25, 2021, 18:15 UTC
Message-ID
<d1405b781915c085ac8a8965dadf3efbe1b0f6aa.1629915330.git.matheus.bernardino@usp.br>
In-Reply-To
<YF2b8LLhE0vjc7mg@coredump.intra.peff.net>

The 'Filtering contents...' progress report from delayed checkout is displayed even when checkout and clone are invoked with --quiet or --no-progress. Furthermore, it is displayed unconditionally, without first checking whether stdout is a tty. Let's fix these issues and also add some regression tests for the two code paths that currently use delayed checkout: unpack_trees.c:check_updates() and builtin/checkout.c:checkout_worktree().

Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---

The test section of the patch is a bit long because it checks all the verbosity options related to the progress report, and it also tests both the check_updates() and checkout_worktree() code paths. If that is overkill, I can remove some tests.

 builtin/checkout.c    |  2 +-
 entry.c               |  7 +++--
 entry.h               |  3 ++-
 t/t0021-conversion.sh | 63 +++++++++++++++++++++++++++++++++++++++++++
 unpack-trees.c        |  2 +-
 5 files changed, 72 insertions(+), 5 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index b5d477919a..b23bc149d1 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -404,7 +404,7 @@ static int checkout_worktree(const struct checkout_opts *opts,
 	mem_pool_discard(&ce_mem_pool, should_validate_cache_entries());
 	remove_marked_cache_entries(&the_index, 1);
 	remove_scheduled_dirs();
-	errs |= finish_delayed_checkout(&state, &nr_checkouts);
+	errs |= finish_delayed_checkout(&state, &nr_checkouts, opts->show_progress);
 
 	if (opts->count_checkout_paths) {
 		if (nr_unmerged)
diff --git a/entry.c b/entry.c
index 125fabdbd5..044e8ec92c 100644
--- a/entry.c
+++ b/entry.c
@@ -159,7 +159,8 @@ static int remove_available_paths(struct string_list_item *item, void *cb_data)
 	return !available;
 }
 
-int finish_delayed_checkout(struct checkout *state, int *nr_checkouts)
+int finish_delayed_checkout(struct checkout *state, int *nr_checkouts,
+			    int show_progress)
 {
 	int errs = 0;
 	unsigned delayed_object_count;
@@ -173,7 +174,9 @@ int finish_delayed_checkout(struct checkout *state, int *nr_checkouts)
 
 	dco->state = CE_RETRY;
 	delayed_object_count = dco->paths.nr;
-	progress = start_delayed_progress(_("Filtering content"), delayed_object_count);
+	progress = show_progress
+		? start_delayed_progress(_("Filtering content"), delayed_object_count)
+		: NULL;
 	while (dco->filters.nr > 0) {
 		for_each_string_list_item(filter, &dco->filters) {
 			struct string_list available_paths = STRING_LIST_INIT_NODUP;
diff --git a/entry.h b/entry.h
index b8c0e170dc..7c889e58fd 100644
--- a/entry.h
+++ b/entry.h
@@ -43,7 +43,8 @@ static inline int checkout_entry(struct cache_entry *ce,
 }
 
 void enable_delayed_checkout(struct checkout *state);
-int finish_delayed_checkout(struct checkout *state, int *nr_checkouts);
+int finish_delayed_checkout(struct checkout *state, int *nr_checkouts,
+			    int show_progress);
 
 /*
  * Unlink the last component and schedule the leading directories for
diff --git a/t/t0021-conversion.sh b/t/t0021-conversion.sh
index b5749f327d..be12b92f21 100755
--- a/t/t0021-conversion.sh
+++ b/t/t0021-conversion.sh
@@ -6,6 +6,7 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 
 . ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-terminal.sh
 
 TEST_ROOT="$PWD"
 PATH=$TEST_ROOT:$PATH
@@ -1061,4 +1062,66 @@ test_expect_success PERL,SYMLINKS,CASE_INSENSITIVE_FS \
 	)
 '
 
+test_expect_success PERL 'setup for progress tests' '
+	git init progress &&
+	(
+		cd progress &&
+		git config filter.delay.process "rot13-filter.pl delay-progress.log clean smudge delay" &&
+		git config filter.delay.required true &&
+
+		echo "*.a filter=delay" >.gitattributes &&
+		touch test-delay10.a &&
+		git add . &&
+		git commit -m files
+	)
+'
+
+for mode in pathspec branch
+do
+	case "$mode" in
+	pathspec) opt='.' ;;
+	branch) opt='-f HEAD' ;;
+	esac
+
+	test_expect_success PERL,TTY "delayed checkout shows progress by default only on tty ($mode checkout)" '
+		(
+			cd progress &&
+			rm -f *.a delay-progress.log &&
+			test_terminal env GIT_PROGRESS_DELAY=0 git checkout $opt 2>err &&
+			grep "IN: smudge test-delay10.a .* \\[DELAYED\\]" delay-progress.log &&
+			grep "Filtering content" err &&
+
+			rm -f *.a delay-progress.log &&
+			GIT_PROGRESS_DELAY=0 git checkout $opt 2>err &&
+			grep "IN: smudge test-delay10.a .* \\[DELAYED\\]" delay-progress.log &&
+			! grep "Filtering content" err
+		)
+	'
+
+	test_expect_success PERL,TTY "delayed checkout ommits progress with --quiet ($mode checkout)" '
+		(
+			cd progress &&
+			rm -f *.a delay-progress.log &&
+			test_terminal env GIT_PROGRESS_DELAY=0 git checkout --quiet $opt 2>err &&
+			grep "IN: smudge test-delay10.a .* \\[DELAYED\\]" delay-progress.log &&
+			! grep "Filtering content" err
+		)
+	'
+
+	test_expect_success PERL,TTY "delayed checkout honors --[no]-progress ($mode checkout)" '
+		(
+			cd progress &&
+			rm -f *.a delay-progress.log &&
+			test_terminal env GIT_PROGRESS_DELAY=0 git checkout --no-progress $opt 2>err &&
+			grep "IN: smudge test-delay10.a .* \\[DELAYED\\]" delay-progress.log &&
+			! grep "Filtering content" err &&
+
+			rm -f *.a delay-progress.log &&
+			test_terminal env GIT_PROGRESS_DELAY=0 git checkout --quiet --progress $opt 2>err &&
+			grep "IN: smudge test-delay10.a .* \\[DELAYED\\]" delay-progress.log &&
+			grep "Filtering content" err
+		)
+	'
+done
+
 test_done
diff --git a/unpack-trees.c b/unpack-trees.c
index 5786645f31..f07304f1b7 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -479,7 +479,7 @@ static int check_updates(struct unpack_trees_options *o,
 		errs |= run_parallel_checkout(&state, pc_workers, pc_threshold,
 					      progress, &cnt);
 	stop_progress(&progress);
-	errs |= finish_delayed_checkout(&state, NULL);
+	errs |= finish_delayed_checkout(&state, NULL, o->verbose_update);
 	git_attr_set_direction(GIT_ATTR_CHECKIN);
 
 	if (o->clone)
-- 
2.32.0
Previous: Jeff KingNext: Ævar Arnfjörð Bjarmason
Message 3 of 7 in “Bug report: 'filtering content' delayed progress message does not respect --quiet”
  1. Sean AllredMar 21, 2021
  2. Jeff KingMar 26, 2021
  3. checkout: make delayed checkout respect --quiet and --no-progressMatheus Tavares, Aug 25, 2021
  4. Ævar Arnfjörð BjarmasonAug 25, 2021
  5. Matheus Tavares BernardinoAug 26, 2021
  6. Jeff KingAug 27, 2021
  7. checkout: make delayed checkout respect --quiet and --no-progressMatheus Tavares, Aug 26, 2021

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.