From: Patrick Steinhardt Date: Tue, 29 Apr 2025 07:52:19 +0000 (+0200) Subject: object-store: allow fetching objects via `has_object()` X-Git-Tag: v2.50.0-rc0~53^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f8fc4cacd37afa254a8822258f76de53ae2dfbb2;p=thirdparty%2Fgit.git 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 Signed-off-by: Junio C Hamano --- diff --git a/object-store.c b/object-store.c index 0cbad5a19a..0d873868a6 100644 --- a/object-store.c +++ b/object-store.c @@ -937,12 +937,15 @@ void *read_object_with_reference(struct repository *r, int has_object(struct repository *r, const struct object_id *oid, unsigned flags) { - int quick = !(flags & HAS_OBJECT_RECHECK_PACKED); - unsigned object_info_flags = OBJECT_INFO_SKIP_FETCH_OBJECT | - (quick ? OBJECT_INFO_QUICK : 0); + unsigned object_info_flags = 0; if (!startup_info->have_repository) return 0; + if (!(flags & HAS_OBJECT_RECHECK_PACKED)) + object_info_flags |= OBJECT_INFO_QUICK; + if (!(flags & HAS_OBJECT_FETCH_PROMISOR)) + object_info_flags |= OBJECT_INFO_SKIP_FETCH_OBJECT; + return oid_object_info_extended(r, oid, NULL, object_info_flags) >= 0; } diff --git a/object-store.h b/object-store.h index 9dc39a7c91..f0e111464c 100644 --- a/object-store.h +++ b/object-store.h @@ -262,12 +262,16 @@ int oid_object_info_extended(struct repository *r, const struct object_id *, struct object_info *, unsigned flags); -/* Retry packed storage after checking packed and loose storage */ -#define HAS_OBJECT_RECHECK_PACKED 1 +enum { + /* Retry packed storage after checking packed and loose storage */ + HAS_OBJECT_RECHECK_PACKED = (1 << 0), + /* Allow fetching the object in case the repository has a promisor remote. */ + HAS_OBJECT_FETCH_PROMISOR = (1 << 1), +}; /* * Returns 1 if the object exists. This function will not lazily fetch objects - * in a partial clone. + * in a partial clone by default. */ int has_object(struct repository *r, const struct object_id *oid, unsigned flags);