зеркало из https://github.com/microsoft/git.git
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:
Родитель
4d2ec306e8
Коммит
a515ebe9f1
|
@ -72,6 +72,17 @@ def do_capabilities(repo, args):
|
||||||
print "export"
|
print "export"
|
||||||
print "refspec refs/heads/*:%s*" % repo.prefix
|
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
|
print # end capabilities
|
||||||
|
|
||||||
|
|
||||||
|
@ -147,19 +158,6 @@ def do_export(repo, args):
|
||||||
if not repo.gitdir:
|
if not repo.gitdir:
|
||||||
die("Need gitdir to export")
|
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)
|
update_local_repo(repo)
|
||||||
changed = repo.importer.do_import(repo.gitdir)
|
changed = repo.importer.do_import(repo.gitdir)
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,8 @@ struct helper_data {
|
||||||
push : 1,
|
push : 1,
|
||||||
connect : 1,
|
connect : 1,
|
||||||
no_disconnect_req : 1;
|
no_disconnect_req : 1;
|
||||||
|
char *export_marks;
|
||||||
|
char *import_marks;
|
||||||
/* These go from remote name (as in "list") to private name */
|
/* These go from remote name (as in "list") to private name */
|
||||||
struct refspec *refspecs;
|
struct refspec *refspecs;
|
||||||
int refspec_nr;
|
int refspec_nr;
|
||||||
|
@ -184,6 +186,16 @@ static struct child_process *get_helper(struct transport *transport)
|
||||||
refspecs[refspec_nr++] = strdup(capname + strlen("refspec "));
|
refspecs[refspec_nr++] = strdup(capname + strlen("refspec "));
|
||||||
} else if (!strcmp(capname, "connect")) {
|
} else if (!strcmp(capname, "connect")) {
|
||||||
data->connect = 1;
|
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) {
|
} else if (mandatory) {
|
||||||
die("Unknown mandatory capability %s. This remote "
|
die("Unknown mandatory capability %s. This remote "
|
||||||
"helper probably needs newer version of Git.\n",
|
"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,
|
static int get_exporter(struct transport *transport,
|
||||||
struct child_process *fastexport,
|
struct child_process *fastexport,
|
||||||
const char *export_marks,
|
|
||||||
const char *import_marks,
|
|
||||||
struct string_list *revlist_args)
|
struct string_list *revlist_args)
|
||||||
{
|
{
|
||||||
|
struct helper_data *data = transport->data;
|
||||||
struct child_process *helper = get_helper(transport);
|
struct child_process *helper = get_helper(transport);
|
||||||
int argc = 0, i;
|
int argc = 0, i;
|
||||||
memset(fastexport, 0, sizeof(*fastexport));
|
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 = xcalloc(5 + revlist_args->nr, sizeof(*fastexport->argv));
|
||||||
fastexport->argv[argc++] = "fast-export";
|
fastexport->argv[argc++] = "fast-export";
|
||||||
fastexport->argv[argc++] = "--use-done-feature";
|
fastexport->argv[argc++] = "--use-done-feature";
|
||||||
if (export_marks)
|
if (data->export_marks)
|
||||||
fastexport->argv[argc++] = export_marks;
|
fastexport->argv[argc++] = data->export_marks;
|
||||||
if (import_marks)
|
if (data->import_marks)
|
||||||
fastexport->argv[argc++] = import_marks;
|
fastexport->argv[argc++] = data->import_marks;
|
||||||
|
|
||||||
for (i = 0; i < revlist_args->nr; i++)
|
for (i = 0; i < revlist_args->nr; i++)
|
||||||
fastexport->argv[argc++] = revlist_args->items[i].string;
|
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 ref *ref;
|
||||||
struct child_process *helper, exporter;
|
struct child_process *helper, exporter;
|
||||||
struct helper_data *data = transport->data;
|
struct helper_data *data = transport->data;
|
||||||
char *export_marks = NULL, *import_marks = NULL;
|
|
||||||
struct string_list revlist_args = STRING_LIST_INIT_NODUP;
|
struct string_list revlist_args = STRING_LIST_INIT_NODUP;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
|
||||||
|
@ -721,26 +731,6 @@ static int push_refs_with_export(struct transport *transport,
|
||||||
|
|
||||||
write_constant(helper->in, "export\n");
|
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);
|
strbuf_reset(&buf);
|
||||||
|
|
||||||
for (ref = remote_refs; ref; ref = ref->next) {
|
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,
|
if (get_exporter(transport, &exporter, &revlist_args))
|
||||||
export_marks, import_marks, &revlist_args))
|
|
||||||
die("Couldn't run fast-export");
|
die("Couldn't run fast-export");
|
||||||
|
|
||||||
if (finish_command(&exporter))
|
if (finish_command(&exporter))
|
||||||
|
|
Загрузка…
Ссылка в новой задаче