streaming: get rid of `the_repository`

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>

Patrick Steinhardt committed Nov 23, 2025 at 19:59 UTC c26da3446e98ad4aa98ec9154c70c6fd35cb9ad6
7 files changed +32 -13
builtin/cat-file.c
+1 -1
@@ -95,7 +95,7 @@ static int filter_object(const char *path, unsigned mode,
95
96 static int stream_blob(const struct object_id *oid)
97 {
98 - if (stream_blob_to_fd(1, oid, NULL, 0))
98 + if (odb_stream_blob_to_fd(the_repository->objects, 1, oid, NULL, 0))
99 die("unable to stream %s to stdout", oid_to_hex(oid));
100 return 0;
101 }
builtin/fsck.c
+2 -1
@@ -340,7 +340,8 @@ static void check_unreachable_object(struct object *obj)
340 }
341 f = xfopen(filename, "w");
342 if (obj->type == OBJ_BLOB) {
343 - if (stream_blob_to_fd(fileno(f), &obj->oid, NULL, 1))
343 + if (odb_stream_blob_to_fd(the_repository->objects, fileno(f),
344 + &obj->oid, NULL, 1))
345 die_errno(_("could not write '%s'"), filename);
346 } else
347 fprintf(f, "%s\n", describe_object(&obj->oid));
builtin/log.c
+2 -2
@@ -584,7 +584,7 @@ static int show_blob_object(const struct object_id *oid, struct rev_info *rev, c
584 fflush(rev->diffopt.file);
585 if (!rev->diffopt.flags.textconv_set_via_cmdline ||
586 !rev->diffopt.flags.allow_textconv)
587 - return stream_blob_to_fd(1, oid, NULL, 0);
587 + return odb_stream_blob_to_fd(the_repository->objects, 1, oid, NULL, 0);
588
589 if (get_oid_with_context(the_repository, obj_name,
590 GET_OID_RECORD_PATH,
@@ -594,7 +594,7 @@ static int show_blob_object(const struct object_id *oid, struct rev_info *rev, c
594 !textconv_object(the_repository, obj_context.path,
595 obj_context.mode, &oidc, 1, &buf, &size)) {
596 object_context_release(&obj_context);
597 - return stream_blob_to_fd(1, oid, NULL, 0);
597 + return odb_stream_blob_to_fd(the_repository->objects, 1, oid, NULL, 0);
598 }
599
600 if (!buf)
entry.c
+1 -1
@@ -139,7 +139,7 @@ static int streaming_write_entry(const struct cache_entry *ce, char *path,
139 if (fd < 0)
140 return -1;
141
142 - result |= stream_blob_to_fd(fd, &ce->oid, filter, 1);
142 + result |= odb_stream_blob_to_fd(the_repository->objects, fd, &ce->oid, filter, 1);
143 *fstat_done = fstat_checkout_output(fd, state, statbuf);
144 result |= close(fd);
145
parallel-checkout.c
+2 -1
@@ -281,7 +281,8 @@ static int write_pc_item_to_fd(struct parallel_checkout_item *pc_item, int fd,
281
282 filter = get_stream_filter_ca(&pc_item->ca, &pc_item->ce->oid);
283 if (filter) {
284 - if (stream_blob_to_fd(fd, &pc_item->ce->oid, filter, 1)) {
284 + if (odb_stream_blob_to_fd(the_repository->objects, fd,
285 + &pc_item->ce->oid, filter, 1)) {
286 /* On error, reset fd to try writing without streaming */
287 if (reset_fd(fd, path))
288 return -1;
streaming.c
+7 -6
@@ -2,8 +2,6 @@
2 * Copyright (c) 2011, Google Inc.
3 */
4
5 -#define USE_THE_REPOSITORY_VARIABLE
6 -
5 #include "git-compat-util.h"
6 #include "convert.h"
7 #include "environment.h"
@@ -359,7 +357,7 @@ static int open_istream_pack_non_delta(struct odb_read_stream **out,
357
358 if (packfile_store_read_object_info(odb->packfiles, oid, &oi, 0) ||
359 oi.u.packed.is_delta ||
362 - repo_settings_get_big_file_threshold(the_repository) >= size)
360 + repo_settings_get_big_file_threshold(odb->repo) >= size)
361 return -1;
362
363 in_pack_type = unpack_object_header(oi.u.packed.pack,
@@ -518,8 +516,11 @@ struct odb_read_stream *open_istream(struct repository *r,
516 return st;
517 }
518
521 -int stream_blob_to_fd(int fd, const struct object_id *oid, struct stream_filter *filter,
522 - int can_seek)
519 +int odb_stream_blob_to_fd(struct object_database *odb,
520 + int fd,
521 + const struct object_id *oid,
522 + struct stream_filter *filter,
523 + int can_seek)
524 {
525 struct odb_read_stream *st;
526 enum object_type type;
@@ -527,7 +528,7 @@ int stream_blob_to_fd(int fd, const struct object_id *oid, struct stream_filter
528 ssize_t kept = 0;
529 int result = -1;
530
530 - st = open_istream(the_repository, oid, &type, &sz, filter);
531 + st = open_istream(odb->repo, oid, &type, &sz, filter);
532 if (!st) {
533 if (filter)
534 free_stream_filter(filter);
streaming.h
+17 -1
@@ -6,6 +6,7 @@
6
7 #include "object.h"
8
9 +struct object_database;
10 /* opaque */
11 struct odb_read_stream;
12 struct stream_filter;
@@ -16,6 +17,21 @@ struct odb_read_stream *open_istream(struct repository *, const struct object_id
17 int close_istream(struct odb_read_stream *);
18 ssize_t read_istream(struct odb_read_stream *, void *, size_t);
19
19 -int stream_blob_to_fd(int fd, const struct object_id *, struct stream_filter *, int can_seek);
20 +/*
21 + * Look up the object by its ID and write the full contents to the file
22 + * descriptor. The object must be a blob, or the function will fail. When
23 + * provided, the filter is used to transform the blob contents.
24 + *
25 + * `can_seek` should be set to 1 in case the given file descriptor can be
26 + * seek(3p)'d on. This is used to support files with holes in case a
27 + * significant portion of the blob contains NUL bytes.
28 + *
29 + * Returns a negative error code on failure, 0 on success.
30 + */
31 +int odb_stream_blob_to_fd(struct object_database *odb,
32 + int fd,
33 + const struct object_id *oid,
34 + struct stream_filter *filter,
35 + int can_seek);
36
37 #endif /* STREAMING_H */