http: move stuff out of negotiate_fetch Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
diff --git a/src/transport-http.c b/src/transport-http.c
index 54f5df6..269526c 100644
--- a/src/transport-http.c
+++ b/src/transport-http.c
@@ -341,52 +341,22 @@ static int http_ls(git_transport *transport, git_headarray *array)
return GIT_SUCCESS;
}
-static int http_negotiate_fetch(git_transport *transport, git_repository *repo, git_headarray *wants)
+static int setup_walk(git_revwalk **out, git_repository *repo)
{
- 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_strarray refs;
+ unsigned int i;
git_reference *ref;
- git_oid oid;
- const char *prefix = "http://", *url = t->parent.url;
- git_buf request = GIT_BUF_INIT;
-
- /* TODO: Store url in the transport */
- if (!git__prefixcmp(url, prefix))
- url += strlen(prefix);
-
- error = do_connect(t, t->host, t->port);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Faile to connect to host");
-
- error = gen_request(&request, url, t->host, "POST", "upload-pack");
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to generate request");
-
- error = gitno_send(t->socket, request.ptr, request.size, 0);
- if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to send request");
-
- 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);
+ int error;
error = git_reference_listall(&refs, repo, GIT_REF_LISTALL);
if (error < GIT_SUCCESS)
return git__rethrow(error, "Failed to list references");
error = git_revwalk_new(&walk, repo);
- if (error < GIT_ERROR) {
- error = git__rethrow(error, "Failed to list all references");
- goto cleanup;
- }
+ if (error < GIT_SUCCESS)
+ return git__rethrow(error, "Failed to setup walk");
+
git_revwalk_sorting(walk, GIT_SORT_TIME);
for (i = 0; i < refs.count; ++i) {
@@ -408,17 +378,65 @@ static int http_negotiate_fetch(git_transport *transport, git_repository *repo,
goto cleanup;
}
}
+
+ *out = walk;
+cleanup:
git_strarray_free(&refs);
- i = 0;
- while ((error = git_revwalk_next(&oid, walk)) == GIT_SUCCESS) {
- error = git_pkt_send_have(&oid, t->socket, 1);
+ return error;
+}
+
+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_revwalk *walk;
+ git_oid oid;
+ const char *prefix = "http://", *url = t->parent.url;
+ git_buf request = GIT_BUF_INIT;
+ gitno_buffer_setup(&buf, buff, sizeof(buff), t->socket);
+
+ /* TODO: Store url in the transport */
+ if (!git__prefixcmp(url, prefix))
+ url += strlen(prefix);
+
+ error = setup_walk(&walk, repo);
+ if (error < GIT_SUCCESS)
+ return git__rethrow(error, "Failed to setup walk");
+
+ do {
+ error = do_connect(t, t->host, t->port);
if (error < GIT_SUCCESS)
- return git__rethrow(error, "Failed to send have");
- i++;
- }
+ return git__rethrow(error, "Failed to connect to host");
+
+ error = gen_request(&request, url, t->host, "POST", "upload-pack");
+ if (error < GIT_SUCCESS)
+ return git__rethrow(error, "Failed to generate request");
+
+ error = gitno_send(t->socket, request.ptr, request.size, 0);
+ if (error < GIT_SUCCESS)
+ return git__rethrow(error, "Failed to send request");
+
+ error = git_pkt_send_wants(wants, &t->caps, t->socket, 1);
+ if (error < GIT_SUCCESS)
+ return git__rethrow(error, "Failed to send wants");
+
+
+ i = 0;
+ while ((error = git_revwalk_next(&oid, walk)) == GIT_SUCCESS) {
+ error = git_pkt_send_have(&oid, t->socket, 1);
+ if (error < GIT_SUCCESS)
+ return git__rethrow(error, "Failed to send have");
+ i++;
+ }
+ if (error < GIT_SUCCESS || i >= 256)
+ break;
+ } while(1);
-cleanup:
git_revwalk_free(walk);
return error;
}