{"thread":{"id":"2184","subject":"[PATCH 2/3] Switched back to loading alternates as needed","startedAt":"2005-10-21T19:06:20Z","lastAt":"2005-10-21T19:06:20Z","messageCount":1,"participants":["Nick Hengeveld"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"10432","messageId":"20051021190620.GF6160@reactrix.com","threadId":"2184","inReplyTo":null,"subject":"[PATCH 2/3] Switched back to loading alternates as needed","fromName":"Nick Hengeveld","fromEmail":"nickh@reactrix.com","sentAt":"2005-10-21T19:06:20Z","receivedAt":"2005-10-21T19:06:20Z","isPatch":true,"sender":{"key":"nickh@reactrix.com","avatar":null},"body":"Switched back to loading alternates as needed\n\nSigned-off-by: Nick Hengeveld <nickh@reactrix.com>\n\n\n---\n\nAlways loading alternates causes unnecessary requests, especially\nwhen a repository is being cloned and git-http-fetch is run repeatedly\nwith different commit IDs.  On a related note, in such a case could we\npass multiple IDs to the commit walkers (perhaps via stdin?)\n\n http-fetch.c |   45 +++++++++++++++++++++++++++++----------------\n 1 files changed, 29 insertions(+), 16 deletions(-)\n\napplies-to: 6a0c92c60e0b46581276e7592e4f7a1b12f3dc7e\n274889e0d7a97eaf060851653166b7cbc72dd3f6\ndiff --git a/http-fetch.c b/http-fetch.c\nindex d26fae8..ed1053a 100644\n--- a/http-fetch.c\n+++ b/http-fetch.c\n@@ -25,6 +25,7 @@\n #define PREV_BUF_SIZE 4096\n #define RANGE_HEADER_SIZE 30\n \n+static int got_alternates = 0;\n static int active_requests = 0;\n static int data_received;\n \n@@ -85,6 +86,7 @@ struct active_request_slot\n \tint in_use;\n \tint done;\n \tCURLcode curl_result;\n+\tlong http_code;\n \tstruct active_request_slot *next;\n };\n \n@@ -235,6 +237,7 @@ static size_t fwrite_sha1_file(void *ptr\n static void process_curl_messages(void);\n static void process_request_queue(void);\n #endif\n+static int fetch_alternates(char *base);\n \n static CURL* get_curl_handle(void)\n {\n@@ -580,6 +583,9 @@ void process_curl_messages(void)\n \t\t\t\tslot->done = 1;\n \t\t\t\tslot->in_use = 0;\n \t\t\t\tslot->curl_result = curl_message->data.result;\n+\t\t\t\tcurl_easy_getinfo(slot->curl,\n+\t\t\t\t\t\t  CURLINFO_HTTP_CODE,\n+\t\t\t\t\t\t  &slot->http_code);\n \t\t\t\trequest = request_queue_head;\n \t\t\t\twhile (request != NULL &&\n \t\t\t\t       request->slot != slot)\n@@ -590,19 +596,20 @@ void process_curl_messages(void)\n \t\t\tif (request != NULL) {\n \t\t\t\trequest->curl_result =\n \t\t\t\t\tcurl_message->data.result;\n-\t\t\t\tcurl_easy_getinfo(slot->curl,\n-\t\t\t\t\t\t  CURLINFO_HTTP_CODE,\n-\t\t\t\t\t\t  &request->http_code);\n+\t\t\t\trequest->http_code = slot->http_code;\n \t\t\t\trequest->slot = NULL;\n+\t\t\t\trequest->state = COMPLETE;\n \n \t\t\t\t/* Use alternates if necessary */\n-\t\t\t\tif (request->http_code == 404 &&\n-\t\t\t\t    request->repo->next != NULL) {\n-\t\t\t\t\trequest->repo = request->repo->next;\n-\t\t\t\t\tstart_request(request);\n+\t\t\t\tif (request->http_code == 404) {\n+\t\t\t\t\tfetch_alternates(alt->base);\n+\t\t\t\t\tif (request->repo->next != NULL) {\n+\t\t\t\t\t\trequest->repo =\n+\t\t\t\t\t\t\trequest->repo->next;\n+\t\t\t\t\t\tstart_request(request);\n+\t\t\t\t\t}\n \t\t\t\t} else {\n \t\t\t\t\tfinish_request(request);\n-\t\t\t\t\trequest->state = COMPLETE;\n \t\t\t\t}\n \t\t\t}\n \t\t} else {\n@@ -765,6 +772,9 @@ static int fetch_alternates(char *base)\n \n \tstruct active_request_slot *slot;\n \n+\tif (got_alternates)\n+\t\treturn 0;\n+\n \tdata = xmalloc(4096);\n \tbuffer.size = 4096;\n \tbuffer.posn = 0;\n@@ -797,6 +807,8 @@ static int fetch_alternates(char *base)\n \t\t\t\trun_active_slot(slot);\n \t\t\t\tif (slot->curl_result != CURLE_OK) {\n \t\t\t\t\tfree(buffer.buffer);\n+\t\t\t\t\tif (slot->http_code == 404)\n+\t\t\t\t\t\tgot_alternates = 1;\n \t\t\t\t\treturn 0;\n \t\t\t\t}\n \t\t\t}\n@@ -868,6 +880,7 @@ static int fetch_alternates(char *base)\n \t\ti = posn + 1;\n \t}\n \n+\tgot_alternates = 1;\n \tfree(buffer.buffer);\n \treturn ret;\n }\n@@ -1059,16 +1072,16 @@ static int fetch_object(struct alt_base \n \t\trun_active_slot(request->slot);\n #ifndef USE_CURL_MULTI\n \t\trequest->curl_result = request->slot->curl_result;\n-\t\tcurl_easy_getinfo(request->slot->curl,\n-\t\t\t\t  CURLINFO_HTTP_CODE,\n-\t\t\t\t  &request->http_code);\n+\t\trequest->http_code = request->slot->http_code;\n \t\trequest->slot = NULL;\n \n \t\t/* Use alternates if necessary */\n-\t\tif (request->http_code == 404 &&\n-\t\t    request->repo->next != NULL) {\n-\t\t\trequest->repo = request->repo->next;\n-\t\t\tstart_request(request);\n+\t\tif (request->http_code == 404) {\n+\t\t\tfetch_alternates(alt->base);\n+\t\t\tif (request->repo->next != NULL) {\n+\t\t\t\trequest->repo = request->repo->next;\n+\t\t\t\tstart_request(request);\n+\t\t\t}\n \t\t} else {\n \t\t\tfinish_request(request);\n \t\t\trequest->state = COMPLETE;\n@@ -1121,6 +1134,7 @@ int fetch(unsigned char *sha1)\n \twhile (altbase) {\n \t\tif (!fetch_pack(altbase, sha1))\n \t\t\treturn 0;\n+\t\tfetch_alternates(alt->base);\n \t\taltbase = altbase->next;\n \t}\n \treturn error(\"Unable to find %s under %s\\n\", sha1_to_hex(sha1), \n@@ -1297,7 +1311,6 @@ int main(int argc, char **argv)\n \talt->got_indices = 0;\n \talt->packs = NULL;\n \talt->next = NULL;\n-\tfetch_alternates(alt->base);\n \n \tif (pull(commit_id))\n \t\treturn 1;\n---\n0.99.8.GIT\n"}]}