]> git.ipfire.org Git - thirdparty/git.git/blobdiff - upload-pack.c
The seventh batch
[thirdparty/git.git] / upload-pack.c
index 281bdf85c936d5d4a5e6615ee624359b137fe730..8fbd1385153dbfeb801210b9cf0ee970ed724b42 100644 (file)
@@ -114,6 +114,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_packfile_uris : 1;                       /* v2 only */
        unsigned advertise_sid : 1;
        unsigned sent_capabilities : 1;
 };
@@ -617,7 +618,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);
 
-       for_each_namespaced_ref(excludes, fn, data);
+       refs_for_each_namespaced_ref(get_main_ref_store(the_repository),
+                                    excludes, fn, data);
 }
 
 
@@ -872,7 +874,8 @@ static void deepen(struct upload_pack_data *data, int depth)
                 * 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);
@@ -1287,7 +1290,8 @@ static int find_symref(const char *refname,
 
        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));
@@ -1363,6 +1367,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);
+       } 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)) {
@@ -1386,10 +1393,13 @@ static int upload_pack_protected_config(const char *var, const char *value,
        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);
+
+       data->allow_sideband_all |= git_env_bool("GIT_TEST_SIDEBAND_ALL", 0);
 }
 
 void upload_pack(const int advertise_refs, const int stateless_rpc,
@@ -1399,20 +1409,22 @@ void upload_pack(const int advertise_refs, const int stateless_rpc,
        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;
 
-       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;
-               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^{}";
@@ -1426,7 +1438,8 @@ void upload_pack(const int advertise_refs, const int stateless_rpc,
                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);
        }
 
@@ -1504,7 +1517,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) ||
-                   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);
                }
@@ -1641,14 +1654,14 @@ static void process_args(struct packet_reader *request,
                        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;
                }
 
-               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");
@@ -1754,7 +1767,7 @@ enum fetch_state {
        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;
@@ -1763,7 +1776,7 @@ int upload_pack_v2(struct repository *r UNUSED, struct packet_reader *request)
 
        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) {
@@ -1822,41 +1835,28 @@ int upload_pack_v2(struct repository *r UNUSED, struct packet_reader *request)
 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");
 
-               if (!repo_config_get_bool(r,
-                                        "uploadpack.allowfilter",
-                                        &allow_filter_value) &&
-                   allow_filter_value)
+               if (data.allow_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");
 
-               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");
 
-               if (!repo_config_get_string(r,
-                                           "uploadpack.blobpackfileuri",
-                                           &str) &&
-                   str) {
+               if (data.allow_packfile_uris)
                        strbuf_addstr(value, " packfile-uris");
-                       free(str);
-               }
        }
 
+       upload_pack_data_clear(&data);
+
        return 1;
 }