summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--http-push.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/http-push.c b/http-push.c
index 134d405ba2..6a241aab05 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);
}