Merge branch 'rs/run-command-env-array'
authorJunio C Hamano <gitster@pobox.com>
Fri, 24 Oct 2014 21:57:53 +0000 (14:57 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 24 Oct 2014 21:57:54 +0000 (14:57 -0700)
Add managed "env" array to child_process to clarify the lifetime
rules.

* rs/run-command-env-array:
use env_array member of struct child_process
run-command: add env_array, an optional argv_array for env

1  2 
builtin/receive-pack.c
http-backend.c
transport-helper.c
wt-status.c
diff --combined builtin/receive-pack.c
index 916315ff5c2f08bed1e52c8188939405c0b7a0e1,7593861d758ad1ddb7fc7cc5aa839d26b2ace6c0..fc0393779c0dfd44cef7bdc3ec9a57e6d8892d52
@@@ -453,7 -453,6 +453,6 @@@ leave
  static void prepare_push_cert_sha1(struct child_process *proc)
  {
        static int already_done;
-       struct argv_array env = ARGV_ARRAY_INIT;
  
        if (!push_cert.len)
                return;
                nonce_status = check_nonce(push_cert.buf, bogs);
        }
        if (!is_null_sha1(push_cert_sha1)) {
-               argv_array_pushf(&env, "GIT_PUSH_CERT=%s", sha1_to_hex(push_cert_sha1));
-               argv_array_pushf(&env, "GIT_PUSH_CERT_SIGNER=%s",
+               argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT=%s",
+                                sha1_to_hex(push_cert_sha1));
+               argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_SIGNER=%s",
                                 sigcheck.signer ? sigcheck.signer : "");
-               argv_array_pushf(&env, "GIT_PUSH_CERT_KEY=%s",
+               argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_KEY=%s",
                                 sigcheck.key ? sigcheck.key : "");
-               argv_array_pushf(&env, "GIT_PUSH_CERT_STATUS=%c", sigcheck.result);
+               argv_array_pushf(&proc->env_array, "GIT_PUSH_CERT_STATUS=%c",
+                                sigcheck.result);
                if (push_cert_nonce) {
-                       argv_array_pushf(&env, "GIT_PUSH_CERT_NONCE=%s", push_cert_nonce);
-                       argv_array_pushf(&env, "GIT_PUSH_CERT_NONCE_STATUS=%s", nonce_status);
+                       argv_array_pushf(&proc->env_array,
+                                        "GIT_PUSH_CERT_NONCE=%s",
+                                        push_cert_nonce);
+                       argv_array_pushf(&proc->env_array,
+                                        "GIT_PUSH_CERT_NONCE_STATUS=%s",
+                                        nonce_status);
                        if (nonce_status == NONCE_SLOP)
-                               argv_array_pushf(&env, "GIT_PUSH_CERT_NONCE_SLOP=%ld",
+                               argv_array_pushf(&proc->env_array,
+                                                "GIT_PUSH_CERT_NONCE_SLOP=%ld",
                                                 nonce_stamp_slop);
                }
-               proc->env = env.argv;
        }
  }
  
