From: Jeff King <peff@peff.net>
To: Vsevolod Myalitsin <ub4nal@mail.ru>
Cc: git@vger.kernel.org, gitster@pobox.me, ben.knoble@gmail.org
Subject: Re: [PATCH v3] advice: use global config for default branch name
Date: Wed, 9 Sep 2026 16:27:18 -0400 [thread overview]
Message-ID: <20260909202718.GA183838@coredump.intra.peff.net> (raw)
In-Reply-To: <20270829004959.90983-1-ub4nal@mail.ru>
On Sun, Aug 29, 2027 at 03:49:58AM +0300, Vsevolod Myalitsin wrote:
> 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.
Thanks, this looks OK to me. A few small nits/observations:
> @@ -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\"");
Translators will need to update their message translations, and I wonder
if seeing this "set%s" in isolation might be confusing. Probably it
should be obvious that they should leave everything within the
double-quotes alone. But the alternative is adding a comment with
"TRANSLATORS" in it, I think.
See below, also.
> - if (display_instructions)
> - strbuf_addf(&buf, turn_off_instructions, key);
> + if (setting && setting->level == 0) {
I left this comparison as something like "!setting->level" in my earlier
suggestion, which I think would be OK. But really it is an enum, and if
we are going to use "==" we should probably spell out the whole name
rather than 0, like:
if (setting && setting->level == ADVICE_LEVEL_NONE)
> + 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;
> + }
I had somehow hoped we could reuse the existing CONFIG_SCOPE enum
without having to redeclare it ourselves. But there are a lot more
scopes than these three! On the other hand, I think it would be possible
to use config_scope_name() to convert them into options.
That makes the translation more lego-like, but maybe it would actually
make it easier to understand, because we could pull the whole command
out into a single placeholder. Like:
diff --git a/advice.c b/advice.c
index cbb0f2f428..789f01c7e1 100644
--- a/advice.c
+++ b/advice.c
@@ -40,15 +40,9 @@ enum advice_level {
ADVICE_LEVEL_ENABLED,
};
-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 config_scope scope_hint;
enum advice_level level;
};
@@ -60,7 +54,7 @@ static struct advice_setting advice_setting[] = {
[ADVICE_AM_WORK_DIR] = { "amWorkDir" },
[ADVICE_CHECKOUT_AMBIGUOUS_REMOTE_BRANCH_NAME] = { "checkoutAmbiguousRemoteBranchName" },
[ADVICE_COMMIT_BEFORE_MERGE] = { "commitBeforeMerge" },
- [ADVICE_DEFAULT_BRANCH_NAME] = { "defaultBranchName", ADVICE_SCOPE_GLOBAL },
+ [ADVICE_DEFAULT_BRANCH_NAME] = { "defaultBranchName", CONFIG_SCOPE_GLOBAL },
[ADVICE_DETACHED_HEAD] = { "detachedHead" },
[ADVICE_DIVERGING] = { "diverging" },
[ADVICE_FETCH_SET_HEAD_WARN] = { "fetchRemoteHEADWarn" },
@@ -105,7 +99,7 @@ static struct advice_setting advice_setting[] = {
static const char turn_off_instructions[] =
N_("\n"
- "Disable this message with \"git config set%s advice.%s false\"");
+ "Disable this message with \"%s");
static void vadvise(const char *advice,
const struct advice_setting *setting, va_list params)
@@ -116,19 +110,16 @@ static void vadvise(const char *advice,
strbuf_vaddf(&buf, advice, params);
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;
- }
- strbuf_addf(&buf, turn_off_instructions,
- scope, setting->key);
+ struct strbuf cmd = STRBUF_INIT;
+
+ strbuf_addstr(&cmd, "git config set");
+ if (setting->scope_hint &&
+ setting->scope_hint != CONFIG_SCOPE_LOCAL)
+ strbuf_addf(&cmd, " --%s",
+ config_scope_name(setting->scope_hint));
+ strbuf_addf(&cmd, "advice.%s false", setting->key);
+ strbuf_addf(&buf, turn_off_instructions, cmd.buf);
+ strbuf_release(&cmd);
}
for (cp = buf.buf; *cp; cp = np) {
Having typed that, I'm not sure if it is more or less confusing. It does
avoid replicating the CONFIG_SCOPE enum. There is some lego-string
construction, but it is all within the code and for the non-translated
command. It would obviously be nonsense with CONFIG_SCOPE_FILE, but
there is no reason to think we'd ever pass that.
So I dunno. I could take or leave it as a further cleanup.
-Peff
next prev parent reply other threads:[~2026-09-09 20:27 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2027-08-29 0:49 [PATCH v3] advice: use global config for default branch name Vsevolod Myalitsin
2026-09-09 20:27 ` Jeff King [this message]
2026-09-09 21:21 ` Junio C Hamano
2026-09-09 21:22 ` Vsevolod Myalitsin
2026-09-09 22:46 ` Jeff King
2026-09-10 4:43 ` Vsevolod Myalitsin
2026-09-09 20:50 ` Junio C Hamano
2026-09-09 21:30 ` Vsevolod Myalitsin
2026-09-09 22:31 ` Junio C Hamano
2026-09-10 8:53 ` [PATCH v4 0/3] defaultBranchName advice is useless Vsevolod Myalitsin
2026-09-10 8:53 ` [PATCH v4 1/3] advice: pass the entire advice_setting to vadvise() Vsevolod Myalitsin
2026-09-10 17:43 ` SZEDER Gábor
2026-09-10 8:53 ` [PATCH v4 2/3] advice: introduce advice scoping mechanism Vsevolod Myalitsin
2026-09-10 15:36 ` Junio C Hamano
2026-09-10 15:52 ` Jeff King
2026-09-10 17:54 ` Vsevolod Myalitsin
2026-09-10 19:05 ` Jeff King
2026-09-10 18:35 ` Junio C Hamano
2026-09-10 19:03 ` Jeff King
2026-09-10 19:54 ` Junio C Hamano
2026-09-10 20:11 ` Jeff King
2026-09-10 20:25 ` Junio C Hamano
2026-09-12 8:12 ` Vsevolod Myalitsin
2026-09-13 16:32 ` Junio C Hamano
2026-09-10 8:53 ` [PATCH v4 3/3] advice: use global config for default branch name Vsevolod Myalitsin
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=20260909202718.GA183838@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=ben.knoble@gmail.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.me \
--cc=ub4nal@mail.ru \
/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