From 9b715ad92609f9b4ad12fa76ac649954ccdd119a Mon Sep 17 00:00:00 2001 From: James Liu Date: Fri, 3 May 2024 17:17:04 +1000 Subject: [PATCH 1/4] doc: clean up usage documentation for --no-* opts We'll be adding another option to the --no-* class of options soon. Clean up the existing options by grouping them together in the OPTIONS section, and adding missing ones to the SYNOPSIS. Signed-off-by: James Liu Signed-off-by: Junio C Hamano --- Documentation/git.txt | 14 +++++++------- git.c | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Documentation/git.txt b/Documentation/git.txt index 7a1b112a3e..7fa75350b2 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -11,9 +11,9 @@ SYNOPSIS [verse] 'git' [-v | --version] [-h | --help] [-C ] [-c =] [--exec-path[=]] [--html-path] [--man-path] [--info-path] - [-p|--paginate|-P|--no-pager] [--no-replace-objects] [--bare] - [--git-dir=] [--work-tree=] [--namespace=] - [--config-env==] [] + [-p|--paginate|-P|--no-pager] [--no-replace-objects] [--no-lazy-fetch] + [--no-optional-locks] [--bare] [--git-dir=] [--work-tree=] + [--namespace=] [--config-env==] [] DESCRIPTION ----------- @@ -186,6 +186,10 @@ If you just want to run git as if it was started in `` then use This is equivalent to setting the `GIT_NO_LAZY_FETCH` environment variable to `1`. +--no-optional-locks:: + Do not perform optional operations that require locks. This is + equivalent to setting the `GIT_OPTIONAL_LOCKS` to `0`. + --literal-pathspecs:: Treat pathspecs literally (i.e. no globbing, no pathspec magic). This is equivalent to setting the `GIT_LITERAL_PATHSPECS` environment @@ -207,10 +211,6 @@ If you just want to run git as if it was started in `` then use Add "icase" magic to all pathspec. This is equivalent to setting the `GIT_ICASE_PATHSPECS` environment variable to `1`. ---no-optional-locks:: - Do not perform optional operations that require locks. This is - equivalent to setting the `GIT_OPTIONAL_LOCKS` to `0`. - --list-cmds=[,...]:: List commands by group. This is an internal/experimental option and may change or be removed in the future. Supported diff --git a/git.c b/git.c index 654d615a18..7654571b75 100644 --- a/git.c +++ b/git.c @@ -36,9 +36,9 @@ struct cmd_struct { const char git_usage_string[] = N_("git [-v | --version] [-h | --help] [-C ] [-c =]\n" " [--exec-path[=]] [--html-path] [--man-path] [--info-path]\n" - " [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]\n" - " [--git-dir=] [--work-tree=] [--namespace=]\n" - " [--config-env==] []"); + " [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch]\n" + " [--no-optional-locks] [--bare] [--git-dir=] [--work-tree=]\n" + " [--namespace=] [--config-env==] []"); const char git_more_info_string[] = N_("'git help -a' and 'git help -g' list available subcommands and some\n" From 5bd8811a734536186dd69ae767a9d58ce01ad7cb Mon Sep 17 00:00:00 2001 From: James Liu Date: Fri, 3 May 2024 17:17:05 +1000 Subject: [PATCH 2/4] doc: add spacing around paginate options Make the documentation page consistent with the usage string printed by "git help git" and consistent with the description of "[-v | --version]" option. Signed-off-by: James Liu Signed-off-by: Junio C Hamano --- Documentation/git.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/git.txt b/Documentation/git.txt index 7fa75350b2..d11d3d0c86 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -11,7 +11,7 @@ SYNOPSIS [verse] 'git' [-v | --version] [-h | --help] [-C ] [-c =] [--exec-path[=]] [--html-path] [--man-path] [--info-path] - [-p|--paginate|-P|--no-pager] [--no-replace-objects] [--no-lazy-fetch] + [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch] [--no-optional-locks] [--bare] [--git-dir=] [--work-tree=] [--namespace=] [--config-env==] [] From b79deeb55444f9e01a3f6335d7e0507e23e90190 Mon Sep 17 00:00:00 2001 From: James Liu Date: Fri, 3 May 2024 17:17:06 +1000 Subject: [PATCH 3/4] advice: add --no-advice global option Advice hints must be disabled individually by setting the relevant advice.* variables to false in the Git configuration. For server-side and scripted usages of Git where hints can be a hindrance, it can be cumbersome to maintain configuration to ensure all advice hints are disabled in perpetuity. This is a particular concern in tests, where new or changed hints can result in failed assertions. Add a --no-advice global option to disable all advice hints from being displayed. This is independent of the toggles for individual advice hints. Use an internal environment variable (GIT_ADVICE) to ensure this configuration is propagated to the usage site, even if it executes in a subprocess. Signed-off-by: James Liu Signed-off-by: Junio C Hamano --- Documentation/git.txt | 8 +++-- advice.c | 7 +++++ environment.h | 7 +++++ git.c | 9 ++++-- t/t0018-advice.sh | 68 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 4 deletions(-) diff --git a/Documentation/git.txt b/Documentation/git.txt index d11d3d0c86..a0c07f1db8 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -12,8 +12,9 @@ SYNOPSIS 'git' [-v | --version] [-h | --help] [-C ] [-c =] [--exec-path[=]] [--html-path] [--man-path] [--info-path] [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch] - [--no-optional-locks] [--bare] [--git-dir=] [--work-tree=] - [--namespace=] [--config-env==] [] + [--no-optional-locks] [--no-advice] [--bare] [--git-dir=] + [--work-tree=] [--namespace=] [--config-env==] + [] DESCRIPTION ----------- @@ -190,6 +191,9 @@ If you just want to run git as if it was started in `` then use Do not perform optional operations that require locks. This is equivalent to setting the `GIT_OPTIONAL_LOCKS` to `0`. +--no-advice:: + Disable all advice hints from being printed. + --literal-pathspecs:: Treat pathspecs literally (i.e. no globbing, no pathspec magic). This is equivalent to setting the `GIT_LITERAL_PATHSPECS` environment diff --git a/advice.c b/advice.c index 75111191ad..0a122c2020 100644 --- a/advice.c +++ b/advice.c @@ -2,6 +2,7 @@ #include "advice.h" #include "config.h" #include "color.h" +#include "environment.h" #include "gettext.h" #include "help.h" #include "string-list.h" @@ -127,6 +128,12 @@ void advise(const char *advice, ...) int advice_enabled(enum advice_type type) { int enabled = advice_setting[type].level != ADVICE_LEVEL_DISABLED; + static int globally_enabled = -1; + + if (globally_enabled < 0) + globally_enabled = git_env_bool(GIT_ADVICE_ENVIRONMENT, 1); + if (!globally_enabled) + return 0; if (type == ADVICE_PUSH_UPDATE_REJECTED) return enabled && diff --git a/environment.h b/environment.h index 05fd94d7be..0b2d457f07 100644 --- a/environment.h +++ b/environment.h @@ -57,6 +57,13 @@ const char *getenv_safe(struct strvec *argv, const char *name); #define GIT_TEXT_DOMAIN_DIR_ENVIRONMENT "GIT_TEXTDOMAINDIR" #define GIT_ATTR_SOURCE_ENVIRONMENT "GIT_ATTR_SOURCE" +/* + * Environment variable used to propagate the --no-advice global option to the + * advice_enabled() helper, even when run in a subprocess. + * This is an internal variable that should not be set by the user. + */ +#define GIT_ADVICE_ENVIRONMENT "GIT_ADVICE" + /* * Environment variable used in handshaking the wire protocol. * Contains a colon ':' separated list of keys with optional values diff --git a/git.c b/git.c index 7654571b75..637c61ca9c 100644 --- a/git.c +++ b/git.c @@ -37,8 +37,9 @@ const char git_usage_string[] = N_("git [-v | --version] [-h | --help] [-C ] [-c =]\n" " [--exec-path[=]] [--html-path] [--man-path] [--info-path]\n" " [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--no-lazy-fetch]\n" - " [--no-optional-locks] [--bare] [--git-dir=] [--work-tree=]\n" - " [--namespace=] [--config-env==] []"); + " [--no-optional-locks] [--no-advice] [--bare] [--git-dir=]\n" + " [--work-tree=] [--namespace=] [--config-env==]\n" + " []"); const char git_more_info_string[] = N_("'git help -a' and 'git help -g' list available subcommands and some\n" @@ -337,6 +338,10 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) setenv(GIT_ATTR_SOURCE_ENVIRONMENT, cmd, 1); if (envchanged) *envchanged = 1; + } else if (!strcmp(cmd, "--no-advice")) { + setenv(GIT_ADVICE_ENVIRONMENT, "0", 1); + if (envchanged) + *envchanged = 1; } else { fprintf(stderr, _("unknown option: %s\n"), cmd); usage(git_usage_string); diff --git a/t/t0018-advice.sh b/t/t0018-advice.sh index 0dcfb760a2..b02448ea16 100755 --- a/t/t0018-advice.sh +++ b/t/t0018-advice.sh @@ -29,4 +29,72 @@ test_expect_success 'advice should not be printed when config variable is set to test_must_be_empty actual ' +test_expect_success 'advice should not be printed when --no-advice is used' ' + q_to_tab >expect <<-\EOF && +On branch master + +No commits yet + +Untracked files: +QREADME + +nothing added to commit but untracked files present +EOF + + test_when_finished "rm -fr advice-test" && + git init advice-test && + ( + cd advice-test && + >README && + git --no-advice status + ) >actual && + test_cmp expect actual +' + +test_expect_success 'advice should not be printed when GIT_ADVICE is set to false' ' + q_to_tab >expect <<-\EOF && +On branch master + +No commits yet + +Untracked files: +QREADME + +nothing added to commit but untracked files present +EOF + + test_when_finished "rm -fr advice-test" && + git init advice-test && + ( + cd advice-test && + >README && + GIT_ADVICE=false git status + ) >actual && + test_cmp expect actual +' + +test_expect_success 'advice should be printed when GIT_ADVICE is set to true' ' + q_to_tab >expect <<-\EOF && +On branch master + +No commits yet + +Untracked files: + (use "git add ..." to include in what will be committed) +QREADME + +nothing added to commit but untracked files present (use "git add" to track) +EOF + + test_when_finished "rm -fr advice-test" && + git init advice-test && + ( + cd advice-test && + >README && + GIT_ADVICE=true git status + ) >actual && + cat actual > /tmp/actual && + test_cmp expect actual +' + test_done From cbdc83f1514963f86e8f027f9e75cde7f757c2a8 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 7 May 2024 17:40:51 -0700 Subject: [PATCH 4/4] t0018: two small fixes Even though the three tests that were recently added started their here-doc with "<<-\EOF", it did not take advantage of that and instead wrote the here-doc payload abut to the left edge. Use a tabs to indent these lines. More importantly, because these all hardcode the expected output, which contains the current branch name, they break the CI job that uses 'main' as the default branch name. Use GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=trunk export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME between the test_description line and ". ./test-lib.sh" line to force the initial branch name to 'trunk' and expect it to show in the output. Signed-off-by: Junio C Hamano --- t/t0018-advice.sh | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/t/t0018-advice.sh b/t/t0018-advice.sh index b02448ea16..29306b367c 100755 --- a/t/t0018-advice.sh +++ b/t/t0018-advice.sh @@ -2,6 +2,9 @@ test_description='Test advise_if_enabled functionality' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=trunk +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + TEST_PASSES_SANITIZE_LEAK=true . ./test-lib.sh @@ -31,15 +34,15 @@ test_expect_success 'advice should not be printed when config variable is set to test_expect_success 'advice should not be printed when --no-advice is used' ' q_to_tab >expect <<-\EOF && -On branch master + On branch trunk -No commits yet + No commits yet -Untracked files: -QREADME + Untracked files: + QREADME -nothing added to commit but untracked files present -EOF + nothing added to commit but untracked files present + EOF test_when_finished "rm -fr advice-test" && git init advice-test && @@ -53,15 +56,15 @@ EOF test_expect_success 'advice should not be printed when GIT_ADVICE is set to false' ' q_to_tab >expect <<-\EOF && -On branch master + On branch trunk -No commits yet + No commits yet -Untracked files: -QREADME + Untracked files: + QREADME -nothing added to commit but untracked files present -EOF + nothing added to commit but untracked files present + EOF test_when_finished "rm -fr advice-test" && git init advice-test && @@ -75,16 +78,16 @@ EOF test_expect_success 'advice should be printed when GIT_ADVICE is set to true' ' q_to_tab >expect <<-\EOF && -On branch master + On branch trunk -No commits yet + No commits yet -Untracked files: - (use "git add ..." to include in what will be committed) -QREADME + Untracked files: + (use "git add ..." to include in what will be committed) + QREADME -nothing added to commit but untracked files present (use "git add" to track) -EOF + nothing added to commit but untracked files present (use "git add" to track) + EOF test_when_finished "rm -fr advice-test" && git init advice-test &&