Skip to content

Commit

Permalink
Merge branch 'nd/clone-connectivity-shortcut'
Browse files Browse the repository at this point in the history
* nd/clone-connectivity-shortcut:
  smart http: use the same connectivity check on cloning
  • Loading branch information
Junio C Hamano committed Sep 9, 2013
2 parents 01a2a03 + 9ba3804 commit 711b276
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 1 deletion.
4 changes: 4 additions & 0 deletions Documentation/git-fetch-pack.txt
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ be in a separate packet, and the list must end with a flush packet.
--no-progress::
Do not show the progress.

--check-self-contained-and-connected::
Output "connectivity-ok" if the received pack is
self-contained and connected.

-v::
Run verbosely.

Expand Down
10 changes: 10 additions & 0 deletions Documentation/gitremote-helpers.txt
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,10 @@ Supported commands: 'list', 'fetch'.
+
Supported commands: 'list', 'import'.

'check-connectivity'::
Can guarantee that when a clone is requested, the received
pack is self contained and is connected.

If a helper advertises 'connect', Git will use it if possible and
fall back to another capability if the helper requests so when
connecting (see the 'connect' command under COMMANDS).
Expand Down Expand Up @@ -270,6 +274,9 @@ Optionally may output a 'lock <file>' line indicating a file under
GIT_DIR/objects/pack which is keeping a pack until refs can be
suitably updated.
+
If option 'check-connectivity' is requested, the helper must output
'connectivity-ok' if the clone is self-contained and connected.
+
Supported if the helper has the "fetch" capability.

'push' +<src>:<dst>::
Expand Down Expand Up @@ -416,6 +423,9 @@ set by Git if the remote helper has the 'option' capability.
must not rely on this option being set before
connect request occurs.

'option check-connectivity' \{'true'|'false'\}::
Request the helper to check connectivity of a clone.

SEE ALSO
--------
linkgit:git-remote[1]
Expand Down
9 changes: 9 additions & 0 deletions builtin/fetch-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
pack_lockfile_ptr = &pack_lockfile;
continue;
}
if (!strcmp("--check-self-contained-and-connected", arg)) {
args.check_self_contained_and_connected = 1;
continue;
}
usage(fetch_pack_usage);
}

Expand Down Expand Up @@ -152,6 +156,11 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
printf("lock %s\n", pack_lockfile);
fflush(stdout);
}
if (args.check_self_contained_and_connected &&
args.self_contained_and_connected) {
printf("connectivity-ok\n");
fflush(stdout);
}
close(fd[0]);
close(fd[1]);
if (finish_connect(conn))
Expand Down
15 changes: 14 additions & 1 deletion remote-curl.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct options {
int verbosity;
unsigned long depth;
unsigned progress : 1,
check_self_contained_and_connected : 1,
followtags : 1,
dry_run : 1,
thin : 1;
Expand Down Expand Up @@ -67,6 +68,15 @@ static int set_option(const char *name, const char *value)
return -1;
return 0;
}
else if (!strcmp(name, "check-connectivity")) {
if (!strcmp(value, "true"))
options.check_self_contained_and_connected = 1;
else if (!strcmp(value, "false"))
options.check_self_contained_and_connected = 0;
else
return -1;
return 0;
}
else {
return 1 /* unsupported */;
}
Expand Down Expand Up @@ -654,7 +664,7 @@ static int fetch_git(struct discovery *heads,
struct strbuf preamble = STRBUF_INIT;
char *depth_arg = NULL;
int argc = 0, i, err;
const char *argv[15];
const char *argv[16];

argv[argc++] = "fetch-pack";
argv[argc++] = "--stateless-rpc";
Expand All @@ -668,6 +678,8 @@ static int fetch_git(struct discovery *heads,
argv[argc++] = "-v";
argv[argc++] = "-v";
}
if (options.check_self_contained_and_connected)
argv[argc++] = "--check-self-contained-and-connected";
if (!options.progress)
argv[argc++] = "--no-progress";
if (options.depth) {
Expand Down Expand Up @@ -939,6 +951,7 @@ int main(int argc, const char **argv)
printf("fetch\n");
printf("option\n");
printf("push\n");
printf("check-connectivity\n");
printf("\n");
fflush(stdout);
} else {
Expand Down
10 changes: 10 additions & 0 deletions transport-helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ struct helper_data {
push : 1,
connect : 1,
signed_tags : 1,
check_connectivity : 1,
no_disconnect_req : 1;
char *export_marks;
char *import_marks;
Expand Down Expand Up @@ -186,6 +187,8 @@ static struct child_process *get_helper(struct transport *transport)
data->bidi_import = 1;
else if (!strcmp(capname, "export"))
data->export = 1;
else if (!strcmp(capname, "check-connectivity"))
data->check_connectivity = 1;
else if (!data->refspecs && !prefixcmp(capname, "refspec ")) {
ALLOC_GROW(refspecs,
refspec_nr + 1,
Expand Down Expand Up @@ -349,6 +352,9 @@ static int fetch_with_fetch(struct transport *transport,
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");

for (i = 0; i < nr_heads; i++) {
const struct ref *posn = to_fetch[i];
Expand All @@ -372,6 +378,10 @@ static int fetch_with_fetch(struct transport *transport,
else
transport->pack_lockfile = xstrdup(name);
}
else if (data->check_connectivity &&
data->transport_options.check_self_contained_and_connected &&
!strcmp(buf.buf, "connectivity-ok"))
data->transport_options.self_contained_and_connected = 1;
else if (!buf.len)
break;
else
Expand Down

0 comments on commit 711b276

Please sign in to comment.