static int http_fetch_pack(struct walker *walker, struct alt_base *repo, unsigned char *sha1) { struct packed_git *target; int ret; struct slot_results results; struct http_pack_request *preq; if (fetch_indices(walker, repo)) return -1; target = find_sha1_pack(sha1, repo->packs); if (!target) return -1; if (walker->get_verbosely) { fprintf(stderr, "Getting pack %s\n", sha1_to_hex(target->sha1)); fprintf(stderr, " which contains %s\n", sha1_to_hex(sha1)); } preq = new_http_pack_request(target, repo->base); if (preq == NULL) goto abort; preq->lst = &repo->packs; preq->slot->results = &results; if (start_active_slot(preq->slot)) { run_active_slot(preq->slot); if (results.curl_result != CURLE_OK) { error("Unable to get pack file %s\n%s", preq->url, curl_errorstr); goto abort; } } else { error("Unable to start request"); goto abort; } ret = finish_http_pack_request(preq); release_http_pack_request(preq); if (ret) return ret; return 0; abort: return -1; }
static void finish_request(struct transfer_request *request) { struct http_pack_request *preq; struct http_object_request *obj_req; request->curl_result = request->slot->curl_result; request->http_code = request->slot->http_code; request->slot = NULL; /* Keep locks active */ check_locks(); if (request->headers != NULL) curl_slist_free_all(request->headers); /* URL is reused for MOVE after PUT */ if (request->state != RUN_PUT) { FREE_AND_NULL(request->url); } if (request->state == RUN_MKCOL) { if (request->curl_result == CURLE_OK || request->http_code == 405) { remote_dir_exists[request->obj->oid.hash[0]] = 1; start_put(request); } else { fprintf(stderr, "MKCOL %s failed, aborting (%d/%ld)\n", oid_to_hex(&request->obj->oid), request->curl_result, request->http_code); request->state = ABORTED; aborted = 1; } } else if (request->state == RUN_PUT) { if (request->curl_result == CURLE_OK) { start_move(request); } else { fprintf(stderr, "PUT %s failed, aborting (%d/%ld)\n", oid_to_hex(&request->obj->oid), request->curl_result, request->http_code); request->state = ABORTED; aborted = 1; } } else if (request->state == RUN_MOVE) { if (request->curl_result == CURLE_OK) { if (push_verbosely) fprintf(stderr, " sent %s\n", oid_to_hex(&request->obj->oid)); request->obj->flags |= REMOTE; release_request(request); } else { fprintf(stderr, "MOVE %s failed, aborting (%d/%ld)\n", oid_to_hex(&request->obj->oid), request->curl_result, request->http_code); request->state = ABORTED; aborted = 1; } } else if (request->state == RUN_FETCH_LOOSE) { obj_req = (struct http_object_request *)request->userData; if (finish_http_object_request(obj_req) == 0) if (obj_req->rename == 0) request->obj->flags |= (LOCAL | REMOTE); /* Try fetching packed if necessary */ if (request->obj->flags & LOCAL) { release_http_object_request(obj_req); release_request(request); } else start_fetch_packed(request); } else if (request->state == RUN_FETCH_PACKED) { int fail = 1; if (request->curl_result != CURLE_OK) { fprintf(stderr, "Unable to get pack file %s\n%s", request->url, curl_errorstr); } else { preq = (struct http_pack_request *)request->userData; if (preq) { if (finish_http_pack_request(preq) == 0) fail = 0; release_http_pack_request(preq); } } if (fail) repo->can_update_info_refs = 0; release_request(request); } }