diff options
author | Nick Hengeveld <nickh@reactrix.com> | 2005-11-04 14:22:25 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-11-06 01:14:45 -0800 |
commit | 0772b9a6331357913417722eab672f8b5aa69e50 (patch) | |
tree | 0936c3afe22429a01740793d1cde9cb39f8c84d2 /http-push.c | |
parent | c17fb6ee074cb0c9d71e5de42e2ad00786fedc18 (diff) | |
download | git-0772b9a6331357913417722eab672f8b5aa69e50.tar.gz git-0772b9a6331357913417722eab672f8b5aa69e50.tar.xz |
Support remote references with slashes in their names
Support remote references with slashes in their names
Signed-off-by: Nick Hengeveld <nickh@reactrix.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'http-push.c')
-rw-r--r-- | http-push.c | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/http-push.c b/http-push.c index 134d405ba..6a241aab0 100644 --- a/http-push.c +++ b/http-push.c @@ -1066,12 +1066,44 @@ char *lock_remote(char *file, int timeout) struct buffer out_buffer; char *out_data; char *url; + char *ep; char timeout_header[25]; struct curl_slist *dav_headers = NULL; if (lock_token != NULL) free(lock_token); + url = xmalloc(strlen(remote->url) + strlen(file) + 1); + sprintf(url, "%s%s", remote->url, file); + + /* Make sure leading directories exist for the remote ref */ + ep = strchr(url + strlen(remote->url) + 11, '/'); + while (ep) { + *ep = 0; + slot = get_active_slot(); + curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1); + curl_easy_setopt(slot->curl, CURLOPT_URL, url); + curl_easy_setopt(slot->curl, CURLOPT_CUSTOMREQUEST, DAV_MKCOL); + curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_null); + if (start_active_slot(slot)) { + run_active_slot(slot); + if (slot->curl_result != CURLE_OK && + slot->http_code != 405) { + fprintf(stderr, + "Unable to create branch path %s\n", + url); + free(url); + return NULL; + } + } else { + fprintf(stderr, "Unable to start request\n"); + free(url); + return NULL; + } + *ep = '/'; + ep = strchr(ep + 1, '/'); + } + out_buffer.size = strlen(LOCK_REQUEST) + strlen(git_default_email) - 2; out_data = xmalloc(out_buffer.size + 1); snprintf(out_data, out_buffer.size + 1, LOCK_REQUEST, git_default_email); @@ -1079,8 +1111,6 @@ char *lock_remote(char *file, int timeout) out_buffer.buffer = out_data; sprintf(timeout_header, "Timeout: Second-%d", timeout); - url = xmalloc(strlen(remote->url) + strlen(file) + 1); - sprintf(url, "%s%s", remote->url, file); dav_headers = curl_slist_append(dav_headers, timeout_header); dav_headers = curl_slist_append(dav_headers, "Content-Type: text/xml"); @@ -1098,16 +1128,22 @@ char *lock_remote(char *file, int timeout) if (start_active_slot(slot)) { run_active_slot(slot); - free(out_data); if (slot->curl_result != CURLE_OK) { fprintf(stderr, "Got HTTP error %ld\n", slot->http_code); + free(url); + free(out_data); return NULL; } } else { + free(url); free(out_data); fprintf(stderr, "Unable to start request\n"); + return NULL; } + free(url); + free(out_data); + return strdup(lock_token); } |