fetch-pack: support negotiation tip whitelist
[gitweb.git] / http-push.c
index 67c4d4b472cb1065bcfa20007fdbca55ac8e0052..7e38522098bf91c144adaee7f9f5476f8bc72cd2 100644 (file)
@@ -6,11 +6,13 @@
 #include "refs.h"
 #include "diff.h"
 #include "revision.h"
-#include "exec_cmd.h"
+#include "exec-cmd.h"
 #include "remote.h"
 #include "list-objects.h"
 #include "sigchain.h"
 #include "argv-array.h"
+#include "packfile.h"
+#include "object-store.h"
 
 #ifdef EXPAT_NEEDS_XMLPARSE_H
 #include <xmlparse.h>
@@ -291,8 +293,7 @@ static void start_mkcol(struct transfer_request *request)
                request->state = RUN_MKCOL;
        } else {
                request->state = ABORTED;
-               free(request->url);
-               request->url = NULL;
+               FREE_AND_NULL(request->url);
        }
 }
 #endif
@@ -361,8 +362,8 @@ static void start_put(struct transfer_request *request)
        ssize_t size;
        git_zstream stream;
 
-       unpacked = read_sha1_file(request->obj->oid.hash, &type, &len);
-       hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", typename(type), len) + 1;
+       unpacked = read_object_file(&request->obj->oid, &type, &len);
+       hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", type_name(type), len) + 1;
 
        /* Set it up */
        git_deflate_init(&stream, zlib_compression_level);
@@ -409,8 +410,7 @@ static void start_put(struct transfer_request *request)
                request->state = RUN_PUT;
        } else {
                request->state = ABORTED;
-               free(request->url);
-               request->url = NULL;
+               FREE_AND_NULL(request->url);
        }
 }
 
@@ -432,8 +432,7 @@ static void start_move(struct transfer_request *request)
                request->state = RUN_MOVE;
        } else {
                request->state = ABORTED;
-               free(request->url);
-               request->url = NULL;
+               FREE_AND_NULL(request->url);
        }
 }
 
@@ -526,8 +525,7 @@ static void finish_request(struct transfer_request *request)
 
        /* URL is reused for MOVE after PUT */
        if (request->state != RUN_PUT) {
-               free(request->url);
-               request->url = NULL;
+               FREE_AND_NULL(request->url);
        }
 
        if (request->state == RUN_MKCOL) {
@@ -803,8 +801,7 @@ xml_start_tag(void *userData, const char *name, const char **atts)
        }
        xsnprintf(ctx->name + old_namelen, ctx->len - old_namelen, ".%s", c);
 
-       free(ctx->cdata);
-       ctx->cdata = NULL;
+       FREE_AND_NULL(ctx->cdata);
 
        ctx->userFunc(ctx, 0);
 }
@@ -919,6 +916,10 @@ static struct remote_lock *lock_remote(const char *path, long timeout)
                                lock->timeout = -1;
                        }
                        XML_ParserFree(parser);
+               } else {
+                       fprintf(stderr,
+                               "error: curl result=%d, HTTP code=%ld\n",
+                               results.curl_result, results.http_code);
                }
        } else {
                fprintf(stderr, "Unable to start LOCK request\n");
@@ -932,8 +933,7 @@ static struct remote_lock *lock_remote(const char *path, long timeout)
                free(lock->token);
                free(lock->owner);
                free(url);
-               free(lock);
-               lock = NULL;
+               FREE_AND_NULL(lock);
        } else {
                lock->url = url;
                lock->start_time = time(NULL);
@@ -1012,20 +1012,18 @@ static void remote_ls(const char *path, int flags,
                      void (*userFunc)(struct remote_ls_ctx *ls),
                      void *userData);
 
-/* extract hex from sharded "xx/x{40}" filename */
+/* extract hex from sharded "xx/x{38}" filename */
 static int get_oid_hex_from_objpath(const char *path, struct object_id *oid)
 {
-       char hex[GIT_MAX_HEXSZ];
-
        if (strlen(path) != GIT_SHA1_HEXSZ + 1)
                return -1;
 
-       memcpy(hex, path, 2);
+       if (hex_to_bytes(oid->hash, path, 1))
+               return -1;
        path += 2;
        path++; /* skip '/' */
-       memcpy(hex, path, GIT_SHA1_HEXSZ - 2);
 
-       return get_oid_hex(hex, oid);
+       return hex_to_bytes(oid->hash + 1, path, GIT_SHA1_RAWSZ - 1);
 }
 
 static void process_ls_object(struct remote_ls_ctx *ls)
@@ -1105,8 +1103,7 @@ static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed)
                        ls->dentry_flags |= IS_DIR;
                }
        } else if (!strcmp(ctx->name, DAV_PROPFIND_RESP)) {
-               free(ls->dentry_name);
-               ls->dentry_name = NULL;
+               FREE_AND_NULL(ls->dentry_name);
                ls->dentry_flags = 0;
        }
 }
