Skip to content

Commit

Permalink
transport-helper: implement marks location as capability
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sverre Rabbelier authored and Junio C Hamano committed Jul 19, 2011
1 parent 4d2ec30 commit a515ebe
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 42 deletions.
24 changes: 11 additions & 13 deletions git-remote-testgit.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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)

Expand Down
47 changes: 18 additions & 29 deletions transport-helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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));
Expand All @@ -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;
Expand Down Expand Up @@ -713,34 +724,13 @@ 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;

helper = get_helper(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) {
Expand All @@ -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))
Expand Down

0 comments on commit a515ebe

Please sign in to comment.