is_submodule_modified(): clear environment properly

Rather than only clearing GIT_INDEX_FILE, take the list of environment
variables to clear from local_repo_env, appending the settings for
GIT_DIR and GIT_WORK_TREE.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Giuseppe Bilotta 2010-02-25 00:34:18 +01:00 committed by Junio C Hamano
parent 74ae14199d
commit 5ce9086ddf

View File

@ -123,16 +123,19 @@ void show_submodule_summary(FILE *f, const char *path,
int is_submodule_modified(const char *path) int is_submodule_modified(const char *path)
{ {
int len; int len, i;
struct child_process cp; struct child_process cp;
const char *argv[] = { const char *argv[] = {
"status", "status",
"--porcelain", "--porcelain",
NULL, NULL,
}; };
char *env[4]; const char *env[LOCAL_REPO_ENV_SIZE + 3];
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
for (i = 0; i < LOCAL_REPO_ENV_SIZE; i++)
env[i] = local_repo_env[i];
strbuf_addf(&buf, "%s/.git/", path); strbuf_addf(&buf, "%s/.git/", path);
if (!is_directory(buf.buf)) { if (!is_directory(buf.buf)) {
strbuf_release(&buf); strbuf_release(&buf);
@ -143,16 +146,14 @@ int is_submodule_modified(const char *path)
strbuf_reset(&buf); strbuf_reset(&buf);
strbuf_addf(&buf, "GIT_WORK_TREE=%s", path); strbuf_addf(&buf, "GIT_WORK_TREE=%s", path);
env[0] = strbuf_detach(&buf, NULL); env[i++] = strbuf_detach(&buf, NULL);
strbuf_addf(&buf, "GIT_DIR=%s/.git", path); strbuf_addf(&buf, "GIT_DIR=%s/.git", path);
env[1] = strbuf_detach(&buf, NULL); env[i++] = strbuf_detach(&buf, NULL);
strbuf_addf(&buf, "GIT_INDEX_FILE"); env[i] = NULL;
env[2] = strbuf_detach(&buf, NULL);
env[3] = NULL;
memset(&cp, 0, sizeof(cp)); memset(&cp, 0, sizeof(cp));
cp.argv = argv; cp.argv = argv;
cp.env = (const char *const *)env; cp.env = env;
cp.git_cmd = 1; cp.git_cmd = 1;
cp.no_stdin = 1; cp.no_stdin = 1;
cp.out = -1; cp.out = -1;
@ -165,9 +166,8 @@ int is_submodule_modified(const char *path)
if (finish_command(&cp)) if (finish_command(&cp))
die("git status --porcelain failed"); die("git status --porcelain failed");
free(env[0]); for (i = LOCAL_REPO_ENV_SIZE; env[i]; i++)
free(env[1]); free((char *)env[i]);
free(env[2]);
strbuf_release(&buf); strbuf_release(&buf);
return len != 0; return len != 0;
} }