diff --git a/http-walker.c b/http-walker.c index 6ac17831dbce0f0d629d708eee92ecdebcd69633..bbc3023e40021877a9fd1bba9e36d97ca6e06a23 100644 --- a/http-walker.c +++ b/http-walker.c @@ -384,24 +384,48 @@ static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned ch struct active_request_slot *slot; struct slot_results results; - if (has_pack_index(sha1)) + /* Don't use the index if the pack isn't there */ + url = xmalloc(strlen(repo->base) + 64); + sprintf(url, "%s/objects/pack/pack-%s.pack", repo->base, hex); + slot = get_active_slot(); + slot->results = &results; + curl_easy_setopt(slot->curl, CURLOPT_URL, url); + curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 1); + if (start_active_slot(slot)) { + run_active_slot(slot); + if (results.curl_result != CURLE_OK) { + free(url); + return error("Unable to verify pack %s is available", + hex); + } + } else { + free(url); + return error("Unable to start request"); + } + + if (has_pack_index(sha1)) { + free(url); return 0; + } if (walker->get_verbosely) fprintf(stderr, "Getting index for pack %s\n", hex); - url = xmalloc(strlen(repo->base) + 64); sprintf(url, "%s/objects/pack/pack-%s.idx", repo->base, hex); filename = sha1_pack_index_name(sha1); snprintf(tmpfile, sizeof(tmpfile), "%s.temp", filename); indexfile = fopen(tmpfile, "a"); - if (!indexfile) + if (!indexfile) { + free(url); return error("Unable to open local file %s for pack index", tmpfile); + } slot = get_active_slot(); slot->results = &results; + curl_easy_setopt(slot->curl, CURLOPT_NOBODY, 0); + curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1); curl_easy_setopt(slot->curl, CURLOPT_FILE, indexfile); curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite); curl_easy_setopt(slot->curl, CURLOPT_URL, url); @@ -426,17 +450,20 @@ static int fetch_index(struct walker *walker, struct alt_base *repo, unsigned ch if (start_active_slot(slot)) { run_active_slot(slot); if (results.curl_result != CURLE_OK) { + free(url); fclose(indexfile); slot->local = NULL; return error("Unable to get pack index %s\n%s", url, curl_errorstr); } } else { + free(url); fclose(indexfile); slot->local = NULL; return error("Unable to start request"); } + free(url); fclose(indexfile); slot->local = NULL;