config: add string mapping for enum config_scope
diff mbox series

Message ID 20191211220933.48678-1-emilyshaffer@google.com
State New
Headers show
Series
  • config: add string mapping for enum config_scope
Related show

Commit Message

Emily Shaffer Dec. 11, 2019, 10:09 p.m. UTC
If a user is interacting with their config files primarily by the 'git
config' command, using the location flags (--global, --system, etc) then
they may be more interested to see the scope of the config file they are
editing, rather than the filepath.

Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
---
Note: This commit has been cherry-picked out of the "configuration-based
hook management" topic, at
lore.kernel.org/git/20191210023335.49987-1-emilyshaffer@google.com

It turned out that I wanted to use it for git-bugreport as well - to
explain the origin of the configs we are printing in the bugreport,
without directly exposing the user's home directory path.

This seems to have similar work to https://github.com/gitgitgadget/git/pull/478
which I believe hasn't been mailed yet; but that change is targeted
towards the builtin config command, rather than the config library.
Since I wanted to use the library, I'm sending on my own now. Maybe
this commit will be useful to that change's author.

 - Emily

 config.c | 17 +++++++++++++++++
 config.h |  1 +
 2 files changed, 18 insertions(+)

Comments

Junio C Hamano Dec. 11, 2019, 10:19 p.m. UTC | #1
Emily Shaffer <emilyshaffer@google.com> writes:

> If a user is interacting with their config files primarily by the 'git
> config' command, using the location flags (--global, --system, etc) then
> they may be more interested to see the scope of the config file they are
> editing, rather than the filepath.
>
> Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
> ---
> Note: This commit has been cherry-picked out of the "configuration-based
> hook management" topic, at
> lore.kernel.org/git/20191210023335.49987-1-emilyshaffer@google.com
>
> It turned out that I wanted to use it for git-bugreport as well - to
> explain the origin of the configs we are printing in the bugreport,
> without directly exposing the user's home directory path.
>
> This seems to have similar work to https://github.com/gitgitgadget/git/pull/478
> which I believe hasn't been mailed yet; but that change is targeted
> towards the builtin config command, rather than the config library.
> Since I wanted to use the library, I'm sending on my own now. Maybe
> this commit will be useful to that change's author.

One thing I wondered about this in the original version was if the
returned value should be localized.  In the context of the original,
the --porcelain mode refused to give this information in its output,
so it was OK to always localize the returned value to satisify the
other caller who wanted end-user-facing output.

But as a more general helper, I am not sure if this is the most
useful way to implement it.  Shouldn't the function rather return
the machine-readable tokens and allow callers to localize it as
needed with its own _() around the returned value?  I dunno.
Emily Shaffer Dec. 11, 2019, 11:11 p.m. UTC | #2
On Wed, Dec 11, 2019 at 02:19:57PM -0800, Junio C Hamano wrote:
> Emily Shaffer <emilyshaffer@google.com> writes:
> 
> > If a user is interacting with their config files primarily by the 'git
> > config' command, using the location flags (--global, --system, etc) then
> > they may be more interested to see the scope of the config file they are
> > editing, rather than the filepath.
> >
> > Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
> > ---
> > Note: This commit has been cherry-picked out of the "configuration-based
> > hook management" topic, at
> > lore.kernel.org/git/20191210023335.49987-1-emilyshaffer@google.com
> >
> > It turned out that I wanted to use it for git-bugreport as well - to
> > explain the origin of the configs we are printing in the bugreport,
> > without directly exposing the user's home directory path.
> >
> > This seems to have similar work to https://github.com/gitgitgadget/git/pull/478
> > which I believe hasn't been mailed yet; but that change is targeted
> > towards the builtin config command, rather than the config library.
> > Since I wanted to use the library, I'm sending on my own now. Maybe
> > this commit will be useful to that change's author.
> 
> One thing I wondered about this in the original version was if the
> returned value should be localized.  In the context of the original,
> the --porcelain mode refused to give this information in its output,
> so it was OK to always localize the returned value to satisify the
> other caller who wanted end-user-facing output.
> 
> But as a more general helper, I am not sure if this is the most
> useful way to implement it.  Shouldn't the function rather return
> the machine-readable tokens and allow callers to localize it as
> needed with its own _() around the returned value?  I dunno.
> 
Hm. I think that's a good point, and allows this helper to be used for
something silly like putting together a sample invocation to 'git
config' if desired. It's meant to mirror the scope given to 'git config'
- which makes me think that no, it shouldn't be localized, since the
argument isn't localized either.

Ok, I'll take the locale marker off.

 - Emily
