argv-array: drop "detach" code
[gitweb.git] / transport-helper.c
index f0d7fc772cc76a8f3fc59cda58179819ed2613b9..d9063d714591bad2e44a4e58fdffc3bb1708157d 100644 (file)
@@ -101,7 +101,6 @@ static void do_take_over(struct transport *transport)
 static struct child_process *get_helper(struct transport *transport)
 {
        struct helper_data *data = transport->data;
-       struct argv_array argv = ARGV_ARRAY_INIT;
        struct strbuf buf = STRBUF_INIT;
        struct child_process *helper;
        const char **refspecs = NULL;
@@ -123,10 +122,9 @@ static struct child_process *get_helper(struct transport *transport)
        helper->in = -1;
        helper->out = -1;
        helper->err = 0;
-       argv_array_pushf(&argv, "git-remote-%s", data->name);
-       argv_array_push(&argv, transport->remote->name);
-       argv_array_push(&argv, remove_ext_force(transport->url));
-       helper->argv = argv_array_detach(&argv, NULL);
+       argv_array_pushf(&helper->args, "git-remote-%s", data->name);
+       argv_array_push(&helper->args, transport->remote->name);
+       argv_array_push(&helper->args, remove_ext_force(transport->url));
        helper->git_cmd = 0;
        helper->silent_exec_failure = 1;
 
@@ -195,15 +193,9 @@ static struct child_process *get_helper(struct transport *transport)
                } else if (!strcmp(capname, "signed-tags")) {
                        data->signed_tags = 1;
                } else if (starts_with(capname, "export-marks ")) {
-                       struct strbuf arg = STRBUF_INIT;
-                       strbuf_addstr(&arg, "--export-marks=");
-                       strbuf_addstr(&arg, capname + strlen("export-marks "));
-                       data->export_marks = strbuf_detach(&arg, NULL);
+                       data->export_marks = xstrdup(capname + strlen("export-marks "));
                } else if (starts_with(capname, "import-marks")) {
-                       struct strbuf arg = STRBUF_INIT;
-                       strbuf_addstr(&arg, "--import-marks=");
-                       strbuf_addstr(&arg, capname + strlen("import-marks "));
-                       data->import_marks = strbuf_detach(&arg, NULL);
+                       data->import_marks = xstrdup(capname + strlen("import-marks "));
                } else if (starts_with(capname, "no-private-update")) {
                        data->no_private_update = 1;
                } else if (mandatory) {
@@ -251,7 +243,6 @@ static int disconnect_helper(struct transport *transport)
                close(data->helper->out);
                fclose(data->out);
                res = finish_command(data->helper);
-               argv_array_free_detached(data->helper->argv);
                free(data->helper);
                data->helper = NULL;
        }
@@ -403,18 +394,16 @@ static int get_importer(struct transport *transport, struct child_process *fasti
 {
        struct child_process *helper = get_helper(transport);
        struct helper_data *data = transport->data;
-       struct argv_array argv = ARGV_ARRAY_INIT;
        int cat_blob_fd, code;
        memset(fastimport, 0, sizeof(*fastimport));
        fastimport->in = helper->out;
-       argv_array_push(&argv, "fast-import");
-       argv_array_push(&argv, debug ? "--stats" : "--quiet");
+       argv_array_push(&fastimport->args, "fast-import");
+       argv_array_push(&fastimport->args, debug ? "--stats" : "--quiet");
 
        if (data->bidi_import) {
                cat_blob_fd = xdup(helper->in);
-               argv_array_pushf(&argv, "--cat-blob-fd=%d", cat_blob_fd);
+               argv_array_pushf(&fastimport->args, "--cat-blob-fd=%d", cat_blob_fd);
        }
-       fastimport->argv = argv.argv;
        fastimport->git_cmd = 1;
 
        code = start_command(fastimport);
@@ -427,24 +416,24 @@ static int get_exporter(struct transport *transport,
 {
        struct helper_data *data = transport->data;
        struct child_process *helper = get_helper(transport);
-       int argc = 0, i;
+       int i;
+
        memset(fastexport, 0, sizeof(*fastexport));
 
        /* we need to duplicate helper->in because we want to use it after
         * fastexport is done with it. */
        fastexport->out = dup(helper->in);
-       fastexport->argv = xcalloc(6 + revlist_args->nr, sizeof(*fastexport->argv));
-       fastexport->argv[argc++] = "fast-export";
-       fastexport->argv[argc++] = "--use-done-feature";
-       fastexport->argv[argc++] = data->signed_tags ?
-               "--signed-tags=verbatim" : "--signed-tags=warn-strip";
+       argv_array_push(&fastexport->args, "fast-export");
+       argv_array_push(&fastexport->args, "--use-done-feature");
+       argv_array_push(&fastexport->args, data->signed_tags ?
+               "--signed-tags=verbatim" : "--signed-tags=warn-strip");
        if (data->export_marks)
-               fastexport->argv[argc++] = data->export_marks;
+               argv_array_pushf(&fastexport->args, "--export-marks=%s.tmp", data->export_marks);
        if (data->import_marks)
-               fastexport->argv[argc++] = data->import_marks;
+               argv_array_pushf(&fastexport->args, "--import-marks=%s", data->import_marks);
 
        for (i = 0; i < revlist_args->nr; i++)
-               fastexport->argv[argc++] = revlist_args->items[i].string;
+               argv_array_push(&fastexport->args, revlist_args->items[i].string);
 
        fastexport->git_cmd = 1;
        return start_command(fastexport);
@@ -485,7 +474,6 @@ static int fetch_with_import(struct transport *transport,
 
        if (finish_command(&fastimport))
                die("Error while running fast-import");
-       argv_array_free_detached(fastimport.argv);
 
        /*
         * The fast-import stream of a remote helper that advertises
@@ -739,17 +727,22 @@ static int push_update_ref_status(struct strbuf *buf,
        return !(status == REF_STATUS_OK);
 }
 
-static void push_update_refs_status(struct helper_data *data,
+static int push_update_refs_status(struct helper_data *data,
                                    struct ref *remote_refs,
                                    int flags)
 {
        struct strbuf buf = STRBUF_INIT;
        struct ref *ref = remote_refs;
+       int ret = 0;
+
        for (;;) {
                char *private;
 
-               if (recvline(data, &buf))
-                       exit(128);
+               if (recvline(data, &buf)) {
+                       ret = 1;
+                       break;
+               }
+
                if (!buf.len)
                        break;
 
@@ -767,6 +760,7 @@ static void push_update_refs_status(struct helper_data *data,
                free(private);
        }
        strbuf_release(&buf);
+       return ret;
 }
 
 static int push_refs_with_push(struct transport *transport,
@@ -847,8 +841,7 @@ static int push_refs_with_push(struct transport *transport,
        sendline(data, &buf);
        strbuf_release(&buf);
 
-       push_update_refs_status(data, remote_refs, flags);
-       return 0;
+       return push_update_refs_status(data, remote_refs, flags);
 }
 
 static int push_refs_with_export(struct transport *transport,
@@ -906,7 +899,15 @@ static int push_refs_with_export(struct transport *transport,
 
        if (finish_command(&exporter))
                die("Error while running fast-export");
-       push_update_refs_status(data, remote_refs, flags);
+       if (push_update_refs_status(data, remote_refs, flags))
+               return 1;
+
+       if (data->export_marks) {
+               strbuf_addf(&buf, "%s.tmp", data->export_marks);
+               rename(buf.buf, data->export_marks);
+               strbuf_release(&buf);
+       }
+
        return 0;
 }