Re: [PATCH v4 0/3] config: allow overriding global/system config
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Apr 13, 2021, 17:49 UTC
- Message-ID
- <xmqqblaim5vv.fsf@gitster.g>
- In-Reply-To
- <cover.1618297711.git.ps@pks.im>
Patrick Steinhardt <ps@pks.im> writes:
Show 19 quoted lines
> Compared to v3, I only dropped the special-casing of `/dev/null`. As > Junio rightly pointed out, the special-casing was incomplete and would > have required more work to do the right thing for all cases. It can > still be re-added at a later point if the usecase actually comes up. > > Patrick > > Patrick Steinhardt (3): > config: rename `git_etc_config()` > config: unify code paths to get global config paths > config: allow overriding of global and system configuration > > Documentation/git-config.txt | 5 +++ > Documentation/git.txt | 10 +++++ > builtin/config.c | 6 +-- > config.c | 41 +++++++++++++++------ > config.h | 4 +- > t/t1300-config.sh | 71 ++++++++++++++++++++++++++++++++++++ > 6 files changed, 121 insertions(+), 16 deletions(-)
This round looks good to me. Sorry for suggesting the "/dev/null" thing in the first place to lead you into wild goose chase during the last round.
Will queue. Thanks for working on it.
And thanks for reviewing, everybody.
Show 73 quoted lines
>
> Range-diff against v3:
> 1: 34bdbc27d6 = 1: 34bdbc27d6 config: rename `git_etc_config()`
> 2: 30f18679bd = 2: 30f18679bd config: unify code paths to get global config paths
> 3: af663640ae ! 3: d27efc0aa8 config: allow overriding of global and system configuration
> @@ Commit message
> - If unset, git continues to use the usual locations.
>
> - If set to a specific path, we skip reading the normal
> - configuration files and instead take the path.
> -
> - - If set to `/dev/null`, we do not load either global- or
> - system-level configuration at all.
> + configuration files and instead take the path. By setting the path
> + to `/dev/null`, no configuration will be loaded for the respective
> + level.
>
> This implements the usecase where we want to execute code in a sanitized
> environment without any potential misconfigurations via `/dev/null`, but
> @@ Documentation/git.txt: for further details.
> Whether to skip reading settings from the system-wide
> `$(prefix)/etc/gitconfig` file. This environment variable can
>
> - ## builtin/config.c ##
> -@@ builtin/config.c: int cmd_config(int argc, const char **argv, const char *prefix)
> - char *user_config, *xdg_config;
> -
> - git_global_config(&user_config, &xdg_config);
> -- if (!user_config)
> -+ if (!user_config) {
> -+ if (getenv("GIT_CONFIG_GLOBAL"))
> -+ die(_("GIT_CONFIG_GLOBAL=/dev/null set"));
> -+
> - /*
> - * It is unknown if HOME/.gitconfig exists, so
> - * we do not know if we should write to XDG
> -@@ builtin/config.c: int cmd_config(int argc, const char **argv, const char *prefix)
> - * is set and points at a sane location.
> - */
> - die(_("$HOME not set"));
> -+ }
> -
> - given_config_source.scope = CONFIG_SCOPE_GLOBAL;
> -
> -
> ## config.c ##
> @@ config.c: static int git_config_from_blob_ref(config_fn_t fn,
>
> char *git_system_config(void)
> {
> + char *system_config = xstrdup_or_null(getenv("GIT_CONFIG_SYSTEM"));
> -+ if (system_config) {
> -+ if (!strcmp(system_config, "/dev/null"))
> -+ FREE_AND_NULL(system_config);
> ++ if (system_config)
> + return system_config;
> -+ }
> return system_path(ETC_GITCONFIG);
> }
>
> @@ config.c: static int git_config_from_blob_ref(config_fn_t fn,
> + char *user_config = xstrdup_or_null(getenv("GIT_CONFIG_GLOBAL"));
> + char *xdg_config = NULL;
> +
> -+ if (user_config) {
> -+ if (!strcmp(user_config, "/dev/null"))
> -+ FREE_AND_NULL(user_config);
> -+ xdg_config = NULL;
> -+ } else {
> ++ if (!user_config) {
> + user_config = expand_user_path("~/.gitconfig", 0);
> + xdg_config = xdg_config_home("config");
> + }