Matt Rogers Dec. 11, 2019, 11:14 p.m. UTC | #3
Another thing I also want to point out is that outside of this
function... when git config is called with the --local, etc. the
config scope is not actually CONFIG_SCOPE_LOCAL but
CONFIG_SCOPE_UNKNOWN.  This is because the config machinery pretty
much equates --local and --file=./.git/config as pretty much
equivalent (assuming ./.git is the actual repo directory location).
So just something to keep in mind.

On Wed, Dec 11, 2019 at 6:11 PM Emily Shaffer <emilyshaffer@google.com> wrote:
>
> On Wed, Dec 11, 2019 at 02:19:57PM -0800, Junio C Hamano wrote:
> > Emily Shaffer <emilyshaffer@google.com> writes:
> >
> > > If a user is interacting with their config files primarily by the 'git
> > > config' command, using the location flags (--global, --system, etc) then
> > > they may be more interested to see the scope of the config file they are
> > > editing, rather than the filepath.
> > >
> > > Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
> > > ---
> > > Note: This commit has been cherry-picked out of the "configuration-based
> > > hook management" topic, at
> > > lore.kernel.org/git/20191210023335.49987-1-emilyshaffer@google.com
> > >
> > > It turned out that I wanted to use it for git-bugreport as well - to
> > > explain the origin of the configs we are printing in the bugreport,
> > > without directly exposing the user's home directory path.
> > >
> > > This seems to have similar work to https://github.com/gitgitgadget/git/pull/478
> > > which I believe hasn't been mailed yet; but that change is targeted
> > > towards the builtin config command, rather than the config library.
> > > Since I wanted to use the library, I'm sending on my own now. Maybe
> > > this commit will be useful to that change's author.
> >
> > One thing I wondered about this in the original version was if the
> > returned value should be localized.  In the context of the original,
> > the --porcelain mode refused to give this information in its output,
> > so it was OK to always localize the returned value to satisify the
> > other caller who wanted end-user-facing output.
> >
> > But as a more general helper, I am not sure if this is the most
> > useful way to implement it.  Shouldn't the function rather return
> > the machine-readable tokens and allow callers to localize it as
> > needed with its own _() around the returned value?  I dunno.
> >
> Hm. I think that's a good point, and allows this helper to be used for
> something silly like putting together a sample invocation to 'git
> config' if desired. It's meant to mirror the scope given to 'git config'
> - which makes me think that no, it shouldn't be localized, since the
> argument isn't localized either.
>
> Ok, I'll take the locale marker off.
>
>  - Emily
Emily Shaffer Dec. 11, 2019, 11:25 p.m. UTC | #4
On Wed, Dec 11, 2019 at 03:11:46PM -0800, Emily Shaffer wrote:
> On Wed, Dec 11, 2019 at 02:19:57PM -0800, Junio C Hamano wrote:
> > Emily Shaffer <emilyshaffer@google.com> writes:
> > 
> > > If a user is interacting with their config files primarily by the 'git
> > > config' command, using the location flags (--global, --system, etc) then
> > > they may be more interested to see the scope of the config file they are
> > > editing, rather than the filepath.
> > >
> > > Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
> > > ---
> > > Note: This commit has been cherry-picked out of the "configuration-based
> > > hook management" topic, at
> > > lore.kernel.org/git/20191210023335.49987-1-emilyshaffer@google.com
> > >
> > > It turned out that I wanted to use it for git-bugreport as well - to
> > > explain the origin of the configs we are printing in the bugreport,
> > > without directly exposing the user's home directory path.
> > >
> > > This seems to have similar work to https://github.com/gitgitgadget/git/pull/478
> > > which I believe hasn't been mailed yet; but that change is targeted
> > > towards the builtin config command, rather than the config library.
> > > Since I wanted to use the library, I'm sending on my own now. Maybe
> > > this commit will be useful to that change's author.
> > 
> > One thing I wondered about this in the original version was if the
> > returned value should be localized.  In the context of the original,
> > the --porcelain mode refused to give this information in its output,
> > so it was OK to always localize the returned value to satisify the
> > other caller who wanted end-user-facing output.
> > 
> > But as a more general helper, I am not sure if this is the most
> > useful way to implement it.  Shouldn't the function rather return
> > the machine-readable tokens and allow callers to localize it as
> > needed with its own _() around the returned value?  I dunno.
> > 
> Hm. I think that's a good point, and allows this helper to be used for
> something silly like putting together a sample invocation to 'git
> config' if desired. It's meant to mirror the scope given to 'git config'
> - which makes me think that no, it shouldn't be localized, since the
> argument isn't localized either.

Huh. One interesting piece is that the code talks about .git/config as
"repo" config, whereas 'git-config' talks about "--local". Does it make
sense to teach this enum stringifier that CONFIG_SCOPE_REPO means
"local"? I think CONFIG_SCOPE_REPO is used for "--worktree" too, so
perhaps it's better to let "repo" mean "local or worktree".

