summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2011-09-18 20:07:49 +0200
committerVicent Marti <tanoku@gmail.com>2011-10-12 21:33:18 +0200
commit1636ba5a0dc5c6c050a851951aa499572f820da0 (patch)
tree79f2dd2de6a23ff7df8e31d6be034292980595c7
parent747bf5f14c8fa3d26cfcdc093ea9c1c553ed09c6 (diff)
downloadlibgit2-1636ba5a0dc5c6c050a851951aa499572f820da0.tar.gz
transport: don't have an extra send-wants step
It's a bit awkward to run it as an extra step, and HTTP may need to send the wants list several times. Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
-rw-r--r--src/fetch.c7
-rw-r--r--src/transport-http.c31
-rw-r--r--src/transport.h8
-rw-r--r--src/transport_git.c23
-rw-r--r--src/transport_local.c18
5 files changed, 19 insertions, 68 deletions
diff --git a/src/fetch.c b/src/fetch.c
index cc3744b89..8602cd7fe 100644
--- a/src/fetch.c
+++ b/src/fetch.c
@@ -103,7 +103,6 @@ cleanup:
int git_fetch_negotiate(git_remote *remote)
{
int error;
- git_headarray *list = &remote->refs;
git_transport *t = remote->transport;
error = filter_wants(remote);
@@ -111,7 +110,7 @@ int git_fetch_negotiate(git_remote *remote)
return git__rethrow(error, "Failed to filter the reference list for wants");
/* Don't try to negotiate when we don't want anything */
- if (list->len == 0)
+ if (remote->refs.len == 0)
return GIT_SUCCESS;
if (!remote->need_pack)
return GIT_SUCCESS;
@@ -120,10 +119,6 @@ int git_fetch_negotiate(git_remote *remote)
* Now we have everything set up so we can start tell the server
* what we want and what we have.
*/
- error = t->send_wants(t, list);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to send want list");
-
return t->negotiate_fetch(t, remote->repo, &remote->refs);
}
diff --git a/src/transport-http.c b/src/transport-http.c
index 109c9ee86..54f5df692 100644
--- a/src/transport-http.c
+++ b/src/transport-http.c
@@ -341,12 +341,20 @@ static int http_ls(git_transport *transport, git_headarray *array)
return GIT_SUCCESS;
}
-static int http_send_wants(git_transport *transport, git_headarray *array)
+static int http_negotiate_fetch(git_transport *transport, git_repository *repo, git_headarray *wants)
{
transport_http *t = (transport_http *) transport;
+ GIT_UNUSED_ARG(list);
+ int error;
+ unsigned int i;
+ char buff[128];
+ gitno_buffer buf;
+ git_strarray refs;
+ git_revwalk *walk;
+ git_reference *ref;
+ git_oid oid;
const char *prefix = "http://", *url = t->parent.url;
git_buf request = GIT_BUF_INIT;
- int error;
/* TODO: Store url in the transport */
if (!git__prefixcmp(url, prefix))
@@ -364,21 +372,9 @@ static int http_send_wants(git_transport *transport, git_headarray *array)
if (error < GIT_SUCCESS)
return git__rethrow(error, "Failed to send request");
- return git_pkt_send_wants(array, &t->caps, t->socket, 1);
-}
-
-static int http_negotiate_fetch(git_transport *transport, git_repository *repo, git_headarray *GIT_UNUSED(list))
-{
- transport_http *t = (transport_http *) transport;
- GIT_UNUSED_ARG(list);
- int error;
- unsigned int i;
- char buff[128];
- gitno_buffer buf;
- git_strarray refs;
- git_revwalk *walk;
- git_reference *ref;
- git_oid oid;
+ error = git_pkt_send_wants(wants, &t->caps, t->socket, 1);
+ if (error < GIT_SUCCESS)
+ return git__rethrow(error, "Failed to send wants");
gitno_buffer_setup(&buf, buff, sizeof(buff), t->socket);
@@ -481,7 +477,6 @@ int git_transport_http(git_transport **out)
t->parent.connect = http_connect;
t->parent.ls = http_ls;
- t->parent.send_wants = http_send_wants;
t->parent.negotiate_fetch = http_negotiate_fetch;
t->parent.close = http_close;
t->parent.free = http_free;
diff --git a/src/transport.h b/src/transport.h
index eaa50d629..23b83b690 100644
--- a/src/transport.h
+++ b/src/transport.h
@@ -67,14 +67,6 @@ struct git_transport {
*/
int (*push)(struct git_transport *transport);
/**
- * Send the list of 'want' refs
- */
- int (*send_wants)(struct git_transport *transport, git_headarray *list);
- /**
- * Send the list of 'have' refs
- */
- int (*send_have)(struct git_transport *transport, git_oid *oid);
- /**
* Send a 'done' message
*/
int (*send_done)(struct git_transport *transport);
diff --git a/src/transport_git.c b/src/transport_git.c
index d3d57471d..e4c5a0791 100644
--- a/src/transport_git.c
+++ b/src/transport_git.c
@@ -265,21 +265,7 @@ static int git_ls(git_transport *transport, git_headarray *array)
return GIT_SUCCESS;
}
-static int git_send_wants(git_transport *transport, git_headarray *array)
-{
- transport_git *t = (transport_git *) transport;
-
- return git_pkt_send_wants(array, &t->caps, t->socket, 0);
-}
-
-static int git_send_have(git_transport *transport, git_oid *oid)
-{
- transport_git *t = (transport_git *) transport;
-
- return git_pkt_send_have(oid, t->socket, 0);
-}
-
-static int git_negotiate_fetch(git_transport *transport, git_repository *repo, git_headarray *GIT_UNUSED(list))
+static int git_negotiate_fetch(git_transport *transport, git_repository *repo, git_headarray *wants)
{
transport_git *t = (transport_git *) transport;
git_revwalk *walk;
@@ -290,7 +276,10 @@ static int git_negotiate_fetch(git_transport *transport, git_repository *repo, g
unsigned int i;
char buff[128];
gitno_buffer buf;
- GIT_UNUSED_ARG(list);
+
+ error = git_pkt_send_wants(wants, &t->caps, t->socket, 0);
+ if (error < GIT_SUCCESS)
+ return git__rethrow(error, "Failed to send wants list");
gitno_buffer_setup(&buf, buff, sizeof(buff), t->socket);
@@ -548,8 +537,6 @@ int git_transport_git(git_transport **out)
t->parent.connect = git_connect;
t->parent.ls = git_ls;
- t->parent.send_wants = git_send_wants;
- t->parent.send_have = git_send_have;
t->parent.negotiate_fetch = git_negotiate_fetch;
t->parent.send_flush = git_send_flush;
t->parent.send_done = git_send_done;
diff --git a/src/transport_local.c b/src/transport_local.c
index 7e932f846..3f47e9b89 100644
--- a/src/transport_local.c
+++ b/src/transport_local.c
@@ -19,7 +19,6 @@ typedef struct {
git_transport parent;
git_repository *repo;
git_vector *refs;
- git_headarray wants_list;
} transport_local;
/*
@@ -173,22 +172,6 @@ static int local_ls(git_transport *transport, git_headarray *array)
return error;
}
-static int local_send_wants(git_transport *transport, git_headarray *array)
-{
- transport_local *t = (transport_local *) transport;
- git_headarray *wants = &t->wants_list;
-
- /*
- * We need to store the list of wanted references so we can figure
- * out what to transmit later.
- */
- wants->len = array->len;
- wants->heads = array->heads;
-
- /* We're local anyway, so we don't need this */
- return GIT_SUCCESS;
-}
-
static int local_close(git_transport *GIT_UNUSED(transport))
{
/* Nothing to do */
@@ -235,7 +218,6 @@ int git_transport_local(git_transport **out)
t->parent.connect = local_connect;
t->parent.ls = local_ls;
- t->parent.send_wants = local_send_wants;
t->parent.close = local_close;
t->parent.free = local_free;