зеркало из https://github.com/microsoft/git.git
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:
Родитель
4638728c63
Коммит
c12e865670
14
submodule.c
14
submodule.c
|
@ -367,7 +367,7 @@ static int submodule_needs_pushing(const char *path, const unsigned char sha1[20
|
|||
|
||||
argv[1] = sha1_to_hex(sha1);
|
||||
cp.argv = argv;
|
||||
cp.env = local_repo_env;
|
||||
prepare_submodule_repo_env(&cp.env_array);
|
||||
cp.git_cmd = 1;
|
||||
cp.no_stdin = 1;
|
||||
cp.out = -1;
|
||||
|
@ -454,7 +454,7 @@ static int push_submodule(const char *path)
|
|||
const char *argv[] = {"push", NULL};
|
||||
|
||||
cp.argv = argv;
|
||||
cp.env = local_repo_env;
|
||||
prepare_submodule_repo_env(&cp.env_array);
|
||||
cp.git_cmd = 1;
|
||||
cp.no_stdin = 1;
|
||||
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);
|
||||
cp.argv = argv;
|
||||
cp.env = local_repo_env;
|
||||
prepare_submodule_repo_env(&cp.env_array);
|
||||
cp.git_cmd = 1;
|
||||
cp.no_stdin = 1;
|
||||
cp.dir = path;
|
||||
|
@ -683,7 +683,7 @@ static int get_next_submodule(struct child_process *cp,
|
|||
if (is_directory(git_dir)) {
|
||||
child_process_init(cp);
|
||||
cp->dir = strbuf_detach(&submodule_path, NULL);
|
||||
cp->env = local_repo_env;
|
||||
prepare_submodule_repo_env(&cp->env_array);
|
||||
cp->git_cmd = 1;
|
||||
if (!spf->quiet)
|
||||
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";
|
||||
|
||||
cp.argv = argv;
|
||||
cp.env = local_repo_env;
|
||||
prepare_submodule_repo_env(&cp.env_array);
|
||||
cp.git_cmd = 1;
|
||||
cp.no_stdin = 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 */
|
||||
cp.argv = argv;
|
||||
cp.env = local_repo_env;
|
||||
prepare_submodule_repo_env(&cp.env_array);
|
||||
cp.git_cmd = 1;
|
||||
cp.no_stdin = 1;
|
||||
cp.no_stderr = 1;
|
||||
|
@ -890,7 +890,7 @@ int ok_to_remove_submodule(const char *path)
|
|||
return 0;
|
||||
|
||||
cp.argv = argv;
|
||||
cp.env = local_repo_env;
|
||||
prepare_submodule_repo_env(&cp.env_array);
|
||||
cp.git_cmd = 1;
|
||||
cp.no_stdin = 1;
|
||||
cp.out = -1;
|
||||
|
|
|
@ -112,6 +112,17 @@ test_expect_success 'cmdline credential config passes to submodule via clone' '
|
|||
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' '
|
||||
# advance the submodule HEAD so that a fetch is required
|
||||
git commit --allow-empty -m foo &&
|
||||
|
|
Загрузка…
Ссылка в новой задаче