]> git.ipfire.org Git - thirdparty/git.git/blobdiff - upload-pack.c
The 19th batch
[thirdparty/git.git] / upload-pack.c
index 281bdf85c936d5d4a5e6615ee624359b137fe730..c84c3c3b1f514e0cd1e20b6869e679d34b18c47a 100644 (file)
@@ -1,3 +1,5 @@
+#define USE_THE_REPOSITORY_VARIABLE
+
 #include "git-compat-util.h"
 #include "config.h"
 #include "environment.h"
 #include "git-compat-util.h"
 #include "config.h"
 #include "environment.h"
@@ -94,7 +96,7 @@ struct upload_pack_data {
 
        struct packet_writer writer;
 
 
        struct packet_writer writer;
 
-       const char *pack_objects_hook;
+       char *pack_objects_hook;
 
        unsigned stateless_rpc : 1;                             /* v0 only */
        unsigned no_done : 1;                                   /* v0 only */
 
        unsigned stateless_rpc : 1;                             /* v0 only */
        unsigned no_done : 1;                                   /* v0 only */
@@ -114,6 +116,7 @@ struct upload_pack_data {
        unsigned allow_ref_in_want : 1;                         /* v2 only */
        unsigned allow_sideband_all : 1;                        /* v2 only */
        unsigned seen_haves : 1;                                /* v2 only */
        unsigned allow_ref_in_want : 1;                         /* v2 only */
        unsigned allow_sideband_all : 1;                        /* v2 only */
        unsigned seen_haves : 1;                                /* v2 only */
+       unsigned allow_packfile_uris : 1;                       /* v2 only */
        unsigned advertise_sid : 1;
        unsigned sent_capabilities : 1;
 };
        unsigned advertise_sid : 1;
        unsigned sent_capabilities : 1;
 };
@@ -617,7 +620,8 @@ static void for_each_namespaced_ref_1(each_ref_fn fn,
        if (allow_hidden_refs(data->allow_uor))
                excludes = hidden_refs_to_excludes(&data->hidden_refs);
 
        if (allow_hidden_refs(data->allow_uor))
                excludes = hidden_refs_to_excludes(&data->hidden_refs);
 
-       for_each_namespaced_ref(excludes, fn, data);
+       refs_for_each_namespaced_ref(get_main_ref_store(the_repository),
+                                    excludes, fn, data);
 }
 
 
 }
 
 
@@ -705,10 +709,13 @@ static int get_reachable_list(struct upload_pack_data *data,
        struct object *o;
        char namebuf[GIT_MAX_HEXSZ + 2]; /* ^ + hash + LF */
        const unsigned hexsz = the_hash_algo->hexsz;
        struct object *o;
        char namebuf[GIT_MAX_HEXSZ + 2]; /* ^ + hash + LF */
        const unsigned hexsz = the_hash_algo->hexsz;
+       int ret;
 
        if (do_reachable_revlist(&cmd, &data->shallows, reachable,
 
        if (do_reachable_revlist(&cmd, &data->shallows, reachable,
-                                data->allow_uor) < 0)
-               return -1;
+                                data->allow_uor) < 0) {
+               ret = -1;
+               goto out;
+       }
 
        while ((i = read_in_full(cmd.out, namebuf, hexsz + 1)) == hexsz + 1) {
                struct object_id oid;
 
        while ((i = read_in_full(cmd.out, namebuf, hexsz + 1)) == hexsz + 1) {
                struct object_id oid;
@@ -732,10 +739,16 @@ static int get_reachable_list(struct upload_pack_data *data,
        }
        close(cmd.out);
 
        }
        close(cmd.out);
 
-       if (finish_command(&cmd))
-               return -1;
+       if (finish_command(&cmd)) {
+               ret = -1;
+               goto out;
+       }
 
 
-       return 0;
+       ret = 0;
+
+out:
+       child_process_clear(&cmd);
+       return ret;
 }
 
 static int has_unreachable(struct object_array *src, enum allow_uor allow_uor)
 }
 
 static int has_unreachable(struct object_array *src, enum allow_uor allow_uor)
@@ -745,7 +758,7 @@ static int has_unreachable(struct object_array *src, enum allow_uor allow_uor)
        int i;
 
        if (do_reachable_revlist(&cmd, src, NULL, allow_uor) < 0)
        int i;
 
        if (do_reachable_revlist(&cmd, src, NULL, allow_uor) < 0)
