]> git.ipfire.org Git - thirdparty/git.git/commitdiff
streaming: get rid of `the_repository`
authorPatrick Steinhardt <ps@pks.im>
Sun, 23 Nov 2025 18:59:38 +0000 (19:59 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 23 Nov 2025 20:56:45 +0000 (12:56 -0800)
Subsequent commits will move the backend-specific logic of object
streaming into their respective subsystems. These subsystems have gotten
rid of `the_repository` already, but we still use it in two locations in
the streaming subsystem.

Prepare for the move by fixing those two cases. Converting the logic in
`open_istream_pack_non_delta()` is trivial as we already got the object
database as input.

But for `stream_blob_to_fd()` we have to add a new parameter to make it
accessible. So, as we already have to adjust all callers anyway, rename
the function to `odb_stream_blob_to_fd()` to indicate it's part of the
object subsystem.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/cat-file.c
builtin/fsck.c
builtin/log.c
entry.c
parallel-checkout.c
streaming.c
streaming.h

index 983ecec837b03beddeaf5b0825a183b37eb5a9f0..120d626d66e1400f7773b8b72ee0c9b63ff0bcc1 100644 (file)
@@ -95,7 +95,7 @@ static int filter_object(const char *path, unsigned mode,
 
 static int stream_blob(const struct object_id *oid)
 {
-       if (stream_blob_to_fd(1, oid, NULL, 0))
+       if (odb_stream_blob_to_fd(the_repository->objects, 1, oid, NULL, 0))
                die("unable to stream %s to stdout", oid_to_hex(oid));
        return 0;
 }
index b1a650c6731d3268c65c2204af1975fe23e6d226..1a348d43c260204106e4b61c666798e9b59b50f9 100644 (file)
@@ -340,7 +340,8 @@ static void check_unreachable_object(struct object *obj)
                        }
                        f = xfopen(filename, "w");
                        if (obj->type == OBJ_BLOB) {
-                               if (stream_blob_to_fd(fileno(f), &obj->oid, NULL, 1))
+                               if (odb_stream_blob_to_fd(the_repository->objects, fileno(f),
+                                                         &obj->oid, NULL, 1))
                                        die_errno(_("could not write '%s'"), filename);
                        } else
                                fprintf(f, "%s\n", describe_object(&obj->oid));
index c8319b8af38c8c732ddf632a0d3ced68487f8cd3..e7b83a6e00a708df599cd7c1aaccbf36971bf893 100644 (file)
@@ -584,7 +584,7 @@ static int show_blob_object(const struct object_id *oid, struct rev_info *rev, c
        fflush(rev->diffopt.file);
        if (!rev->diffopt.flags.textconv_set_via_cmdline ||
            !rev->diffopt.flags.allow_textconv)
-               return stream_blob_to_fd(1, oid, NULL, 0);
+               return odb_stream_blob_to_fd(the_repository->objects, 1, oid, NULL, 0);
 
        if (get_oid_with_context(the_repository, obj_name,
                                 GET_OID_RECORD_PATH,
@@ -594,7 +594,7 @@ static int show_blob_object(const struct object_id *oid, struct rev_info *rev, c
            !textconv_object(the_repository, obj_context.path,
                             obj_context.mode, &oidc, 1, &buf, &size)) {
                object_context_release(&obj_context);
-               return stream_blob_to_fd(1, oid, NULL, 0);
+               return odb_stream_blob_to_fd(the_repository->objects, 1, oid, NULL, 0);
        }
 
        if (!buf)
diff --git a/entry.c b/entry.c
index cae02eb50398d7cfcdac8b4c4382e067e9de02d9..38dfe670f79920eac6b1adf0210ea17af7686742 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -139,7 +139,7 @@ static int streaming_write_entry(const struct cache_entry *ce, char *path,
        if (fd < 0)
                return -1;
 
-       result |= stream_blob_to_fd(fd, &ce->oid, filter, 1);
+       result |= odb_stream_blob_to_fd(the_repository->objects, fd, &ce->oid, filter, 1);
        *fstat_done = fstat_checkout_output(fd, state, statbuf);
        result |= close(fd);
 
index fba6aa65a6e8524fcf829c0f2fb389146b643e22..1cb6701b926dcf8a4e91946fa8fc27fab9801bdd 100644 (file)
@@ -281,7 +281,8 @@ static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
 
        filter = get_stream_filter_ca(&pc_item->ca, &pc_item->ce->oid);
        if (filter) {
-               if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
+               if (odb_stream_blob_to_fd(the_repository->objects, fd,
+                                         &pc_item->ce->oid, filter, 1)) {
                        /* On error, reset fd to try writing without streaming */
                        if (reset_fd(fd, path))
                                return -1;
index f0f7d31956f59b9b6181673881afaaba758dcef1..807a6e03a85b49fcdaf47f522ae6ee94d2ed8e0b 100644 (file)
@@ -2,8 +2,6 @@
  * Copyright (c) 2011, Google Inc.
  */
 
-#define USE_THE_REPOSITORY_VARIABLE
-
 #include "git-compat-util.h"
 #include "convert.h"
 #include "environment.h"
@@ -359,7 +357,7 @@ static int open_istream_pack_non_delta(struct odb_read_stream **out,
 
        if (packfile_store_read_object_info(odb->packfiles, oid, &oi, 0) ||
            oi.u.packed.is_delta ||
-           repo_settings_get_big_file_threshold(the_repository) >= size)
+           repo_settings_get_big_file_threshold(odb->repo) >= size)
                return -1;
 
        in_pack_type = unpack_object_header(oi.u.packed.pack,
@@ -518,8 +516,11 @@ struct odb_read_stream *open_istream(struct repository *r,
        return st;
 }
 
-int stream_blob_to_fd(int fd, const struct object_id *oid, struct stream_filter *filter,
-                     int can_seek)
+int odb_stream_blob_to_fd(struct object_database *odb,
+                         int fd,
+                         const struct object_id *oid,
+                         struct stream_filter *filter,
+                         int can_seek)
 {
        struct odb_read_stream *st;
        enum object_type type;
@@ -527,7 +528,7 @@ int stream_blob_to_fd(int fd, const struct object_id *oid, struct stream_filter
        ssize_t kept = 0;
        int result = -1;
 
-       st = open_istream(the_repository, oid, &type, &sz, filter);
+       st = open_istream(odb->repo, oid, &type, &sz, filter);
        if (!st) {
                if (filter)
                        free_stream_filter(filter);
index f5ff5d7ac9a573ceef4f1937c5e2f576a5a9c8c2..148f6b30697ab758d4277d0f87ec5e9b48589605 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "object.h"
 
+struct object_database;
 /* opaque */
 struct odb_read_stream;
 struct stream_filter;
@@ -16,6 +17,21 @@ struct odb_read_stream *open_istream(struct repository *, const struct object_id
 int close_istream(struct odb_read_stream *);
 ssize_t read_istream(struct odb_read_stream *, void *, size_t);
 
-int stream_blob_to_fd(int fd, const struct object_id *, struct stream_filter *, int can_seek);
+/*
+ * Look up the object by its ID and write the full contents to the file
+ * descriptor. The object must be a blob, or the function will fail. When
+ * provided, the filter is used to transform the blob contents.
+ *
+ * `can_seek` should be set to 1 in case the given file descriptor can be
+ * seek(3p)'d on. This is used to support files with holes in case a
+ * significant portion of the blob contains NUL bytes.
+ *
+ * Returns a negative error code on failure, 0 on success.
+ */
+int odb_stream_blob_to_fd(struct object_database *odb,
+                         int fd,
+                         const struct object_id *oid,
+                         struct stream_filter *filter,
+                         int can_seek);
 
 #endif /* STREAMING_H */