@@ -1334,7 +1331,7 @@ static int get_delta(struct rev_info *revs, struct remote_lock *lock)
        int count = 0;
 
        while ((commit = get_revision(revs)) != NULL) {
-               p = process_tree(commit->tree, p);
+               p = process_tree(get_commit_tree(commit), p);
                commit->object.flags |= LOCAL;
                if (!(commit->object.flags & UNINTERESTING))
                        count += add_send_request(&commit->object, lock);
@@ -1529,6 +1526,7 @@ static int remote_exists(const char *path)
                break;
        case HTTP_ERROR:
                error("unable to access '%s': %s", url, curl_errorstr);
+               /* fallthrough */
        default:
                ret = -1;
        }
@@ -1547,8 +1545,7 @@ static void fetch_symref(const char *path, char **symref, struct object_id *oid)
                    curl_errorstr);
        free(url);
 
-       free(*symref);
-       *symref = NULL;
+       FREE_AND_NULL(*symref);
        oidclr(oid);
 
        if (buffer.len == 0)
@@ -1695,8 +1692,7 @@ int cmd_main(int argc, const char **argv)
 {
        struct transfer_request *request;
        struct transfer_request *next_request;
-       int nr_refspec = 0;
-       const char **refspec = NULL;
+       struct refspec rs = REFSPEC_INIT_PUSH;
        struct remote_lock *ref_lock = NULL;
        struct remote_lock *info_ref_lock = NULL;
        struct rev_info revs;
@@ -1759,8 +1755,7 @@ int cmd_main(int argc, const char **argv)
                        }
                        continue;
                }
-               refspec = argv;
-               nr_refspec = argc - i;
+               refspec_appendn(&rs, argv, argc - i);
                break;
        }
 
@@ -1771,7 +1766,7 @@ int cmd_main(int argc, const char **argv)
        if (!repo->url)
                usage(http_push_usage);
 
-       if (delete_branch && nr_refspec != 1)
+       if (delete_branch && rs.nr != 1)
                die("You must specify only one branch name when deleting a remote branch");
 
        setup_git_directory();
@@ -1817,18 +1812,18 @@ int cmd_main(int argc, const char **argv)
 
        /* Remove a remote branch if -d or -D was specified */
        if (delete_branch) {
-               if (delete_remote_branch(refspec[0], force_delete) == -1) {
+               const char *branch = rs.items[i].src;
+               if (delete_remote_branch(branch, force_delete) == -1) {
                        fprintf(stderr, "Unable to delete remote branch %s\n",
-                               refspec[0]);
+                               branch);
                        if (helper_status)
-                               printf("error %s cannot remove\n", refspec[0]);
+                               printf("error %s cannot remove\n", branch);
                }
                goto cleanup;
        }
 
        /* match them up */
-       if (match_push_refs(local_refs, &remote_refs,
-                           nr_refspec, (const char **) refspec, push_all)) {
+       if (match_push_refs(local_refs, &remote_refs, &rs, push_all)) {
                rc = -1;
                goto cleanup;
        }