object-store: allow fetching objects via `has_object()`

We're about to fully remove `repo_has_object_file()` in favor of `has_object()`. The latter function does not yet have a way to fetch missing objects via a promisor remote though, which means that it cannot fully replace all usecases of `repo_has_object_file()`. Introduce a new flag `HAS_OBJECT_FETCH_PROMISOR` that causes the function to optionally fetch missing objects which are part of a promisor pack. This flag will be used in the subsequent commit. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Apr 29, 2025 at 09:52 UTC f8fc4cacd37afa254a8822258f76de53ae2dfbb2
2 files changed +13 -6
object-store.c
+6 -3
@@ -937,12 +937,15 @@ void *read_object_with_reference(struct repository *r,
937 int has_object(struct repository *r, const struct object_id *oid,
938 unsigned flags)
939 {
940 - int quick = !(flags & HAS_OBJECT_RECHECK_PACKED);
941 - unsigned object_info_flags = OBJECT_INFO_SKIP_FETCH_OBJECT |
942 - (quick ? OBJECT_INFO_QUICK : 0);
940 + unsigned object_info_flags = 0;
941
942 if (!startup_info->have_repository)
943 return 0;
944 + if (!(flags & HAS_OBJECT_RECHECK_PACKED))
945 + object_info_flags |= OBJECT_INFO_QUICK;
946 + if (!(flags & HAS_OBJECT_FETCH_PROMISOR))
947 + object_info_flags |= OBJECT_INFO_SKIP_FETCH_OBJECT;
948 +
949 return oid_object_info_extended(r, oid, NULL, object_info_flags) >= 0;
950 }
951
object-store.h
+7 -3
@@ -262,12 +262,16 @@ int oid_object_info_extended(struct repository *r,
262 const struct object_id *,
263 struct object_info *, unsigned flags);
264
265 -/* Retry packed storage after checking packed and loose storage */
266 -#define HAS_OBJECT_RECHECK_PACKED 1
265 +enum {
266 + /* Retry packed storage after checking packed and loose storage */
267 + HAS_OBJECT_RECHECK_PACKED = (1 << 0),
268 + /* Allow fetching the object in case the repository has a promisor remote. */
269 + HAS_OBJECT_FETCH_PROMISOR = (1 << 1),
270 +};
271
272 /*
273 * Returns 1 if the object exists. This function will not lazily fetch objects
270 - * in a partial clone.
274 + * in a partial clone by default.
275 */
276 int has_object(struct repository *r, const struct object_id *oid,
277 unsigned flags);