-               return 1;
+               goto error;
 
        /*
         * The commits out of the rev-list are not ancestors of
 
        /*
         * The commits out of the rev-list are not ancestors of
@@ -771,6 +784,7 @@ static int has_unreachable(struct object_array *src, enum allow_uor allow_uor)
 error:
        if (cmd.out >= 0)
                close(cmd.out);
 error:
        if (cmd.out >= 0)
                close(cmd.out);
+       child_process_clear(&cmd);
        return 1;
 }
 
        return 1;
 }
 
@@ -853,7 +867,7 @@ static void send_unshallow(struct upload_pack_data *data)
        }
 }
 
        }
 }
 
-static int check_ref(const char *refname_full, const struct object_id *oid,
+static int check_ref(const char *refname_full, const char *referent UNUSED, const struct object_id *oid,
                     int flag, void *cb_data);
 static void deepen(struct upload_pack_data *data, int depth)
 {
                     int flag, void *cb_data);
 static void deepen(struct upload_pack_data *data, int depth)
 {
@@ -872,7 +886,8 @@ static void deepen(struct upload_pack_data *data, int depth)
                 * Checking for reachable shallows requires that our refs be
                 * marked with OUR_REF.
                 */
                 * Checking for reachable shallows requires that our refs be
                 * marked with OUR_REF.
                 */
-               head_ref_namespaced(check_ref, data);
+               refs_head_ref_namespaced(get_main_ref_store(the_repository),
+                                        check_ref, data);
                for_each_namespaced_ref_1(check_ref, data);
 
                get_reachable_list(data, &reachable_shallows);
                for_each_namespaced_ref_1(check_ref, data);
 
                get_reachable_list(data, &reachable_shallows);
@@ -1203,7 +1218,7 @@ static int mark_our_ref(const char *refname, const char *refname_full,
        return 0;
 }
 
        return 0;
 }
 
-static int check_ref(const char *refname_full, const struct object_id *oid,
+static int check_ref(const char *refname_full, const char *referent UNUSED,const struct object_id *oid,
                     int flag UNUSED, void *cb_data)
 {
        const char *refname = strip_namespace(refname_full);
                     int flag UNUSED, void *cb_data)
 {
        const char *refname = strip_namespace(refname_full);
@@ -1266,19 +1281,19 @@ static void write_v0_ref(struct upload_pack_data *data,
                packet_fwrite_fmt(stdout, "%s %s\n", oid_to_hex(oid), refname_nons);
        }
        capabilities = NULL;
                packet_fwrite_fmt(stdout, "%s %s\n", oid_to_hex(oid), refname_nons);
        }
        capabilities = NULL;
-       if (!peel_iterated_oid(oid, &peeled))
+       if (!peel_iterated_oid(the_repository, oid, &peeled))
                packet_fwrite_fmt(stdout, "%s %s^{}\n", oid_to_hex(&peeled), refname_nons);
        return;
 }
 
                packet_fwrite_fmt(stdout, "%s %s^{}\n", oid_to_hex(&peeled), refname_nons);
        return;
 }
 
-static int send_ref(const char *refname, const struct object_id *oid,
+static int send_ref(const char *refname, const char *referent UNUSED, const struct object_id *oid,
                    int flag UNUSED, void *cb_data)
 {
        write_v0_ref(cb_data, refname, strip_namespace(refname), oid);
        return 0;
 }
 
                    int flag UNUSED, void *cb_data)
 {
        write_v0_ref(cb_data, refname, strip_namespace(refname), oid);
        return 0;
 }
 
