git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
	Derrick Stolee <derrickstolee@github.com>,
	Johannes Schindelin <johannes.schindelin@gmx.de>,
	Victoria Dye <vdye@github.com>, Taylor Blau <me@ttaylorr.com>,
	ZheNing Hu <adlternative@gmail.com>,
	ZheNing Hu <adlternative@gmail.com>
Subject: [PATCH v2] scalar: show progress if stderr refer to a terminal
Date: Sun, 25 Dec 2022 13:29:46 +0000	[thread overview]
Message-ID: <pull.1441.v2.git.1671974986363.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1441.git.1670436656379.gitgitgadget@gmail.com>

From: ZheNing Hu <adlternative@gmail.com>

Sometimes when users use scalar to download a monorepo
with a long commit history, they want to check the
progress bar to know how long they still need to wait
during the fetch process, but scalar suppresses this
output by default.

So let's check whether scalar stderr refer to a terminal,
if so, show progress, otherwise disable it.

Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
    scalar: show progress if stderr refer to a terminal
    
    When users use scalar to download a monorepo with a long commit history
    (or the client and server network communication is very poor), we often
    need to spend a long time in the fetch phase of scalar, some users may
    want to check this progress bar To understand the progress of fetch and
    how long they have to wait, so we should enable scalar to display fetch
    progress.
    
    v1. add [--verbose| -v] to scalar clone.
    
    v2.
    
     1. remove --verbose option.
     2. check if scalar stderr refer to terminal, if so, show progress.
    
    Note: output look like this:
    
    $ scalar clone git@github.com:git/git.git
    Initialized empty Git repository in /home/adl/test/git/src/.git/
    remote: Enumerating objects: 208997, done.
    remote: Counting objects: 100% (870/870), done.
    remote: Compressing objects: 100% (870/870), done.
    remote: Total 208991 (delta 0), reused 870 (delta 0), pack-reused 208121
    remote: Enumerating objects: 470, done.
    remote: Counting objects: 100% (418/418), done.
    remote: Compressing objects: 100% (418/418), done.
    remote: Total 470 (delta 1), reused 0 (delta 0), pack-reused 52
    Receiving objects: 100% (470/470), 1.96 MiB | 1.64 MiB/s, done.
    Resolving deltas: 100% (1/1), done.
    Updating files: 100% (471/471), done.
    branch 'master' set up to track 'origin/master'.
    Switched to a new branch 'master'
    Your branch is up to date with 'origin/master'.
    
    
    "new branch", "new tag" output is a bit annoying, it would be better to
    suppress them, but keep the progress.

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1441%2Fadlternative%2Fzh%2Fscalar-verbosity-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1441/adlternative/zh/scalar-verbosity-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1441

