X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=http-fetch.c;h=ce3df5f35c1fe16dbafec299ade95bb706d86e77;hb=070879ca93a7d358086f4c8aff4553493dcb9210;hp=72edf28b0010ad107bae16a7330bad34f4bb5bca;hpb=8fcf7f9af5ba629f56f491791ae46ad2e939f3b5;p=git.git diff --git a/http-fetch.c b/http-fetch.c index 72edf28b..ce3df5f3 100644 --- a/http-fetch.c +++ b/http-fetch.c @@ -311,7 +311,7 @@ void fill_active_slots(void) while (active_requests < max_requests && obj_req != NULL) { if (obj_req->state == WAITING) { if (has_sha1_file(obj_req->sha1)) - release_object_request(obj_req); + obj_req->state = COMPLETE; else start_object_request(obj_req); curl_multi_perform(curlm, &num_transfers); @@ -468,13 +468,11 @@ static void process_alternates_response(void *callback_data) alt_req->url); active_requests++; slot->in_use = 1; - if (start_active_slot(slot)) { - return; - } else { + if (!start_active_slot(slot)) { got_alternates = -1; slot->in_use = 0; - return; } + return; } } else if (slot->curl_result != CURLE_OK) { if (slot->http_code != 404 && @@ -775,6 +773,20 @@ static int fetch_pack(struct alt_base *repo, unsigned char *sha1) return 0; } +static void abort_object_request(struct object_request *obj_req) +{ + if (obj_req->local >= 0) { + close(obj_req->local); + obj_req->local = -1; + } + unlink(obj_req->tmpfile); + if (obj_req->slot) { + release_active_slot(obj_req->slot); + obj_req->slot = NULL; + } + release_object_request(obj_req); +} + static int fetch_object(struct alt_base *repo, unsigned char *sha1) { char *hex = sha1_to_hex(sha1); @@ -787,7 +799,7 @@ static int fetch_object(struct alt_base *repo, unsigned char *sha1) return error("Couldn't find request for %s in the queue", hex); if (has_sha1_file(obj_req->sha1)) { - release_object_request(obj_req); + abort_object_request(obj_req); return 0; } @@ -822,9 +834,8 @@ static int fetch_object(struct alt_base *repo, unsigned char *sha1) } else if (memcmp(obj_req->sha1, obj_req->real_sha1, 20)) { ret = error("File %s has bad hash\n", hex); } else if (obj_req->rename < 0) { - ret = error("unable to write sha1 filename %s: %s", - obj_req->filename, - strerror(obj_req->rename)); + ret = error("unable to write sha1 filename %s", + obj_req->filename); } release_object_request(obj_req);