On Wed, Feb 24, 2016 at 6:59 PM, Jacob Keller <jacob.e.keller@xxxxxxxxx> wrote: > Due to the way that the git-submodule code works, it clears all local > git environment variables before entering submodules. This is normally > a good thing since we want to clear settings such as GIT_WORKTREE and > other variables which would affect the operation of submodule commands. > However, GIT_CONFIG_PARAMETERS is special, and we actually do want to > preserve these settings. However, we do not want to preserve all > configuration as many things should be left specific to the parent > project. > > Add a git submodule--helper function, sanitize-config, which shall be > used to sanitize GIT_CONFIG_PARAMETERS, removing all key/value pairs > except a small subset that are known to be safe and necessary. > > Replace all the calls to clear_local_git_env with a wrapped function > that filters GIT_CONFIG_PARAMETERS using the new helper and then > restores it to the filtered subset after clearing the rest of the > environment. A few superficial comments below... > Signed-off-by: Jacob Keller <jacob.keller@xxxxxxxxx> > --- > diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c > @@ -255,6 +255,61 @@ static int module_clone(int argc, const char **argv, const char *prefix) > +/* Rules to sanitize configuration variables that are Ok to be passed into > + * submodule operations from the parent project using "-c". Should only > + * include keys which are both (a) safe and (b) necessary for proper > + * operation. Right now only "credential.*" fits both criteria. > + */ Drop the final sentence for a couple reasons: 1. It's merely repeating what the code itself already says, and... 2. It's likely to become outdated when additional variables are added. Also, style: /* * Multi-line comment * style. */ > +int submodule_config_ok(const char *var) > +{ > + if (starts_with(var, "credential.")) > + return 1; > + return 0; > +} > + > +int sanitize_submodule_config(const char *var, const char *value, void *data) > +{ > + struct strbuf quoted = STRBUF_INIT; > + struct strbuf *out = data; > + > + if (submodule_config_ok(var)) { > + if (out->len) > + strbuf_addch(out, ' '); > + > + /* combined all the values before we quote them */ Comment repeats what the code already says, thus not terribly useful. Also: s/combined/combine/ > + strbuf_addstr("ed, var); > + strbuf_addch("ed, '='); > + strbuf_addstr("ed, value); strbuf_addf("ed, "%s=%s", var, value); > + /* safely quote them for shell use */ Comment repeats what the code already says. > + sq_quote_buf(out, quoted.buf); > + } > + return 0; > +} > + > +static int module_sanitize_config(int argc, const char **argv, const char *prefix) > +{ > + struct strbuf sanitized_config = STRBUF_INIT; > + > + struct option module_sanitize_config_options[] = { > + OPT_END() > + }; > + > + const char *const git_submodule_helper_usage[] = { > + N_("git submodule--helper sanitize-config"), > + NULL > + }; > + > + argc = parse_options(argc, argv, prefix, module_sanitize_config_options, > + git_submodule_helper_usage, 0); > + > + git_config_from_parameters(sanitize_submodule_config, &sanitized_config); > + if (sanitized_config.len) > + printf("%s\n", sanitized_config.buf); Perhaps not a big deal since the program exits immediately after, but you could: strbuf_release(&sanitized_config); > + return 0; > +} > + > diff --git a/git-submodule.sh b/git-submodule.sh > @@ -192,6 +192,16 @@ isnumber() > +# Sanitize the local git environment for use within a submodule. We > +# can't simply use clear_local_git_env since we want to preserve some > +# of the settings from GIT_CONFIG_PARAMETERS. > +sanitize_local_git_env() > +{ > + local sanitized_config = $(git submodule--helper sanitize-config) Is 'local' a bashism? (Although, I see that 'local' is already being used in relative_path(); perhaps that ought to be cleaned up.) > + clear_local_git_env > + GIT_CONFIG_PARAMETERS=$sanitized_config > +} > diff --git a/t/t7412-submodule--helper.sh b/t/t7412-submodule--helper.sh > @@ -0,0 +1,25 @@ > +#!/bin/sh > +# > +# Copyright (c) 2016 Jacob Keller > +# > + > +test_description='Basic plumbing support of submodule--helper > + > +This test tries to verify the submodule--helper plumbing command used Maybe: s/tries to verify/verifies/ > +to implement git-submodule. > +' > + > +. ./test-lib.sh > + > +test_expect_success 'sanitize-config clears configuration' ' > + git -c user.name="Some User" submodule--helper sanitize-config >actual && > + test_must_be_empty actual > +' > + > +test_expect_success 'sanitize-config keeps credential.helper' ' > + git -c credential.helper="helper" submodule--helper sanitize-config >actual && > + echo "'\''credential.helper=helper'\''" >expect && > + test_cmp expect actual > +' > + > +test_done -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html