Merge branch 'rc/maint-http-fix'
authorJunio C Hamano <gitster@pobox.com>
Wed, 19 Aug 2009 06:33:16 +0000 (23:33 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 19 Aug 2009 06:33:16 +0000 (23:33 -0700)
* rc/maint-http-fix:
http.c: don't assume that urls don't end with slash

1  2 
http.c
diff --combined http.c
index 14d535747d943c2db3d45d82439f3ee9633ed2d9,6182640c1e8a6d2f1f259195cc73aa642e59efd2..eb0c6698013e717eda5b6005fb48666191238aab
--- 1/http.c
--- 2/http.c
+++ b/http.c
@@@ -719,7 -719,9 +719,9 @@@ void append_remote_object_url(struct st
                              const char *hex,
                              int only_two_digit_prefix)
  {
-       strbuf_addf(buf, "%s/objects/%.*s/", url, 2, hex);
+       end_url_with_slash(buf, url);
+       strbuf_addf(buf, "objects/%.*s/", 2, hex);
        if (!only_two_digit_prefix)
                strbuf_addf(buf, "%s", hex+2);
  }
@@@ -1004,6 -1006,7 +1006,6 @@@ int finish_http_pack_request(struct htt
  struct http_pack_request *new_http_pack_request(
        struct packed_git *target, const char *base_url)
  {
 -      char *url;
        char *filename;
        long prev_posn = 0;
        char range[RANGE_HEADER_SIZE];
        end_url_with_slash(&buf, base_url);
        strbuf_addf(&buf, "objects/pack/pack-%s.pack",
                sha1_to_hex(target->sha1));
 -      url = strbuf_detach(&buf, NULL);
 -      preq->url = xstrdup(url);
 +      preq->url = strbuf_detach(&buf, NULL);
  
        filename = sha1_pack_name(target->sha1);
        snprintf(preq->filename, sizeof(preq->filename), "%s", filename);
        preq->slot->local = preq->packfile;
        curl_easy_setopt(preq->slot->curl, CURLOPT_FILE, preq->packfile);
        curl_easy_setopt(preq->slot->curl, CURLOPT_WRITEFUNCTION, fwrite);
 -      curl_easy_setopt(preq->slot->curl, CURLOPT_URL, url);
 +      curl_easy_setopt(preq->slot->curl, CURLOPT_URL, preq->url);
        curl_easy_setopt(preq->slot->curl, CURLOPT_HTTPHEADER,
                no_pragma_header);
  
  
  abort:
        free(filename);
 +      free(preq->url);
 +      free(preq);
        return NULL;
  }
  
@@@ -1098,6 -1100,7 +1100,6 @@@ struct http_object_request *new_http_ob
        char *hex = sha1_to_hex(sha1);
        char *filename;
        char prevfile[PATH_MAX];
 -      char *url;
        int prevlocal;
        unsigned char prev_buf[PREV_BUF_SIZE];
        ssize_t prev_read = 0;
  
        git_SHA1_Init(&freq->c);
  
 -      url = get_remote_object_url(base_url, hex, 0);
 -      freq->url = xstrdup(url);
 +      freq->url = get_remote_object_url(base_url, hex, 0);
  
        /*
         * If a previous temp file is present, process what was already
                if (prev_posn>0) {
                        prev_posn = 0;
                        lseek(freq->localfile, 0, SEEK_SET);
 -                      ftruncate(freq->localfile, 0);
 +                      if (ftruncate(freq->localfile, 0) < 0) {
 +                              error("Couldn't truncate temporary file %s for %s: %s",
 +                                        freq->tmpfile, freq->filename, strerror(errno));
 +                              goto abort;
 +                      }
                }
        }
  
        curl_easy_setopt(freq->slot->curl, CURLOPT_FILE, freq);
        curl_easy_setopt(freq->slot->curl, CURLOPT_WRITEFUNCTION, fwrite_sha1_file);
        curl_easy_setopt(freq->slot->curl, CURLOPT_ERRORBUFFER, freq->errorstr);
 -      curl_easy_setopt(freq->slot->curl, CURLOPT_URL, url);
 +      curl_easy_setopt(freq->slot->curl, CURLOPT_URL, freq->url);
        curl_easy_setopt(freq->slot->curl, CURLOPT_HTTPHEADER, no_pragma_header);
  
        /*
  
        return freq;
  
 -      free(url);
  abort:
        free(filename);
 +      free(freq->url);
        free(freq);
        return NULL;
  }