]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/backfill: fix flags passed to `odb_has_object()`
authorPatrick Steinhardt <ps@pks.im>
Thu, 12 Feb 2026 06:59:37 +0000 (07:59 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 12 Feb 2026 19:05:08 +0000 (11:05 -0800)
The function `fill_missing_blobs()` receives an array of object IDs and
verifies for each of them whether the corresponding object exists. If it
doesn't exist, we add it to a set of objects and then batch-fetch all of
the objects at once.

The check for whether or not we already have the object is broken
though: we pass `OBJECT_INFO_FOR_PREFETCH`, but `odb_has_object()`
expects us to pass `HAS_OBJECT_*` flags. The flag expands to:

  - `OBJECT_INFO_QUICK`, which asks the object database to not reprepare
    in case the object wasn't found. This makes sense, as we'd otherwise
    reprepare the object database as many times as we have missing
    objects.

  - `OBJECT_INFO_SKIP_FETCH_OBJECT`, which asks the object database to
    not fetch the object in case it's missing. Again, this makes sense,
    as we want to batch-fetch the objects.

This shows that we indeed want the equivalent of this flag, but of
course represented as `HAS_OBJECT_*` flags.

Luckily, the code is already working correctly. The `OBJECT_INFO` flag
expands to `(1 << 3) | (1 << 4)`, none of which are valid `HAS_OBJECT`
flags. And if no flags are passed, `odb_has_object()` ends up calling
`odb_read_object_info_extended()` with exactly the above two flags that
we wanted to set in the first place.

Of course, this is pure luck, and this can break any moment. So let's
fix this and correct the code to not pass any flags at all.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/backfill.c

index e80fc1b694df616115ac4b6a538ed22a4e7a772b..d8cb3b0eba799d40acebf9e03dd7947847647811 100644 (file)
@@ -67,8 +67,7 @@ static int fill_missing_blobs(const char *path UNUSED,
                return 0;
 
        for (size_t i = 0; i < list->nr; i++) {
-               if (!odb_has_object(ctx->repo->objects, &list->oid[i],
-                                   OBJECT_INFO_FOR_PREFETCH))
+               if (!odb_has_object(ctx->repo->objects, &list->oid[i], 0))
                        oid_array_append(&ctx->current_batch, &list->oid[i]);
        }