]> git.ipfire.org Git - thirdparty/git.git/blobdiff - upload-pack.c
object-file: remove OBJECT_INFO_IGNORE_LOOSE
[thirdparty/git.git] / upload-pack.c
index 8acc98741bbb83db90dc6b0901d5be817cacd0a3..551f22ffa5d63ceabbf5909ee1926b8471722920 100644 (file)
@@ -62,6 +62,7 @@ struct upload_pack_data {
        struct object_array have_obj;
        struct oid_array haves;                                 /* v2 only */
        struct string_list wanted_refs;                         /* v2 only */
+       struct string_list hidden_refs;
 
        struct object_array shallows;
        struct string_list deepen_not;
@@ -118,6 +119,7 @@ static void upload_pack_data_init(struct upload_pack_data *data)
 {
        struct string_list symref = STRING_LIST_INIT_DUP;
        struct string_list wanted_refs = STRING_LIST_INIT_DUP;
+       struct string_list hidden_refs = STRING_LIST_INIT_DUP;
        struct object_array want_obj = OBJECT_ARRAY_INIT;
        struct object_array have_obj = OBJECT_ARRAY_INIT;
        struct oid_array haves = OID_ARRAY_INIT;
@@ -130,6 +132,7 @@ static void upload_pack_data_init(struct upload_pack_data *data)
        memset(data, 0, sizeof(*data));
        data->symref = symref;
        data->wanted_refs = wanted_refs;
+       data->hidden_refs = hidden_refs;
        data->want_obj = want_obj;
        data->have_obj = have_obj;
        data->haves = haves;
@@ -141,6 +144,7 @@ static void upload_pack_data_init(struct upload_pack_data *data)
        data->allow_filter_fallback = 1;
        data->tree_filter_max_depth = ULONG_MAX;
        packet_writer_init(&data->writer, 1);
+       list_objects_filter_init(&data->filter_options);
 
        data->keepalive = 5;
        data->advertise_sid = 0;
@@ -150,6 +154,7 @@ static void upload_pack_data_clear(struct upload_pack_data *data)
 {
        string_list_clear(&data->symref, 1);
        string_list_clear(&data->wanted_refs, 1);
+       string_list_clear(&data->hidden_refs, 0);
        object_array_clear(&data->want_obj);
        object_array_clear(&data->have_obj);
        oid_array_clear(&data->haves);
@@ -455,6 +460,7 @@ static void create_pack_file(struct upload_pack_data *pack_data,
        return;
 
  fail:
+       free(output_state);
        send_client_data(3, abort_msg, sizeof(abort_msg),
                         pack_data->use_sideband);
        die("git upload-pack: %s", abort_msg);
@@ -840,8 +846,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, NULL);
-               for_each_namespaced_ref(check_ref, NULL);
+               head_ref_namespaced(check_ref, data);
+               for_each_namespaced_ref(check_ref, data);
 
                get_reachable_list(data, &reachable_shallows);
                result = get_shallow_commits(&reachable_shallows,
@@ -1156,11 +1162,11 @@ static void receive_needs(struct upload_pack_data *data,
 
 /* return non-zero if the ref is hidden, otherwise 0 */
 static int mark_our_ref(const char *refname, const char *refname_full,
-                       const struct object_id *oid)
+                       const struct object_id *oid, const struct string_list *hidden_refs)
 {
        struct object *o = lookup_unknown_object(the_repository, oid);
 
-       if (ref_is_hidden(refname, refname_full)) {
+       if (ref_is_hidden(refname, refname_full, hidden_refs)) {
                o->flags |= HIDDEN_REF;
                return 1;
        }
@@ -1169,11 +1175,12 @@ static int mark_our_ref(const char *refname, const char *refname_full,
 }
 
 static int check_ref(const char *refname_full, const struct object_id *oid,
-                    int flag, void *cb_data)
+                    int flag UNUSED, void *cb_data)
 {
        const char *refname = strip_namespace(refname_full);
+       struct upload_pack_data *data = cb_data;
 
-       mark_our_ref(refname, refname_full, oid);
+       mark_our_ref(refname, refname_full, oid, &data->hidden_refs);
        return 0;
 }
 
@@ -1193,7 +1200,7 @@ static void format_session_id(struct strbuf *buf, struct upload_pack_data *d) {
 }
 
 static int send_ref(const char *refname, const struct object_id *oid,
-                   int flag, void *cb_data)
+                   int flag UNUSED, void *cb_data)
 {
        static const char *capabilities = "multi_ack thin-pack side-band"
                " side-band-64k ofs-delta shallow deepen-since deepen-not"
@@ -1202,7 +1209,7 @@ static int send_ref(const char *refname, const struct object_id *oid,
        struct object_id peeled;
        struct upload_pack_data *data = cb_data;
 
-       if (mark_our_ref(refname_nons, refname, oid))
+       if (mark_our_ref(refname_nons, refname, oid, &data->hidden_refs))
                return 0;
 
        if (capabilities) {
@@ -1235,7 +1242,8 @@ static int send_ref(const char *refname, const struct object_id *oid,
        return 0;
 }
 
-static int find_symref(const char *refname, const struct object_id *oid,
+static int find_symref(const char *refname,
+                      const struct object_id *oid UNUSED,
                       int flag, void *cb_data)
 {
        const char *symref_target;
@@ -1321,16 +1329,25 @@ static int upload_pack_config(const char *var, const char *value, void *cb_data)
                data->advertise_sid = git_config_bool(var, value);
        }
 
-       if (current_config_scope() != CONFIG_SCOPE_LOCAL &&
-           current_config_scope() != CONFIG_SCOPE_WORKTREE) {
-               if (!strcmp("uploadpack.packobjectshook", var))
-                       return git_config_string(&data->pack_objects_hook, var, value);
-       }
-
        if (parse_object_filter_config(var, value, data) < 0)
                return -1;
 
-       return parse_hide_refs_config(var, value, "uploadpack");
+       return parse_hide_refs_config(var, value, "uploadpack", &data->hidden_refs);
+}
+
+static int upload_pack_protected_config(const char *var, const char *value, void *cb_data)
+{
+       struct upload_pack_data *data = cb_data;
+
+       if (!strcmp("uploadpack.packobjectshook", var))
+               return git_config_string(&data->pack_objects_hook, var, value);
+       return 0;
+}
+
+static void get_upload_pack_config(struct upload_pack_data *data)
+{
+       git_config(upload_pack_config, data);
+       git_protected_config(upload_pack_protected_config, data);
 }
 
 void upload_pack(const int advertise_refs, const int stateless_rpc,
@@ -1340,8 +1357,7 @@ void upload_pack(const int advertise_refs, const int stateless_rpc,
        struct upload_pack_data data;
 
        upload_pack_data_init(&data);
-
-       git_config(upload_pack_config, &data);
+       get_upload_pack_config(&data);
 
        data.stateless_rpc = stateless_rpc;
        data.timeout = timeout;
@@ -1364,8 +1380,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, NULL);
-               for_each_namespaced_ref(check_ref, NULL);
+               head_ref_namespaced(check_ref, &data);
+               for_each_namespaced_ref(check_ref, &data);
        }
 
        if (!advertise_refs) {
@@ -1406,7 +1422,9 @@ static int parse_want(struct packet_writer *writer, const char *line,
                        die("git upload-pack: protocol error, "
                            "expected to get oid, not '%s'", line);
 
-               o = parse_object(the_repository, &oid);
+               o = parse_object_with_flags(the_repository, &oid,
+                                           PARSE_OBJECT_SKIP_HASH_CHECK);
+
                if (!o) {
                        packet_writer_error(writer,
                                            "upload-pack: not our ref %s",
@@ -1428,17 +1446,18 @@ static int parse_want(struct packet_writer *writer, const char *line,
 
 static int parse_want_ref(struct packet_writer *writer, const char *line,
                          struct string_list *wanted_refs,
+                         struct string_list *hidden_refs,
                          struct object_array *want_obj)
 {
        const char *refname_nons;
        if (skip_prefix(line, "want-ref ", &refname_nons)) {
                struct object_id oid;
                struct string_list_item *item;
-               struct object *o;
+               struct object *o = NULL;
                struct strbuf refname = STRBUF_INIT;
 
                strbuf_addf(&refname, "%s%s", get_git_namespace(), refname_nons);
-               if (ref_is_hidden(refname_nons, refname.buf) ||
+               if (ref_is_hidden(refname_nons, refname.buf, hidden_refs) ||
                    read_ref(refname.buf, &oid)) {
                        packet_writer_error(writer, "unknown ref %s", refname_nons);
                        die("unknown ref %s", refname_nons);
@@ -1448,7 +1467,15 @@ static int parse_want_ref(struct packet_writer *writer, const char *line,
                item = string_list_append(wanted_refs, refname_nons);
                item->util = oiddup(&oid);
 
-               o = parse_object_or_die(&oid, refname_nons);
+               if (!starts_with(refname_nons, "refs/tags/")) {
+                       struct commit *commit = lookup_commit_in_graph(the_repository, &oid);
+                       if (commit)
+                               o = &commit->object;
+               }
+
+               if (!o)
+                       o = parse_object_or_die(&oid, refname_nons);
+
                if (!(o->flags & WANTED)) {
                        o->flags |= WANTED;
                        add_object_array(o, NULL, want_obj);
@@ -1487,7 +1514,7 @@ static void process_args(struct packet_reader *request,
                        continue;
                if (data->allow_ref_in_want &&
                    parse_want_ref(&data->writer, arg, &data->wanted_refs,
-                                  &data->want_obj))
+                                  &data->hidden_refs, &data->want_obj))
                        continue;
                /* process have line */
                if (parse_have(arg, &data->haves))
@@ -1681,8 +1708,7 @@ int upload_pack_v2(struct repository *r, struct packet_reader *request)
 
        upload_pack_data_init(&data);
        data.use_sideband = LARGE_PACKET_MAX;
-
-       git_config(upload_pack_config, &data);
+       get_upload_pack_config(&data);
 
        while (state != FETCH_DONE) {
                switch (state) {