Re: [PATCH v2 1/1] advice: add --no-advice global option
- From
Jeff King <peff@peff.net>
- Date
- Apr 29, 2024, 06:40 UTC
- Message-ID
- <20240429064025.GA2905826@coredump.intra.peff.net>
- In-Reply-To
- <D0WCCOLSMM9K.24BIGLR6EEJI8@jamesliu.io>
On Mon, Apr 29, 2024 at 03:01:55PM +1000, James Liu wrote:
Show 22 quoted lines
> > > int advice_enabled(enum advice_type type)
> > > {
> > > - int enabled = advice_setting[type].level != ADVICE_LEVEL_DISABLED;
> > > + int enabled;
> > > +
> > > + if (getenv(GIT_NO_ADVICE))
> > > + return 0;
> >
> > Huh, I was under impression that having an environment
> > variable to control this behavior was frowned upon by
> > Junio? [1] To me, supporting such a variable would be
> > a somewhat acceptable risk, [2] but of course it's the
> > maintainer's opinion that matters most.
> >
> > [1] https://lore.kernel.org/git/xmqqfrva3k9j.fsf@gitster.g/
> > [2]
> > https://lore.kernel.org/git/462de4ec1fb1896fa7f26b3515deca57@manjaro.org/
>
> You're correct. I saw this pattern for a few of the other global CLI
> options and followed it. I'm unsure what the best alternative for
> passing this configuration down to the `advice_enabled()` function is.
> I'd appreciate some guidance here.You need an environment variable if you want the command-line option to work consistently across commands that spawn external processes. E.g.:
git --no-advice fetch --all
is going to spawn fetch sub-processes under the hood. You'd want them to respect --no-advice, too, so we either have to propagate the command-line option or use the environment. And when you consider an external script like git-foo that runs a bunch of underlying Git commands, then propagating becomes too cumbersome and error-prone.
You should use git_env_bool() to avoid the confusing behavior that GIT_NO_ADVICE=false still turns off advice. ;)
You can also drop the "NO", which helps avoid awkward double negation. For example, if you do:
if (git_env_bool("GIT_ADVICE", 1))
return 0;then leaving that variable unset will act as if it is set to "1", but you can still do GIT_ADVICE=0 to suppress it.
There are some older variables (e.g., GIT_NO_REPLACE_OBJECTS) that made this mistake and we are stuck with, but I think we should avoid it for newer ones.
-Peff