Range-diff vs v1:

 1:  6169841190a ! 1:  2e4c296bd19 scalar: use verbose mode in clone
     @@ Metadata
      Author: ZheNing Hu <adlternative@gmail.com>
      
       ## Commit message ##
     -    scalar: use verbose mode in clone
     +    scalar: show progress if stderr refer to a terminal
      
          Sometimes when users use scalar to download a monorepo
          with a long commit history, they want to check the
     @@ Commit message
          during the fetch process, but scalar suppresses this
          output by default.
      
     -    So add `[--verbose| -v]` to scalar clone, to enable
     -    fetch's output.
     +    So let's check whether scalar stderr refer to a terminal,
     +    if so, show progress, otherwise disable it.
      
          Signed-off-by: ZheNing Hu <adlternative@gmail.com>
      
     - ## Documentation/scalar.txt ##
     -@@ Documentation/scalar.txt: scalar - A tool for managing large Git repositories
     - SYNOPSIS
     - --------
     - [verse]
     --scalar clone [--single-branch] [--branch <main-branch>] [--full-clone] <url> [<enlistment>]
     -+scalar clone [--single-branch] [--branch <main-branch>] [--verbose | -v] [--full-clone] <url> [<enlistment>]
     - scalar list
     - scalar register [<enlistment>]
     - scalar unregister [<enlistment>]
     -@@ Documentation/scalar.txt: cloning. If the HEAD at the remote did not point at any branch when
     - 	A sparse-checkout is initialized by default. This behavior can be
     - 	turned off via `--full-clone`.
     - 
     -+-v::
     -+--verbose::
     -+	When scalar executes `git fetch`, `--quiet` is used by default to
     -+	suppress the output of fetch, use verbose mode for cancel this.
     -+
     - List
     - ~~~~
     - 
     -
       ## scalar.c ##
      @@ scalar.c: void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
       static int cmd_clone(int argc, const char **argv)
       {
       	const char *branch = NULL;
      -	int full_clone = 0, single_branch = 0;
     -+	int full_clone = 0, single_branch = 0, verbosity = 0;
     ++	int full_clone = 0, single_branch = 0, show_progress = isatty(2);
       	struct option clone_options[] = {
       		OPT_STRING('b', "branch", &branch, N_("<branch>"),
       			   N_("branch to checkout after clone")),
     -@@ scalar.c: static int cmd_clone(int argc, const char **argv)
     - 		OPT_BOOL(0, "single-branch", &single_branch,
     - 			 N_("only download metadata for the branch that will "
     - 			    "be checked out")),
     -+		OPT__VERBOSITY(&verbosity),
     - 		OPT_END(),
     - 	};
     - 	const char * const clone_usage[] = {
      @@ scalar.c: static int cmd_clone(int argc, const char **argv)
       	if (set_recommended_config(0))
       		return error(_("could not configure '%s'"), dir);
       
      -	if ((res = run_git("fetch", "--quiet", "origin", NULL))) {
     -+	if ((res = run_git("fetch", "origin",
     -+			   verbosity ? NULL : "--quiet",
     -+			   NULL))) {
     ++	if ((res = run_git("fetch", "--quiet",
     ++				show_progress ? "--progress" : "--no-progress",
     ++				"origin", NULL))) {
       		warning(_("partial clone failed; attempting full clone"));
       
       		if (set_config("remote.origin.promisor") ||
     @@ scalar.c: static int cmd_clone(int argc, const char **argv)
       		}
       
      -		if ((res = run_git("fetch", "--quiet", "origin", NULL)))
     -+		if ((res = run_git("fetch", "origin",
     -+				   verbosity ? NULL : "--quiet",
     -+				   NULL)))
     ++		if ((res = run_git("fetch", "--quiet",
     ++					show_progress ? "--progress" : "--no-progress",
     ++					"origin", NULL)))
       			goto cleanup;
       	}
       
     +
     + ## t/t9211-scalar-clone.sh ##
     +@@
     + test_description='test the `scalar clone` subcommand'
     + 
     + . ./test-lib.sh
     ++. "${TEST_DIRECTORY}/lib-terminal.sh"
     + 
     + GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt,launchctl:true,schtasks:true"
     + export GIT_TEST_MAINT_SCHEDULER
     +@@ t/t9211-scalar-clone.sh: test_expect_success '--no-single-branch clones all branches' '
     + 	cleanup_clone $enlistment
     + '
     + 
     ++test_expect_success TTY 'progress with tty' '
     ++	enlistment=progress1 &&
     ++
     ++	test_config -C to-clone uploadpack.allowfilter true &&
     ++	test_config -C to-clone uploadpack.allowanysha1inwant true &&
     ++
     ++	test_terminal env GIT_PROGRESS_DELAY=0 \
     ++		scalar clone "file://$(pwd)/to-clone" "$enlistment" 2>stderr &&
     ++	grep --count "Enumerating objects" stderr >actual &&
     ++	echo 2 >expected &&
     ++	test_cmp expected actual &&
     ++	cleanup_clone $enlistment
     ++'
     ++
     ++test_expect_success 'progress without tty' '
     ++	enlistment=progress2 &&
     ++
     ++	test_config -C to-clone uploadpack.allowfilter true &&
     ++	test_config -C to-clone uploadpack.allowanysha1inwant true &&
     ++
     ++	scalar clone "file://$(pwd)/to-clone" "$enlistment" 2>stderr &&
     ++	! grep "Enumerating objects" stderr &&
     ++	! grep "Updating files" stderr &&
     ++	cleanup_clone $enlistment
     ++'
     + test_done


 scalar.c                | 10 +++++++---
 t/t9211-scalar-clone.sh | 26 ++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/scalar.c b/scalar.c
index 6c52243cdf1..e5cc554c537 100644
--- a/scalar.c
+++ b/scalar.c
@@ -404,7 +404,7 @@ void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
 static int cmd_clone(int argc, const char **argv)
 {
 	const char *branch = NULL;
-	int full_clone = 0, single_branch = 0;
+	int full_clone = 0, single_branch = 0, show_progress = isatty(2);
 	struct option clone_options[] = {
 		OPT_STRING('b', "branch", &branch, N_("<branch>"),
 			   N_("branch to checkout after clone")),
@@ -499,7 +499,9 @@ static int cmd_clone(int argc, const char **argv)
 	if (set_recommended_config(0))
 		return error(_("could not configure '%s'"), dir);
 
-	if ((res = run_git("fetch", "--quiet", "origin", NULL))) {
+	if ((res = run_git("fetch", "--quiet",
+				show_progress ? "--progress" : "--no-progress",
+				"origin", NULL))) {
 		warning(_("partial clone failed; attempting full clone"));
 
 		if (set_config("remote.origin.promisor") ||
@@ -508,7 +510,9 @@ static int cmd_clone(int argc, const char **argv)
 			goto cleanup;
 		}
 
-		if ((res = run_git("fetch", "--quiet", "origin", NULL)))
+		if ((res = run_git("fetch", "--quiet",
+					show_progress ? "--progress" : "--no-progress",
+					"origin", NULL)))
 			goto cleanup;
 	}
 
diff --git a/t/t9211-scalar-clone.sh b/t/t9211-scalar-clone.sh
index dd33d87e9be..49f054d5917 100755
--- a/t/t9211-scalar-clone.sh
+++ b/t/t9211-scalar-clone.sh
@@ -3,6 +3,7 @@
 test_description='test the `scalar clone` subcommand'
 
 . ./test-lib.sh
+. "${TEST_DIRECTORY}/lib-terminal.sh"
 
 GIT_TEST_MAINT_SCHEDULER="crontab:test-tool crontab cron.txt,launchctl:true,schtasks:true"
 export GIT_TEST_MAINT_SCHEDULER
@@ -148,4 +149,29 @@ test_expect_success '--no-single-branch clones all branches' '
 	cleanup_clone $enlistment
 '
 
+test_expect_success TTY 'progress with tty' '
+	enlistment=progress1 &&
+
+	test_config -C to-clone uploadpack.allowfilter true &&
+	test_config -C to-clone uploadpack.allowanysha1inwant true &&
+
+	test_terminal env GIT_PROGRESS_DELAY=0 \
+		scalar clone "file://$(pwd)/to-clone" "$enlistment" 2>stderr &&
+	grep --count "Enumerating objects" stderr >actual &&
+	echo 2 >expected &&
+	test_cmp expected actual &&
+	cleanup_clone $enlistment
+'
+
+test_expect_success 'progress without tty' '
+	enlistment=progress2 &&
+
+	test_config -C to-clone uploadpack.allowfilter true &&
+	test_config -C to-clone uploadpack.allowanysha1inwant true &&
+
+	scalar clone "file://$(pwd)/to-clone" "$enlistment" 2>stderr &&
+	! grep "Enumerating objects" stderr &&
+	! grep "Updating files" stderr &&
+	cleanup_clone $enlistment
+'
 test_done

base-commit: 2e71cbbddd64695d43383c25c7a054ac4ff86882
-- 
gitgitgadget

  parent reply	other threads:[~2022-12-25 13:29 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-07 18:10 [PATCH] scalar: use verbose mode in clone ZheNing Hu via GitGitGadget
2022-12-07 22:10 ` Taylor Blau
2022-12-08 15:54   ` ZheNing Hu
2022-12-08 16:30 ` Derrick Stolee
2022-12-13 16:37   ` ZheNing Hu
2022-12-25 13:29 ` ZheNing Hu via GitGitGadget [this message]
2023-01-05 19:19   ` [PATCH v2] scalar: show progress if stderr refer to a terminal Derrick Stolee
2023-01-06 12:30     ` Junio C Hamano
2023-01-11 11:59     ` ZheNing Hu
2023-01-11 13:14   ` [PATCH v3] " ZheNing Hu via GitGitGadget
2023-01-11 14:55     ` Derrick Stolee
2023-01-13 19:52       ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=pull.1441.v2.git.1671974986363.gitgitgadget@gmail.com \
    --to=gitgitgadget@gmail.com \
    --cc=adlternative@gmail.com \
    --cc=derrickstolee@github.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=johannes.schindelin@gmx.de \
    --cc=me@ttaylorr.com \
    --cc=vdye@github.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).