-static int find_symref(const char *refname,
+static int find_symref(const char *refname, const char *referent UNUSED,
                       const struct object_id *oid UNUSED,
                       int flag, void *cb_data)
 {
                       const struct object_id *oid UNUSED,
                       int flag, void *cb_data)
 {
@@ -1287,7 +1302,8 @@ static int find_symref(const char *refname,
 
        if ((flag & REF_ISSYMREF) == 0)
                return 0;
 
        if ((flag & REF_ISSYMREF) == 0)
                return 0;
-       symref_target = resolve_ref_unsafe(refname, 0, NULL, &flag);
+       symref_target = refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
+                                               refname, 0, NULL, &flag);
        if (!symref_target || (flag & REF_ISSYMREF) == 0)
                die("'%s' is a symref but it is not?", refname);
        item = string_list_append(cb_data, strip_namespace(refname));
        if (!symref_target || (flag & REF_ISSYMREF) == 0)
                die("'%s' is a symref but it is not?", refname);
        item = string_list_append(cb_data, strip_namespace(refname));
@@ -1363,6 +1379,9 @@ static int upload_pack_config(const char *var, const char *value,
                data->allow_ref_in_want = git_config_bool(var, value);
        } else if (!strcmp("uploadpack.allowsidebandall", var)) {
                data->allow_sideband_all = git_config_bool(var, value);
                data->allow_ref_in_want = git_config_bool(var, value);
        } else if (!strcmp("uploadpack.allowsidebandall", var)) {
                data->allow_sideband_all = git_config_bool(var, value);
+       } else if (!strcmp("uploadpack.blobpackfileuri", var)) {
+               if (value)
+                       data->allow_packfile_uris = 1;
        } else if (!strcmp("core.precomposeunicode", var)) {
                precomposed_unicode = git_config_bool(var, value);
        } else if (!strcmp("transfer.advertisesid", var)) {
        } else if (!strcmp("core.precomposeunicode", var)) {
                precomposed_unicode = git_config_bool(var, value);
        } else if (!strcmp("transfer.advertisesid", var)) {
@@ -1386,10 +1405,13 @@ static int upload_pack_protected_config(const char *var, const char *value,
        return 0;
 }
 
        return 0;
 }
 
-static void get_upload_pack_config(struct upload_pack_data *data)
+static void get_upload_pack_config(struct repository *r,
+                                  struct upload_pack_data *data)
 {
 {
-       git_config(upload_pack_config, data);
+       repo_config(r, upload_pack_config, data);
        git_protected_config(upload_pack_protected_config, data);
        git_protected_config(upload_pack_protected_config, data);
+
+       data->allow_sideband_all |= git_env_bool("GIT_TEST_SIDEBAND_ALL", 0);
 }
 
 void upload_pack(const int advertise_refs, const int stateless_rpc,
 }
 
 void upload_pack(const int advertise_refs, const int stateless_rpc,
@@ -1399,20 +1421,22 @@ void upload_pack(const int advertise_refs, const int stateless_rpc,
        struct upload_pack_data data;
 
        upload_pack_data_init(&data);
        struct upload_pack_data data;
 
        upload_pack_data_init(&data);
-       get_upload_pack_config(&data);
+       get_upload_pack_config(the_repository, &data);
 
        data.stateless_rpc = stateless_rpc;
        data.timeout = timeout;
        if (data.timeout)
                data.daemon_mode = 1;
 
 
        data.stateless_rpc = stateless_rpc;
        data.timeout = timeout;
        if (data.timeout)
                data.daemon_mode = 1;
 
-       head_ref_namespaced(find_symref, &data.symref);
+       refs_head_ref_namespaced(get_main_ref_store(the_repository),
+                                find_symref, &data.symref);
 
        if (advertise_refs || !data.stateless_rpc) {
                reset_timeout(data.timeout);
                if (advertise_refs)
                        data.no_done = 1;
 
        if (advertise_refs || !data.stateless_rpc) {
                reset_timeout(data.timeout);
                if (advertise_refs)
                        data.no_done = 1;
-               head_ref_namespaced(send_ref, &data);
+               refs_head_ref_namespaced(get_main_ref_store(the_repository),
+                                        send_ref, &data);
                for_each_namespaced_ref_1(send_ref, &data);
                if (!data.sent_capabilities) {
                        const char *refname = "capabilities^{}";
                for_each_namespaced_ref_1(send_ref, &data);
                if (!data.sent_capabilities) {
                        const char *refname = "capabilities^{}";
@@ -1426,7 +1450,8 @@ void upload_pack(const int advertise_refs, const int stateless_rpc,
                advertise_shallow_grafts(1);
                packet_flush(1);
        } else {
                advertise_shallow_grafts(1);
                packet_flush(1);
        } else {
-               head_ref_namespaced(check_ref, &data);
+               refs_head_ref_namespaced(get_main_ref_store(the_repository),
+                                        check_ref, &data);
                for_each_namespaced_ref_1(check_ref, &data);
        }
 
                for_each_namespaced_ref_1(check_ref, &data);
        }
 
@@ -1504,7 +1529,7 @@ static int parse_want_ref(struct packet_writer *writer, const char *line,
 
                strbuf_addf(&refname, "%s%s", get_git_namespace(), refname_nons);
                if (ref_is_hidden(refname_nons, refname.buf, hidden_refs) ||
 
                strbuf_addf(&refname, "%s%s", get_git_namespace(), refname_nons);
                if (ref_is_hidden(refname_nons, refname.buf, hidden_refs) ||
-                   read_ref(refname.buf, &oid)) {
+                   refs_read_ref(get_main_ref_store(the_repository), refname.buf, &oid)) {
                        packet_writer_error(writer, "unknown ref %s", refname_nons);
                        die("unknown ref %s", refname_nons);
                }
                        packet_writer_error(writer, "unknown ref %s", refname_nons);
                        die("unknown ref %s", refname_nons);
                }
@@ -1641,14 +1666,14 @@ static void process_args(struct packet_reader *request,
                        continue;
                }
 
                        continue;
                }
 
-               if ((git_env_bool("GIT_TEST_SIDEBAND_ALL", 0) ||
-                    data->allow_sideband_all) &&
+               if (data->allow_sideband_all &&
                    !strcmp(arg, "sideband-all")) {
                        data->writer.use_sideband = 1;
                        continue;
                }
 
                    !strcmp(arg, "sideband-all")) {
                        data->writer.use_sideband = 1;
                        continue;
                }
 
-               if (skip_prefix(arg, "packfile-uris ", &p)) {
+               if (data->allow_packfile_uris &&
+                   skip_prefix(arg, "packfile-uris ", &p)) {
                        if (data->uri_protocols.nr)
                                send_err_and_die(data,
                                                 "multiple packfile-uris lines forbidden");
                        if (data->uri_protocols.nr)
                                send_err_and_die(data,
                                                 "multiple packfile-uris lines forbidden");
@@ -1754,7 +1779,7 @@ enum fetch_state {
        FETCH_DONE,
 };
 
        FETCH_DONE,
 };
 
-int upload_pack_v2(struct repository *r UNUSED, struct packet_reader *request)
+int upload_pack_v2(struct repository *r, struct packet_reader *request)
 {
        enum fetch_state state = FETCH_PROCESS_ARGS;
        struct upload_pack_data data;
 {
        enum fetch_state state = FETCH_PROCESS_ARGS;
        struct upload_pack_data data;
@@ -1763,7 +1788,7 @@ int upload_pack_v2(struct repository *r UNUSED, struct packet_reader *request)
 
        upload_pack_data_init(&data);
        data.use_sideband = LARGE_PACKET_MAX;
 
        upload_pack_data_init(&data);
        data.use_sideband = LARGE_PACKET_MAX;
-       get_upload_pack_config(&data);
+       get_upload_pack_config(r, &data);
 
        while (state != FETCH_DONE) {
                switch (state) {
 
        while (state != FETCH_DONE) {
                switch (state) {
@@ -1822,41 +1847,28 @@ int upload_pack_v2(struct repository *r UNUSED, struct packet_reader *request)
 int upload_pack_advertise(struct repository *r,
                          struct strbuf *value)
 {
 int upload_pack_advertise(struct repository *r,
                          struct strbuf *value)
 {
-       if (value) {
-               int allow_filter_value;
-               int allow_ref_in_want;
-               int allow_sideband_all_value;
-               char *str = NULL;
+       struct upload_pack_data data;
+
+       upload_pack_data_init(&data);
+       get_upload_pack_config(r, &data);
 
 
+       if (value) {
                strbuf_addstr(value, "shallow wait-for-done");
 
                strbuf_addstr(value, "shallow wait-for-done");
 
-               if (!repo_config_get_bool(r,
-                                        "uploadpack.allowfilter",
-                                        &allow_filter_value) &&
-                   allow_filter_value)
+               if (data.allow_filter)
                        strbuf_addstr(value, " filter");
 
                        strbuf_addstr(value, " filter");
 
-               if (!repo_config_get_bool(r,
-                                        "uploadpack.allowrefinwant",
-                                        &allow_ref_in_want) &&
-                   allow_ref_in_want)
+               if (data.allow_ref_in_want)
                        strbuf_addstr(value, " ref-in-want");
 
                        strbuf_addstr(value, " ref-in-want");
 
-               if (git_env_bool("GIT_TEST_SIDEBAND_ALL", 0) ||
-                   (!repo_config_get_bool(r,
-                                          "uploadpack.allowsidebandall",
-                                          &allow_sideband_all_value) &&
-                    allow_sideband_all_value))
+               if (data.allow_sideband_all)
                        strbuf_addstr(value, " sideband-all");
 
                        strbuf_addstr(value, " sideband-all");
 
-               if (!repo_config_get_string(r,
-                                           "uploadpack.blobpackfileuri",
-                                           &str) &&
-                   str) {
+               if (data.allow_packfile_uris)
                        strbuf_addstr(value, " packfile-uris");
                        strbuf_addstr(value, " packfile-uris");
-                       free(str);
-               }
        }
 
        }
 
+       upload_pack_data_clear(&data);
+
        return 1;
 }
        return 1;
 }