[PATCHv4 6/6] 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>
---
submodule.c | 23 +++++++++++++----------
1 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/submodule.c b/submodule.c
index 7d70c4f..81cf05a 100644
--- a/submodule.c
+++ b/submodule.c
@@ -124,15 +124,21 @@ void show_submodule_summary(FILE *f, const char *path,
int is_submodule_modified(const char *path)
{
int len;
+ unsigned int i = 0;
struct child_process cp;
const char *argv[] = {
"status",
"--porcelain",
NULL,
};
- char *env[4];
+ const char *env[local_repo_env_size+2];
struct strbuf buf = STRBUF_INIT;
+ /* Copy local_repo_env to env, letting i
+ rest at the last NULL */
+ while (env[i] = local_repo_env[i])
+ ++i; /* do nothing */
+
strbuf_addf(&buf, "%s/.git/", path);
if (!is_directory(buf.buf)) {
strbuf_release(&buf);
@@ -143,16 +149,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 +169,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]);
+ free((char *)env[--i]);
+ free((char *)env[--i]);
strbuf_release(&buf);
return len != 0;
}
--
1.7.0.212.g4e217.dirty