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

Re: [PATCH v3] advice: use global config for default branch name

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 9, 2026, 20:50 UTC
Message-ID
<xmqqse3ip2s5.fsf@gitster.g>
In-Reply-To
<20270829004959.90983-1-ub4nal@mail.ru>
Vsevolod Myalitsin <ub4nal@mail.ru> writes:
Show 10 quoted lines
> Some advice messages suggest disabling the advice with
> "git config set advice.<name> false", even when the
> corresponding configuration should be set at a different scope.
>
> Add a scope hint to advice settings so that the suggested
> command uses the appropriate config scope.
>
> Pass the advice setting itself to vadvise() instead of passing
> its fields separately. Use NULL for advise() calls that are not
> associated with an advice setting.

"""Use this new mechanism to suggest setting advice.defaultBranchName in per-user configuration, not in per-repository configuration, as it is way too late once a repository is initialized.""" or something along that line is missing here.

Show 12 quoted lines
> +enum advice_scope {
> +	ADVICE_SCOPE_LOCAL = 0,
> +	ADVICE_SCOPE_GLOBAL,
> +	ADVICE_SCOPE_SYSTEM,
> +};
> +
> +struct advice_setting {
>  	const char *key;
> +	enum advice_scope scope_hint;
>  	enum advice_level level;
> -} advice_setting[] = {
> +};
Looking good.
Show 44 quoted lines
> +static struct advice_setting advice_setting[] = {
>  	[ADVICE_ADD_EMBEDDED_REPO]			= { "addEmbeddedRepo" },
>  	[ADVICE_ADD_EMPTY_PATHSPEC]			= { "addEmptyPathspec" },
>  	[ADVICE_ADD_IGNORED_FILE]			= { "addIgnoredFile" },
> @@ -51,7 +60,7 @@ static struct {
>  	[ADVICE_AM_WORK_DIR] 				= { "amWorkDir" },
>  	[ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME] 	= { "checkoutAmbiguousRemoteBranchName" },
>  	[ADVICE_COMMIT_BEFORE_MERGE]			= { "commitBeforeMerge" },
> -	[ADVICE_DEFAULT_BRANCH_NAME]			= { "defaultBranchName" },
> +	[ADVICE_DEFAULT_BRANCH_NAME]			= { "defaultBranchName", ADVICE_SCOPE_GLOBAL },
>  	[ADVICE_DETACHED_HEAD]				= { "detachedHead" },
>  	[ADVICE_DIVERGING]				= { "diverging" },
>  	[ADVICE_FETCH_SET_HEAD_WARN]			= { "fetchRemoteHEADWarn" },
> @@ -96,18 +105,31 @@ static struct {
>  
>  static const char turn_off_instructions[] =
>  N_("\n"
> -   "Disable this message with \"git config set advice.%s false\"");
> +   "Disable this message with \"git config set%s advice.%s false\"");
>  
> -static void vadvise(const char *advice, int display_instructions,
> -		    const char *key, va_list params)
> +static void vadvise(const char *advice,
> +	const struct advice_setting *setting, va_list params)
>  {
>  	struct strbuf buf = STRBUF_INIT;
>  	const char *cp, *np;
>  
>  	strbuf_vaddf(&buf, advice, params);
>  
> -	if (display_instructions)
> -		strbuf_addf(&buf, turn_off_instructions, key);
> +	if (setting && setting->level == 0) {
> +		const char *scope = "";
> +		switch (setting->scope_hint) {
> +			case ADVICE_SCOPE_LOCAL:
> +				break;
> +			case ADVICE_SCOPE_GLOBAL:
> +				scope = " --global";
> +				break;
> +			case ADVICE_SCOPE_SYSTEM:
> +				scope = " --system";
> +				break;
> +		}

Style. In our codebase, switch and case are indented to the same tabstop.

Show 24 quoted lines
> +		strbuf_addf(&buf, turn_off_instructions,
> +				scope, setting->key);
> +	}
>  
>  	for (cp = buf.buf; *cp; cp = np) {
>  		np = strchrnul(cp, '\n');
> @@ -126,7 +148,7 @@ void advise(const char *advice, ...)
>  {
>  	va_list params;
>  	va_start(params, advice);
> -	vadvise(advice, 0, "", params);
> +	vadvise(advice, NULL, params);
>  	va_end(params);
>  }
>  
> @@ -155,8 +177,7 @@ void advise_if_enabled(enum advice_type type, const char *advice, ...)
>  		return;
>  
>  	va_start(params, advice);
> -	vadvise(advice, !advice_setting[type].level, advice_setting[type].key,
> -		params);
> +	vadvise(advice, &advice_setting[type], params);
>  	va_end(params);
>  }

The change to narrow the interface into vadvise() needs to be described in the proposed log message.

Ideally, this would be a three-patch series. API change to vadvise() would come first, and then the introduction of advice scope mechanism, and finally making defaultBranchName a global scope variable.

Other than that, the end shape looks good to me.
Thanks.
Previous: Vsevolod MyalitsinNext: Vsevolod Myalitsin
Message 7 of 30 in “advice: use global config for default branch name”
  1. advice: use global config for default branch nameVsevolod Myalitsin, Aug 29, 2027
  2. Jeff KingSep 9, 2026
  3. Junio C HamanoSep 9, 2026
  4. Vsevolod MyalitsinSep 9, 2026
  5. Jeff KingSep 9, 2026
  6. Vsevolod MyalitsinSep 10, 2026
  7. Junio C HamanoSep 9, 2026
  8. Vsevolod MyalitsinSep 9, 2026
  9. Junio C HamanoSep 9, 2026
  10. 0/3 defaultBranchName advice is uselessVsevolod Myalitsin, Sep 10, 2026
  11. 2/3 advice: introduce advice scoping mechanismVsevolod Myalitsin, Sep 10, 2026
  12. Junio C HamanoSep 10, 2026
  13. Jeff KingSep 10, 2026
  14. Vsevolod MyalitsinSep 10, 2026
  15. Jeff KingSep 10, 2026
  16. Junio C HamanoSep 10, 2026
  17. Jeff KingSep 10, 2026
  18. Junio C HamanoSep 10, 2026
  19. Jeff KingSep 10, 2026
  20. Junio C HamanoSep 10, 2026
  21. Vsevolod MyalitsinSep 12, 2026
  22. Junio C HamanoSep 13, 2026
  23. Jeff KingSep 14, 2026
  24. Junio C HamanoSep 14, 2026
  25. Junio C HamanoSep 14, 2026
  26. Vsevolod MyalitsinSep 17, 2026
  27. Jeff KingSep 17, 2026
  28. 3/3 advice: use global config for default branch nameVsevolod Myalitsin, Sep 10, 2026
  29. 1/3 advice: pass the entire advice_setting to vadvise()Vsevolod Myalitsin, Sep 10, 2026
  30. SZEDER GáborSep 10, 2026

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.