diff options
author | Daniel Barkalow <barkalow@iabervon.org> | 2009-11-18 02:42:27 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-11-17 21:45:44 -0800 |
commit | e65e91ed4af5ed9c5c810a2cd77b8648a0287e66 (patch) | |
tree | 06cf3f0ff7d15b6be006a1a9606c52208cf1e134 | |
parent | 87422439d100f020cadb63b5da8495e5fbfb8fa3 (diff) | |
download | git-e65e91ed4af5ed9c5c810a2cd77b8648a0287e66.tar.gz |
Add support for "import" helper command
This command, supported if the "import" capability is advertized,
allows a helper to support fetching by outputting a git-fast-import
stream.
If both "fetch" and "import" are advertized, git itself will use
"fetch" (although other users may use "import" in this case).
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | Documentation/git-remote-helpers.txt | 10 | ||||
-rw-r--r-- | transport-helper.c | 52 |
2 files changed, 62 insertions, 0 deletions
diff --git a/Documentation/git-remote-helpers.txt b/Documentation/git-remote-helpers.txt index 173ee232f2..e9aa67e757 100644 --- a/Documentation/git-remote-helpers.txt +++ b/Documentation/git-remote-helpers.txt @@ -43,6 +43,13 @@ Commands are given by the caller on the helper's standard input, one per line. + Supported if the helper has the "fetch" capability. +'import' <name>:: + Produces a fast-import stream which imports the current value + of the named ref. It may additionally import other refs as + needed to construct the history efficiently. ++ +Supported if the helper has the "import" capability. + If a fatal error occurs, the program writes the error message to stderr and exits. The caller should expect that a suitable error message has been printed if the child closes the connection without @@ -57,6 +64,9 @@ CAPABILITIES 'fetch':: This helper supports the 'fetch' command. +'import':: + This helper supports the 'import' command. + REF LIST ATTRIBUTES ------------------- diff --git a/transport-helper.c b/transport-helper.c index 53d8f08ee9..82caaaead6 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -11,6 +11,7 @@ struct helper_data const char *name; struct child_process *helper; unsigned fetch : 1; + unsigned import : 1; }; static struct child_process *get_helper(struct transport *transport) @@ -48,6 +49,8 @@ static struct child_process *get_helper(struct transport *transport) break; if (!strcmp(buf.buf, "fetch")) data->fetch = 1; + if (!strcmp(buf.buf, "import")) + data->import = 1; } return data->helper; } @@ -98,6 +101,52 @@ static int fetch_with_fetch(struct transport *transport, return 0; } +static int get_importer(struct transport *transport, struct child_process *fastimport) +{ + struct child_process *helper = get_helper(transport); + memset(fastimport, 0, sizeof(*fastimport)); + fastimport->in = helper->out; + fastimport->argv = xcalloc(5, sizeof(*fastimport->argv)); + fastimport->argv[0] = "fast-import"; + fastimport->argv[1] = "--quiet"; + + fastimport->git_cmd = 1; + return start_command(fastimport); +} + +static int fetch_with_import(struct transport *transport, + int nr_heads, struct ref **to_fetch) +{ + struct child_process fastimport; + struct child_process *helper = get_helper(transport); + int i; + struct ref *posn; + struct strbuf buf = STRBUF_INIT; + + if (get_importer(transport, &fastimport)) + die("Couldn't run fast-import"); + + for (i = 0; i < nr_heads; i++) { + posn = to_fetch[i]; + if (posn->status & REF_STATUS_UPTODATE) + continue; + + strbuf_addf(&buf, "import %s\n", posn->name); + write_in_full(helper->in, buf.buf, buf.len); + strbuf_reset(&buf); + } + disconnect_helper(transport); + finish_command(&fastimport); + + for (i = 0; i < nr_heads; i++) { + posn = to_fetch[i]; + if (posn->status & REF_STATUS_UPTODATE) + continue; + read_ref(posn->name, posn->old_sha1); + } + return 0; +} + static int fetch(struct transport *transport, int nr_heads, struct ref **to_fetch) { @@ -115,6 +164,9 @@ static int fetch(struct transport *transport, if (data->fetch) return fetch_with_fetch(transport, nr_heads, to_fetch); + if (data->import) + return fetch_with_import(transport, nr_heads, to_fetch); + return -1; } |