@@@ -842,9 -847,8 +847,9 @@@ static const char *update(struct comman
                transaction = ref_transaction_begin(&err);
                if (!transaction ||
                    ref_transaction_update(transaction, namespaced_name,
 -                                         new_sha1, old_sha1, 0, 1, &err) ||
 -                  ref_transaction_commit(transaction, "push", &err)) {
 +                                         new_sha1, old_sha1, 0, 1, "push",
 +                                         &err) ||
 +                  ref_transaction_commit(transaction, &err)) {
                        ref_transaction_free(transaction);
  
                        rp_error("%s", err.buf);
@@@ -909,7 -913,7 +914,7 @@@ static void check_aliased_update(struc
        int flag;
  
        strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
 -      dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
 +      dst_name = resolve_ref_unsafe(buf.buf, 0, sha1, &flag);
        strbuf_release(&buf);
  
        if (!(flag & REF_ISSYMREF))
@@@ -1070,7 -1074,7 +1075,7 @@@ static void execute_commands(struct com
        check_aliased_updates(commands);
  
        free(head_name_to_free);
 -      head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);
 +      head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL);
  
        checked_connectivity = 1;
        for (cmd = commands; cmd; cmd = cmd->next) {
@@@ -1231,6 -1235,7 +1236,6 @@@ static const char *pack_lockfile
  static const char *unpack(int err_fd, struct shallow_info *si)
  {
        struct pack_header hdr;
 -      struct argv_array av = ARGV_ARRAY_INIT;
        const char *hdr_err;
        int status;
        char hdr_arg[38];
  
        if (si->nr_ours || si->nr_theirs) {
                alt_shallow_file = setup_temporary_shallow(si->shallow);
 -              argv_array_pushl(&av, "--shallow-file", alt_shallow_file, NULL);
 +              argv_array_push(&child.args, "--shallow-file");
 +              argv_array_push(&child.args, alt_shallow_file);
        }
  
        if (ntohl(hdr.hdr_entries) < unpack_limit) {
 -              argv_array_pushl(&av, "unpack-objects", hdr_arg, NULL);
 +              argv_array_pushl(&child.args, "unpack-objects", hdr_arg, NULL);
                if (quiet)
 -                      argv_array_push(&av, "-q");
 +                      argv_array_push(&child.args, "-q");
                if (fsck_objects)
 -                      argv_array_push(&av, "--strict");
 -              child.argv = av.argv;
 +                      argv_array_push(&child.args, "--strict");
                child.no_stdout = 1;
                child.err = err_fd;
                child.git_cmd = 1;
                if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
                        strcpy(keep_arg + s, "localhost");
  
 -              argv_array_pushl(&av, "index-pack",
 +              argv_array_pushl(&child.args, "index-pack",
                                 "--stdin", hdr_arg, keep_arg, NULL);
                if (fsck_objects)
 -                      argv_array_push(&av, "--strict");
 +                      argv_array_push(&child.args, "--strict");
                if (fix_thin)
 -                      argv_array_push(&av, "--fix-thin");
 -              child.argv = av.argv;
 +                      argv_array_push(&child.args, "--fix-thin");
                child.out = -1;
                child.err = err_fd;
                child.git_cmd = 1;
diff --combined http-backend.c
index 9977c5d499e0397bf009c5e9954fe670ea7b034c,e3e0dda0b8ee8ec94df3639c7b74d420e0144468..b6c0484fb24de853ac205233e4e07d2e4e94ed75
@@@ -314,7 -314,6 +314,6 @@@ static void run_service(const char **ar
        const char *encoding = getenv("HTTP_CONTENT_ENCODING");
        const char *user = getenv("REMOTE_USER");
        const char *host = getenv("REMOTE_ADDR");
-       struct argv_array env = ARGV_ARRAY_INIT;
        int gzipped_request = 0;
        struct child_process cld = CHILD_PROCESS_INIT;
  
                host = "(none)";
  
        if (!getenv("GIT_COMMITTER_NAME"))
-               argv_array_pushf(&env, "GIT_COMMITTER_NAME=%s", user);
+               argv_array_pushf(&cld.env_array, "GIT_COMMITTER_NAME=%s", user);
        if (!getenv("GIT_COMMITTER_EMAIL"))
-               argv_array_pushf(&env, "GIT_COMMITTER_EMAIL=%s@http.%s",
-                                user, host);
+               argv_array_pushf(&cld.env_array,
+                                "GIT_COMMITTER_EMAIL=%s@http.%s", user, host);
  
        cld.argv = argv;
-       cld.env = env.argv;
        if (gzipped_request)
                cld.in = -1;
        cld.git_cmd = 1;
  
        if (finish_command(&cld))
                exit(1);
-       argv_array_clear(&env);
  }
  
  static int show_text_ref(const char *name, const unsigned char *sha1,
@@@ -412,9 -409,7 +409,9 @@@ static int show_head_ref(const char *re
  
        if (flag & REF_ISSYMREF) {
                unsigned char unused[20];
 -              const char *target = resolve_ref_unsafe(refname, unused, 1, NULL);
 +              const char *target = resolve_ref_unsafe(refname,
 +                                                      RESOLVE_REF_READING,
 +                                                      unused, NULL);
                const char *target_nons = strip_namespace(target);
  
                strbuf_addf(buf, "ref: %s\n", target_nons);
diff --combined transport-helper.c
index 9b2962041b573b6aa7880b87ce57fd8ddbd4cb11,033a2286137e3ed741eef40c0572affa0edac14b..6cd9dd1f9fe98e4c65156fba41172ba22d5be6de
@@@ -108,12 -108,6 +108,6 @@@ static struct child_process *get_helper
        int refspec_alloc = 0;
        int duped;
        int code;
-       char git_dir_buf[sizeof(GIT_DIR_ENVIRONMENT) + PATH_MAX + 1];
-       const char *helper_env[] = {
-               git_dir_buf,
-               NULL
-       };
  
        if (data->helper)
                return data->helper;
        helper->git_cmd = 0;
        helper->silent_exec_failure = 1;
  
-       snprintf(git_dir_buf, sizeof(git_dir_buf), "%s=%s", GIT_DIR_ENVIRONMENT, get_git_dir());
-       helper->env = helper_env;
+       argv_array_pushf(&helper->env_array, "%s=%s", GIT_DIR_ENVIRONMENT,
+                        get_git_dir());
  
        code = start_command(helper);
        if (code < 0 && errno == ENOENT)
@@@ -897,10 -891,7 +891,10 @@@ static int push_refs_with_export(struc
                                        int flag;
  
                                        /* Follow symbolic refs (mainly for HEAD). */
 -                                      name = resolve_ref_unsafe(ref->peer_ref->name, sha1, 1, &flag);
 +                                      name = resolve_ref_unsafe(
 +                                               ref->peer_ref->name,
 +                                               RESOLVE_REF_READING,
 +                                               sha1, &flag);
                                        if (!name || !(flag & REF_ISSYMREF))
                                                name = ref->peer_ref->name;
  
diff --combined wt-status.c
index f367066f9214791908e761d1120d1a6d809015fa,66d267c6743e8c182af64c1c057b58039fc78689..cdbc8d798aaff6fff833224ff94b83af49289a5a
@@@ -128,7 -128,7 +128,7 @@@ void wt_status_prepare(struct wt_statu
        s->show_untracked_files = SHOW_NORMAL_UNTRACKED_FILES;
        s->use_color = -1;
        s->relative_paths = 1;
 -      s->branch = resolve_refdup("HEAD", sha1, 0, NULL);
 +      s->branch = resolve_refdup("HEAD", 0, sha1, NULL);
        s->reference = "HEAD";
        s->fp = stdout;
        s->index_file = get_index_file();
@@@ -726,14 -726,14 +726,14 @@@ static void wt_status_print_changed(str
  static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitted)
  {
        struct child_process sm_summary = CHILD_PROCESS_INIT;
-       struct argv_array env = ARGV_ARRAY_INIT;
        struct argv_array argv = ARGV_ARRAY_INIT;
        struct strbuf cmd_stdout = STRBUF_INIT;
        struct strbuf summary = STRBUF_INIT;
        char *summary_content;
        size_t len;
  
-       argv_array_pushf(&env, "GIT_INDEX_FILE=%s", s->index_file);
+       argv_array_pushf(&sm_summary.env_array, "GIT_INDEX_FILE=%s",
+                        s->index_file);
  
        argv_array_push(&argv, "submodule");
        argv_array_push(&argv, "summary");
                argv_array_push(&argv, s->amend ? "HEAD^" : "HEAD");
  
        sm_summary.argv = argv.argv;
-       sm_summary.env = env.argv;
        sm_summary.git_cmd = 1;
        sm_summary.no_stdin = 1;
        fflush(s->fp);
        sm_summary.out = -1;
  
        run_command(&sm_summary);
-       argv_array_clear(&env);
        argv_array_clear(&argv);
  
        len = strbuf_read(&cmd_stdout, sm_summary.out, 1024);