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 */