X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=http-fetch.c;h=f39e748fc03af5dc8b50188ae99fe57a84dc64a7;hb=ceae78b438d2e5ca035aec9b067643ca79ed4ccd;hp=ed1053ade3e7e71251bfcf890cb304c7ce928222;hpb=f7eb290fa0620cebc033e80216c74ab9d1573a6c;p=git.git diff --git a/http-fetch.c b/http-fetch.c index ed1053ad..f39e748f 100644 --- a/http-fetch.c +++ b/http-fetch.c @@ -269,6 +269,8 @@ static CURL* get_curl_handle(void) curl_low_speed_time); } + curl_easy_setopt(result, CURLOPT_FOLLOWLOCATION, 1); + return result; } @@ -520,12 +522,17 @@ static void start_request(struct transfer_request *request) static void finish_request(struct transfer_request *request) { + struct stat st; + fchmod(request->local, 0444); close(request->local); if (request->http_code == 416) { fprintf(stderr, "Warning: requested range invalid; we may already have all the data.\n"); } else if (request->curl_result != CURLE_OK) { + if (stat(request->tmpfile, &st) == 0) + if (st.st_size == 0) + unlink(request->tmpfile); return; } @@ -564,7 +571,7 @@ static void release_request(struct transfer_request *request) } #ifdef USE_CURL_MULTI -void process_curl_messages(void) +static void process_curl_messages(void) { int num_messages; struct active_request_slot *slot; @@ -573,6 +580,7 @@ void process_curl_messages(void) while (curl_message != NULL) { if (curl_message->msg == CURLMSG_DONE) { + int curl_result = curl_message->data.result; slot = active_queue_head; while (slot != NULL && slot->curl != curl_message->easy_handle) @@ -582,7 +590,7 @@ void process_curl_messages(void) active_requests--; slot->done = 1; slot->in_use = 0; - slot->curl_result = curl_message->data.result; + slot->curl_result = curl_result; curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CODE, &slot->http_code); @@ -594,8 +602,7 @@ void process_curl_messages(void) fprintf(stderr, "Received DONE message for unknown request!\n"); } if (request != NULL) { - request->curl_result = - curl_message->data.result; + request->curl_result = curl_result; request->http_code = slot->http_code; request->slot = NULL; request->state = COMPLETE; @@ -620,7 +627,7 @@ void process_curl_messages(void) } } -void process_request_queue(void) +static void process_request_queue(void) { struct transfer_request *request = request_queue_head; struct active_request_slot *slot = active_queue_head; @@ -781,7 +788,7 @@ static int fetch_alternates(char *base) buffer.buffer = data; if (get_verbosely) - fprintf(stderr, "Getting alternates list\n"); + fprintf(stderr, "Getting alternates list for %s\n", base); url = xmalloc(strlen(base) + 31); sprintf(url, "%s/objects/info/http-alternates", base); @@ -904,7 +911,7 @@ static int fetch_indices(struct alt_base *repo) buffer.buffer = data; if (get_verbosely) - fprintf(stderr, "Getting pack list\n"); + fprintf(stderr, "Getting pack list for %s\n", repo->base); url = xmalloc(strlen(repo->base) + 21); sprintf(url, "%s/objects/info/packs", repo->base); @@ -1095,9 +1102,12 @@ static int fetch_object(struct alt_base *repo, unsigned char *sha1) } if (request->curl_result != CURLE_OK && request->http_code != 416) { - ret = error("%s (curl_result = %d, http_code = %ld, sha1 = %s)", - request->errorstr, request->curl_result, - request->http_code, hex); + if (request->http_code == 404) + ret = -1; /* Be silent, it is probably in a pack. */ + else + ret = error("%s (curl_result = %d, http_code = %ld, sha1 = %s)", + request->errorstr, request->curl_result, + request->http_code, hex); release_request(request); return ret; } @@ -1226,6 +1236,8 @@ int main(int argc, char **argv) struct active_request_slot *slot; char *low_speed_limit; char *low_speed_time; + char *wait_url; + int rc = 0; while (arg < argc && argv[arg][0] == '-') { if (argv[arg][1] == 't') { @@ -1313,7 +1325,7 @@ int main(int argc, char **argv) alt->next = NULL; if (pull(commit_id)) - return 1; + rc = 1; curl_slist_free_all(pragma_header); curl_slist_free_all(no_pragma_header); @@ -1323,6 +1335,15 @@ int main(int argc, char **argv) #endif slot = active_queue_head; while (slot != NULL) { + if (slot->in_use) { + if (get_verbosely) { + curl_easy_getinfo(slot->curl, + CURLINFO_EFFECTIVE_URL, + &wait_url); + fprintf(stderr, "Waiting for %s\n", wait_url); + } + run_active_slot(slot); + } if (slot->curl != NULL) curl_easy_cleanup(slot->curl); slot = slot->next; @@ -1331,5 +1352,5 @@ int main(int argc, char **argv) curl_multi_cleanup(curlm); #endif curl_global_cleanup(); - return 0; + return rc; }