#include "commit.h"
#include "diff.h"
#include "revision.h"
-#include "quote.h"
#include "remote.h"
#include "string-list.h"
#include "thread-utils.h"
free(data);
}
+static void standard_options(struct transport *t);
+
static struct child_process *get_helper(struct transport *transport)
{
struct helper_data *data = transport->data;
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 = xcalloc(1, sizeof(*helper));
+ helper = xmalloc(sizeof(*helper));
+ child_process_init(helper);
helper->in = -1;
helper->out = -1;
helper->err = 0;
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)
strbuf_release(&buf);
if (debug)
fprintf(stderr, "Debug: Capabilities complete.\n");
+ standard_options(transport);
return data->helper;
}
int i;
struct strbuf buf = STRBUF_INIT;
- standard_options(transport);
- if (data->check_connectivity &&
- data->transport_options.check_self_contained_and_connected)
- set_helper_option(transport, "check-connectivity", "true");
-
- if (transport->cloning)
- set_helper_option(transport, "cloning", "true");
-
- if (data->transport_options.update_shallow)
- set_helper_option(transport, "update-shallow", "true");
-
for (i = 0; i < nr_heads; i++) {
const struct ref *posn = to_fetch[i];
if (posn->status & REF_STATUS_UPTODATE)
continue;
strbuf_addf(&buf, "fetch %s %s\n",
- sha1_to_hex(posn->old_sha1), posn->name);
+ sha1_to_hex(posn->old_sha1),
+ posn->symref ? posn->symref : posn->name);
}
strbuf_addch(&buf, '\n');
struct child_process *helper = get_helper(transport);
struct helper_data *data = transport->data;
int cat_blob_fd, code;
- memset(fastimport, 0, sizeof(*fastimport));
+ child_process_init(fastimport);
fastimport->in = helper->out;
argv_array_push(&fastimport->args, "fast-import");
argv_array_push(&fastimport->args, debug ? "--stats" : "--quiet");
struct child_process *helper = get_helper(transport);
int i;
- memset(fastexport, 0, sizeof(*fastexport));
+ child_process_init(fastexport);
/* we need to duplicate helper->in because we want to use it after
* fastexport is done with it. */
if (posn->status & REF_STATUS_UPTODATE)
continue;
- strbuf_addf(&buf, "import %s\n", posn->name);
+ strbuf_addf(&buf, "import %s\n",
+ posn->symref ? posn->symref : posn->name);
sendline(data, &buf);
strbuf_reset(&buf);
}
* fast-forward or this is a forced update.
*/
for (i = 0; i < nr_heads; i++) {
- char *private;
+ char *private, *name;
posn = to_fetch[i];
if (posn->status & REF_STATUS_UPTODATE)
continue;
+ name = posn->symref ? posn->symref : posn->name;
if (data->refspecs)
- private = apply_refspecs(data->refspecs, data->refspec_nr, posn->name);
+ private = apply_refspecs(data->refspecs, data->refspec_nr, name);
else
- private = xstrdup(posn->name);
+ private = xstrdup(name);
if (private) {
read_ref(private, posn->old_sha1);
free(private);
if (!count)
return 0;
+ if (data->check_connectivity &&
+ data->transport_options.check_self_contained_and_connected)
+ set_helper_option(transport, "check-connectivity", "true");
+
+ if (transport->cloning)
+ set_helper_option(transport, "cloning", "true");
+
+ if (data->transport_options.update_shallow)
+ set_helper_option(transport, "update-shallow", "true");
+
if (data->fetch)
return fetch_with_fetch(transport, nr_heads, to_fetch);
return 0;
}
- standard_options(transport);
for_each_string_list_item(cas_option, &cas_options)
set_helper_option(transport, "cas", cas_option->string);
die("helper %s does not support dry-run", data->name);
} else if (flags & TRANSPORT_PUSH_CERT) {
if (set_helper_option(transport, TRANS_OPT_PUSH_CERT, "true") != 0)
- die("helper %s does not support dry-run", data->name);
+ die("helper %s does not support --signed", data->name);
}
if (flags & TRANSPORT_PUSH_FORCE) {
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;