> 
> Ok, I'll take the locale marker off.
> 
>  - Emily
Emily Shaffer Dec. 11, 2019, 11:27 p.m. UTC | #5
On Wed, Dec 11, 2019 at 06:14:44PM -0500, Matt Rogers wrote:
> Another thing I also want to point out is that outside of this
> function... when git config is called with the --local, etc. the
> config scope is not actually CONFIG_SCOPE_LOCAL but
> CONFIG_SCOPE_UNKNOWN.  This is because the config machinery pretty
> much equates --local and --file=./.git/config as pretty much
> equivalent (assuming ./.git is the actual repo directory location).
> So just something to keep in mind.

Hm, that's interesting and sounds like a bug to me. But for this helper,
which is context independent, I don't think it should be addressed.

By the way, we're glad to have you contributing Matt - as a point of
order this list tends to prefer bottom-posting or inline replies.
Welcome!

 - Emily

> 
> On Wed, Dec 11, 2019 at 6:11 PM Emily Shaffer <emilyshaffer@google.com> wrote:
> >
> > On Wed, Dec 11, 2019 at 02:19:57PM -0800, Junio C Hamano wrote:
> > > Emily Shaffer <emilyshaffer@google.com> writes:
> > >
> > > > If a user is interacting with their config files primarily by the 'git
> > > > config' command, using the location flags (--global, --system, etc) then
> > > > they may be more interested to see the scope of the config file they are
> > > > editing, rather than the filepath.
> > > >
> > > > Signed-off-by: Emily Shaffer <emilyshaffer@google.com>
> > > > ---
> > > > Note: This commit has been cherry-picked out of the "configuration-based
> > > > hook management" topic, at
> > > > lore.kernel.org/git/20191210023335.49987-1-emilyshaffer@google.com
> > > >
> > > > It turned out that I wanted to use it for git-bugreport as well - to
> > > > explain the origin of the configs we are printing in the bugreport,
> > > > without directly exposing the user's home directory path.
> > > >
> > > > This seems to have similar work to https://github.com/gitgitgadget/git/pull/478
> > > > which I believe hasn't been mailed yet; but that change is targeted
> > > > towards the builtin config command, rather than the config library.
> > > > Since I wanted to use the library, I'm sending on my own now. Maybe
> > > > this commit will be useful to that change's author.
> > >
> > > One thing I wondered about this in the original version was if the
> > > returned value should be localized.  In the context of the original,
> > > the --porcelain mode refused to give this information in its output,
> > > so it was OK to always localize the returned value to satisify the
> > > other caller who wanted end-user-facing output.
> > >
> > > But as a more general helper, I am not sure if this is the most
> > > useful way to implement it.  Shouldn't the function rather return
> > > the machine-readable tokens and allow callers to localize it as
> > > needed with its own _() around the returned value?  I dunno.
> > >
> > Hm. I think that's a good point, and allows this helper to be used for
> > something silly like putting together a sample invocation to 'git
> > config' if desired. It's meant to mirror the scope given to 'git config'
> > - which makes me think that no, it shouldn't be localized, since the
> > argument isn't localized either.
> >
> > Ok, I'll take the locale marker off.
> >
> >  - Emily
> 
> 
> 
> -- 
> Matthew Rogers

Patch
diff mbox series

diff --git a/config.c b/config.c
index e7052b3977..a20110e016 100644
--- a/config.c
+++ b/config.c
@@ -3312,6 +3312,23 @@  enum config_scope current_config_scope(void)
 		return current_parsing_scope;
 }
 
+const char *config_scope_to_string(enum config_scope scope)
+{
+	switch (scope) {
+	case CONFIG_SCOPE_SYSTEM:
+		return _("system");
+	case CONFIG_SCOPE_GLOBAL:
+		return _("global");
+	case CONFIG_SCOPE_REPO:
+		return _("repo");
+	case CONFIG_SCOPE_CMDLINE:
+		return _("cmdline");
+	case CONFIG_SCOPE_UNKNOWN:
+	default:
+		return _("unknown");
+	}
+}
+
 int lookup_config(const char **mapping, int nr_mapping, const char *var)
 {
 	int i;
diff --git a/config.h b/config.h
index 91fd4c5e96..c8bf296dcc 100644
--- a/config.h
+++ b/config.h
@@ -303,6 +303,7 @@  enum config_scope {
 };
 
 enum config_scope current_config_scope(void);
+const char *config_scope_to_string(enum config_scope);
 const char *current_config_origin_type(void);
 const char *current_config_name(void);