submodule: use prepare_submodule_repo_env consistently

Before 14111fc (git: submodule honor -c credential.* from
command line, 2016-02-29), it was sufficient for code which
spawned a process in a submodule to just set the child
process's "env" field to "local_repo_env" to clear the
environment of any repo-specific variables.

That commit introduced a more complicated procedure, in
which we clear most variables but allow through sanitized
config. For C code, we used that procedure only for cloning,
but not for any of the programs spawned by submodule.c. As a
result, things like "git fetch --recurse-submodules" behave
differently than "git clone --recursive"; the former will
not pass through the sanitized config.

We can fix this by using prepare_submodule_repo_env()
everywhere in submodule.c.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2016-04-28 09:39:15 -04:00 committed by Junio C Hamano
parent 4638728c63
commit c12e865670
2 changed files with 18 additions and 7 deletions

View File

@ -367,7 +367,7 @@ static int submodule_needs_pushing(const char *path, const unsigned char sha1[20
argv[1] = sha1_to_hex(sha1); argv[1] = sha1_to_hex(sha1);
cp.argv = argv; cp.argv = argv;
cp.env = local_repo_env; prepare_submodule_repo_env(&cp.env_array);
cp.git_cmd = 1; cp.git_cmd = 1;
cp.no_stdin = 1; cp.no_stdin = 1;
cp.out = -1; cp.out = -1;
@ -454,7 +454,7 @@ static int push_submodule(const char *path)
const char *argv[] = {"push", NULL}; const char *argv[] = {"push", NULL};
cp.argv = argv; cp.argv = argv;
cp.env = local_repo_env; prepare_submodule_repo_env(&cp.env_array);
cp.git_cmd = 1; cp.git_cmd = 1;
cp.no_stdin = 1; cp.no_stdin = 1;
cp.dir = path; cp.dir = path;
@ -500,7 +500,7 @@ static int is_submodule_commit_present(const char *path, unsigned char sha1[20])
argv[3] = sha1_to_hex(sha1); argv[3] = sha1_to_hex(sha1);
cp.argv = argv; cp.argv = argv;
cp.env = local_repo_env; prepare_submodule_repo_env(&cp.env_array);
cp.git_cmd = 1; cp.git_cmd = 1;
cp.no_stdin = 1; cp.no_stdin = 1;
cp.dir = path; cp.dir = path;
@ -683,7 +683,7 @@ static int get_next_submodule(struct child_process *cp,
if (is_directory(git_dir)) { if (is_directory(git_dir)) {
child_process_init(cp); child_process_init(cp);
cp->dir = strbuf_detach(&submodule_path, NULL); cp->dir = strbuf_detach(&submodule_path, NULL);
cp->env = local_repo_env; prepare_submodule_repo_env(&cp->env_array);
cp->git_cmd = 1; cp->git_cmd = 1;
if (!spf->quiet) if (!spf->quiet)
strbuf_addf(err, "Fetching submodule %s%s\n", strbuf_addf(err, "Fetching submodule %s%s\n",
@ -796,7 +796,7 @@ unsigned is_submodule_modified(const char *path, int ignore_untracked)
argv[2] = "-uno"; argv[2] = "-uno";
cp.argv = argv; cp.argv = argv;
cp.env = local_repo_env; prepare_submodule_repo_env(&cp.env_array);
cp.git_cmd = 1; cp.git_cmd = 1;
cp.no_stdin = 1; cp.no_stdin = 1;
cp.out = -1; cp.out = -1;
@ -857,7 +857,7 @@ int submodule_uses_gitfile(const char *path)
/* Now test that all nested submodules use a gitfile too */ /* Now test that all nested submodules use a gitfile too */
cp.argv = argv; cp.argv = argv;
cp.env = local_repo_env; prepare_submodule_repo_env(&cp.env_array);
cp.git_cmd = 1; cp.git_cmd = 1;
cp.no_stdin = 1; cp.no_stdin = 1;
cp.no_stderr = 1; cp.no_stderr = 1;
@ -890,7 +890,7 @@ int ok_to_remove_submodule(const char *path)
return 0; return 0;
cp.argv = argv; cp.argv = argv;
cp.env = local_repo_env; prepare_submodule_repo_env(&cp.env_array);
cp.git_cmd = 1; cp.git_cmd = 1;
cp.no_stdin = 1; cp.no_stdin = 1;
cp.out = -1; cp.out = -1;

View File

@ -112,6 +112,17 @@ test_expect_success 'cmdline credential config passes to submodule via clone' '
expect_askpass pass user@host expect_askpass pass user@host
' '
test_expect_success 'cmdline credential config passes submodule via fetch' '
set_askpass wrong pass@host &&
test_must_fail git -C super-clone fetch --recurse-submodules &&
set_askpass wrong pass@host &&
git -C super-clone \
-c "credential.$HTTPD_URL.username=user@host" \
fetch --recurse-submodules &&
expect_askpass pass user@host
'
test_expect_success 'cmdline credential config passes submodule update' ' test_expect_success 'cmdline credential config passes submodule update' '
# advance the submodule HEAD so that a fetch is required # advance the submodule HEAD so that a fetch is required
git commit --allow-empty -m foo && git commit --allow-empty -m foo &&