Move fetch_ref from http-push.c and http-walker.c to http.c
Make the necessary changes to be ok with their difference, and rename the function http_fetch_ref. Signed-off-by: Mike Hommey <mh@glandium.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
3a462bc9ba
commit
d7e92806cd
88
http-push.c
88
http-push.c
|
@ -1067,88 +1067,6 @@ static int fetch_indices(void)
|
||||||
return 0;
|
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)
|
static void one_remote_object(const char *hex)
|
||||||
{
|
{
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
|
@ -1834,7 +1752,8 @@ static void one_remote_ref(char *refname)
|
||||||
struct object *obj;
|
struct object *obj;
|
||||||
int len = strlen(refname) + 1;
|
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,
|
fprintf(stderr,
|
||||||
"Unable to fetch ref %s from %s\n",
|
"Unable to fetch ref %s from %s\n",
|
||||||
refname, remote->url);
|
refname, remote->url);
|
||||||
|
@ -1966,7 +1885,8 @@ static void add_remote_info_ref(struct remote_ls_ctx *ls)
|
||||||
int len;
|
int len;
|
||||||
char *ref_info;
|
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,
|
fprintf(stderr,
|
||||||
"Unable to fetch ref %s from %s\n",
|
"Unable to fetch ref %s from %s\n",
|
||||||
ls->dentry_name, remote->url);
|
ls->dentry_name, remote->url);
|
||||||
|
|
|
@ -888,88 +888,10 @@ static int fetch(struct walker *walker, unsigned char *sha1)
|
||||||
data->alt->base);
|
data->alt->base);
|
||||||
}
|
}
|
||||||
|
|
||||||
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 + 7; /* "/refs/" + NUL */
|
|
||||||
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);
|
|
||||||
memcpy(qref + baselen, "/refs/", 6);
|
|
||||||
for (cp = ref, dp = qref + baselen + 6; (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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int fetch_ref(struct walker *walker, char *ref, unsigned char *sha1)
|
static int fetch_ref(struct walker *walker, char *ref, unsigned char *sha1)
|
||||||
{
|
{
|
||||||
char *url;
|
|
||||||
struct strbuf buffer = STRBUF_INIT;
|
|
||||||
struct walker_data *data = walker->data;
|
struct walker_data *data = walker->data;
|
||||||
const char *base = data->alt->base;
|
return http_fetch_ref(data->alt->base, ref, sha1);
|
||||||
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 cleanup(struct walker *walker)
|
static void cleanup(struct walker *walker)
|
||||||
|
|
82
http.c
82
http.c
|
@ -552,3 +552,85 @@ void finish_all_active_slots(void)
|
||||||
slot = slot->next;
|
slot = slot->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 + 7; /* "/refs/" + NUL */
|
||||||
|
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);
|
||||||
|
memcpy(qref + baselen, "/refs/", 6);
|
||||||
|
for (cp = ref, dp = qref + baselen + 6; (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 http_fetch_ref(const char *base, const char *ref, unsigned char *sha1)
|
||||||
|
{
|
||||||
|
char *url;
|
||||||
|
struct strbuf buffer = STRBUF_INIT;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
2
http.h
2
http.h
|
@ -96,4 +96,6 @@ static inline int missing__target(int code, int result)
|
||||||
|
|
||||||
#define missing_target(a) missing__target((a)->http_code, (a)->curl_result)
|
#define missing_target(a) missing__target((a)->http_code, (a)->curl_result)
|
||||||
|
|
||||||
|
extern int http_fetch_ref(const char *base, const char *ref, unsigned char *sha1);
|
||||||
|
|
||||||
#endif /* HTTP_H */
|
#endif /* HTTP_H */
|
||||||
|
|
Loading…
Reference in New Issue