transport-helper: implement marks location as capability
Now that the gitdir location is exported as an environment variable this can be implemented elegantly without requiring any explicit flushes nor an ad-hoc exchange of values. Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com> Acked-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
4d2ec306e8
commit
a515ebe9f1
@ -72,6 +72,17 @@ def do_capabilities(repo, args):
|
||||
print "export"
|
||||
print "refspec refs/heads/*:%s*" % repo.prefix
|
||||
|
||||
dirname = repo.get_base_path(repo.gitdir)
|
||||
|
||||
if not os.path.exists(dirname):
|
||||
os.makedirs(dirname)
|
||||
|
||||
path = os.path.join(dirname, 'testgit.marks')
|
||||
|
||||
print "*export-marks %s" % path
|
||||
if os.path.exists(path):
|
||||
print "*import-marks %s" % path
|
||||
|
||||
print # end capabilities
|
||||
|
||||
|
||||
@ -147,19 +158,6 @@ def do_export(repo, args):
|
||||
if not repo.gitdir:
|
||||
die("Need gitdir to export")
|
||||
|
||||
dirname = repo.get_base_path(repo.gitdir)
|
||||
|
||||
if not os.path.exists(dirname):
|
||||
os.makedirs(dirname)
|
||||
|
||||
path = os.path.join(dirname, 'testgit.marks')
|
||||
print path
|
||||
if os.path.exists(path):
|
||||
print path
|
||||
else:
|
||||
print ""
|
||||
sys.stdout.flush()
|
||||
|
||||
update_local_repo(repo)
|
||||
changed = repo.importer.do_import(repo.gitdir)
|
||||
|
||||
|
@ -23,6 +23,8 @@ struct helper_data {
|
||||
push : 1,
|
||||
connect : 1,
|
||||
no_disconnect_req : 1;
|
||||
char *export_marks;
|
||||
char *import_marks;
|
||||
/* These go from remote name (as in "list") to private name */
|
||||
struct refspec *refspecs;
|
||||
int refspec_nr;
|
||||
@ -184,6 +186,16 @@ static struct child_process *get_helper(struct transport *transport)
|
||||
refspecs[refspec_nr++] = strdup(capname + strlen("refspec "));
|
||||
} else if (!strcmp(capname, "connect")) {
|
||||
data->connect = 1;
|
||||
} else if (!prefixcmp(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);
|
||||
} else if (!prefixcmp(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);
|
||||
} else if (mandatory) {
|
||||
die("Unknown mandatory capability %s. This remote "
|
||||
"helper probably needs newer version of Git.\n",
|
||||
@ -369,10 +381,9 @@ static int get_importer(struct transport *transport, struct child_process *fasti
|
||||
|
||||
static int get_exporter(struct transport *transport,
|
||||
struct child_process *fastexport,
|
||||
const char *export_marks,
|
||||
const char *import_marks,
|
||||
struct string_list *revlist_args)
|
||||
{
|
||||
struct helper_data *data = transport->data;
|
||||
struct child_process *helper = get_helper(transport);
|
||||
int argc = 0, i;
|
||||
memset(fastexport, 0, sizeof(*fastexport));
|
||||
@ -383,10 +394,10 @@ static int get_exporter(struct transport *transport,
|
||||
fastexport->argv = xcalloc(5 + revlist_args->nr, sizeof(*fastexport->argv));
|
||||
fastexport->argv[argc++] = "fast-export";
|
||||
fastexport->argv[argc++] = "--use-done-feature";
|
||||
if (export_marks)
|
||||
fastexport->argv[argc++] = export_marks;
|
||||
if (import_marks)
|
||||
fastexport->argv[argc++] = import_marks;
|
||||
if (data->export_marks)
|
||||
fastexport->argv[argc++] = data->export_marks;
|
||||
if (data->import_marks)
|
||||
fastexport->argv[argc++] = data->import_marks;
|
||||
|
||||
for (i = 0; i < revlist_args->nr; i++)
|
||||
fastexport->argv[argc++] = revlist_args->items[i].string;
|
||||
@ -713,7 +724,6 @@ static int push_refs_with_export(struct transport *transport,
|
||||
struct ref *ref;
|
||||
struct child_process *helper, exporter;
|
||||
struct helper_data *data = transport->data;
|
||||
char *export_marks = NULL, *import_marks = NULL;
|
||||
struct string_list revlist_args = STRING_LIST_INIT_NODUP;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
|
||||
@ -721,26 +731,6 @@ static int push_refs_with_export(struct transport *transport,
|
||||
|
||||
write_constant(helper->in, "export\n");
|
||||
|
||||
recvline(data, &buf);
|
||||
if (debug)
|
||||
fprintf(stderr, "Debug: Got export_marks '%s'\n", buf.buf);
|
||||
if (buf.len) {
|
||||
struct strbuf arg = STRBUF_INIT;
|
||||
strbuf_addstr(&arg, "--export-marks=");
|
||||
strbuf_addbuf(&arg, &buf);
|
||||
export_marks = strbuf_detach(&arg, NULL);
|
||||
}
|
||||
|
||||
recvline(data, &buf);
|
||||
if (debug)
|
||||
fprintf(stderr, "Debug: Got import_marks '%s'\n", buf.buf);
|
||||
if (buf.len) {
|
||||
struct strbuf arg = STRBUF_INIT;
|
||||
strbuf_addstr(&arg, "--import-marks=");
|
||||
strbuf_addbuf(&arg, &buf);
|
||||
import_marks = strbuf_detach(&arg, NULL);
|
||||
}
|
||||
|
||||
strbuf_reset(&buf);
|
||||
|
||||
for (ref = remote_refs; ref; ref = ref->next) {
|
||||
@ -761,8 +751,7 @@ static int push_refs_with_export(struct transport *transport,
|
||||
|
||||
}
|
||||
|
||||
if (get_exporter(transport, &exporter,
|
||||
export_marks, import_marks, &revlist_args))
|
||||
if (get_exporter(transport, &exporter, &revlist_args))
|
||||
die("Couldn't run fast-export");
|
||||
|
||||
if (finish_command(&exporter))
|
||||
|
Loading…
Reference in New Issue
Block a user