diff options
Diffstat (limited to 'http-push.c')
-rw-r--r-- | http-push.c | 88 |
1 files changed, 4 insertions, 84 deletions
diff --git a/http-push.c b/http-push.c index af00ea10b..64be90492 100644 --- a/http-push.c +++ b/http-push.c @@ -1067,88 +1067,6 @@ static int fetch_indices(void) return 0; } -static inline int needs_quote(int ch) -{ - if (((ch >= 'A') && (ch <= 'Z')) - || ((ch >= 'a') && (ch <= 'z')) - || ((ch >= '0') && (ch <= '9')) - || (ch == '/') - || (ch == '-') - || (ch == '.')) - return 0; - return 1; -} - -static inline int hex(int v) -{ - if (v < 10) return '0' + v; - else return 'A' + v - 10; -} - -static char *quote_ref_url(const char *base, const char *ref) -{ - const char *cp; - char *dp, *qref; - int len, baselen, ch; - - baselen = strlen(base); - len = baselen + 1; - for (cp = ref; (ch = *cp) != 0; cp++, len++) - if (needs_quote(ch)) - len += 2; /* extra two hex plus replacement % */ - qref = xmalloc(len); - memcpy(qref, base, baselen); - for (cp = ref, dp = qref + baselen; (ch = *cp) != 0; cp++) { - if (needs_quote(ch)) { - *dp++ = '%'; - *dp++ = hex((ch >> 4) & 0xF); - *dp++ = hex(ch & 0xF); - } - else - *dp++ = ch; - } - *dp = 0; - - return qref; -} - -int fetch_ref(char *ref, unsigned char *sha1) -{ - char *url; - struct strbuf buffer = STRBUF_INIT; - char *base = remote->url; - struct active_request_slot *slot; - struct slot_results results; - int ret; - - url = quote_ref_url(base, ref); - slot = get_active_slot(); - slot->results = &results; - curl_easy_setopt(slot->curl, CURLOPT_FILE, &buffer); - curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer); - curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, NULL); - curl_easy_setopt(slot->curl, CURLOPT_URL, url); - if (start_active_slot(slot)) { - run_active_slot(slot); - if (results.curl_result == CURLE_OK) { - strbuf_rtrim(&buffer); - if (buffer.len == 40) - ret = get_sha1_hex(buffer.buf, sha1); - else - ret = 1; - } else { - ret = error("Couldn't get %s for %s\n%s", - url, ref, curl_errorstr); - } - } else { - ret = error("Unable to start request"); - } - - strbuf_release(&buffer); - free(url); - return ret; -} - static void one_remote_object(const char *hex) { unsigned char sha1[20]; @@ -1834,7 +1752,8 @@ static void one_remote_ref(char *refname) struct object *obj; int len = strlen(refname) + 1; - if (fetch_ref(refname, remote_sha1) != 0) { + if (http_fetch_ref(remote->url, refname + 5 /* "refs/" */, + remote_sha1) != 0) { fprintf(stderr, "Unable to fetch ref %s from %s\n", refname, remote->url); @@ -1966,7 +1885,8 @@ static void add_remote_info_ref(struct remote_ls_ctx *ls) int len; char *ref_info; - if (fetch_ref(ls->dentry_name, remote_sha1) != 0) { + if (http_fetch_ref(remote->url, ls->dentry_name + 5 /* "refs/" */, + remote_sha1) != 0) { fprintf(stderr, "Unable to fetch ref %s from %s\n", ls->dentry_name, remote->url); |