worktree: elucidate environment variables intended for child processes
authorEric Sunshine <sunshine@sunshineco.com>
Fri, 17 Jul 2015 23:00:11 +0000 (19:00 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 20 Jul 2015 18:29:51 +0000 (11:29 -0700)
Take advantage of 'struct child_process.env' to make it obvious that
environment variables set by add_worktree() are intended specifically
for sub-commands it invokes to operate in the new worktree.

We assign a local 'struct argv_array' to child_process.env, rather than
utilizing the child_process.env_array 'struct argv_array', because
future patches will make add_worktree() invoke additional sub-commands,
and it's simpler to populate the environment array just once, whereas
child_process.env_array gets cleared after each invocation, thus would
require re-population for each sub-command.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/worktree.c
index 8225468f1171f5f1f3805698d3e072c1d454e417..7bd6f1793e3e89701b9371acd3925a6c869ceaaf 100644 (file)
@@ -186,6 +186,7 @@ static int add_worktree(const char *path, const char **child_argv,
        const char *name;
        struct stat st;
        struct child_process cp;
+       struct argv_array child_env = ARGV_ARRAY_INIT;
        int counter = 0, len, ret;
        unsigned char rev[20];
 
@@ -256,11 +257,12 @@ static int add_worktree(const char *path, const char **child_argv,
        fprintf_ln(stderr, _("Preparing %s (identifier %s)"), path, name);
 
        setenv("GIT_CHECKOUT_NEW_WORKTREE", "1", 1);
-       setenv(GIT_DIR_ENVIRONMENT, sb_git.buf, 1);
-       setenv(GIT_WORK_TREE_ENVIRONMENT, path, 1);
+       argv_array_pushf(&child_env, "%s=%s", GIT_DIR_ENVIRONMENT, sb_git.buf);
+       argv_array_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path);
        memset(&cp, 0, sizeof(cp));
        cp.git_cmd = 1;
        cp.argv = child_argv;
+       cp.env = child_env.argv;
        ret = run_command(&cp);
        if (!ret) {
                is_junk = 0;
@@ -272,6 +274,7 @@ static int add_worktree(const char *path, const char **child_argv,
        strbuf_reset(&sb);
        strbuf_addf(&sb, "%s/locked", sb_repo.buf);
        unlink_or_warn(sb.buf);
+       argv_array_clear(&child_env);
        strbuf_release(&sb);
        strbuf_release(&sb_repo);
        strbuf_release(&sb_git);