Code

is_submodule_modified(): clear environment properly
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>
Wed, 24 Feb 2010 23:34:18 +0000 (00:34 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 25 Feb 2010 00:24:25 +0000 (16:24 -0800)
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>
submodule.c

index 7d70c4f7bfe2749953726fecb27144a9588a326f..5d286e409ee2a9b12d6b64cb05394eca18fe3e97 100644 (file)
@@ -123,16 +123,19 @@ void show_submodule_summary(FILE *f, const char *path,
 
 int is_submodule_modified(const char *path)
 {
-       int len;
+       int len, i;
        struct child_process cp;
        const char *argv[] = {
                "status",
                "--porcelain",
                NULL,
        };
-       char *env[4];
+       const char *env[LOCAL_REPO_ENV_SIZE + 3];
        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);
        if (!is_directory(buf.buf)) {
                strbuf_release(&buf);
@@ -143,16 +146,14 @@ int is_submodule_modified(const char *path)
        strbuf_reset(&buf);
 
        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);
-       env[1] = strbuf_detach(&buf, NULL);
-       strbuf_addf(&buf, "GIT_INDEX_FILE");
-       env[2] = strbuf_detach(&buf, NULL);
-       env[3] = NULL;
+       env[i++] = strbuf_detach(&buf, NULL);
+       env[i] = NULL;
 
        memset(&cp, 0, sizeof(cp));
        cp.argv = argv;
-       cp.env = (const char *const *)env;
+       cp.env = env;
        cp.git_cmd = 1;
        cp.no_stdin = 1;
        cp.out = -1;
@@ -165,9 +166,8 @@ int is_submodule_modified(const char *path)
        if (finish_command(&cp))
                die("git status --porcelain failed");
 
-       free(env[0]);
-       free(env[1]);
-       free(env[2]);
+       for (i = LOCAL_REPO_ENV_SIZE; env[i]; i++)
+               free((char *)env[i]);
        strbuf_release(&buf);
        return len != 0;
 }