diff options
author | Jonathan Tan <jonathantanmy@google.com> | 2020-08-06 02:06:49 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-08-06 23:01:02 +0300 |
commit | 1d8d9cb62099e1524ce1269ea88faad871c2197f (patch) | |
tree | d319dd7f637a3c89fa0a6ed3ff0f37c758643a05 /sha1-file.c | |
parent | dc04167d378fb29d30e1647ff6ff51dd182bc9a3 (diff) |
sha1-file: introduce no-lazy-fetch has_object()
There have been a few bugs wherein Git fetches missing objects whenever
the existence of an object is checked, even though it does not need to
perform such a fetch. To resolve these bugs, we could look at all the
places that has_object_file() (or a similar function) is used. As a
first step, introduce a new function has_object() that checks for the
existence of an object, with a default behavior of not fetching if the
object is missing and the repository is a partial clone. As we verify
each has_object_file() (or similar) usage, we can replace it with
has_object(), and we will know that we are done when we can delete
has_object_file() (and the other similar functions).
Also, the new function has_object() has more appropriate defaults:
besides not fetching, it also does not recheck packed storage.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sha1-file.c')
-rw-r--r-- | sha1-file.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/sha1-file.c b/sha1-file.c index 45fdb8415c..5866de0f65 100644 --- a/sha1-file.c +++ b/sha1-file.c @@ -1989,6 +1989,18 @@ int force_object_loose(const struct object_id *oid, time_t mtime) return ret; } +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); + + if (!startup_info->have_repository) + return 0; + return oid_object_info_extended(r, oid, NULL, object_info_flags) >= 0; +} + int repo_has_object_file_with_flags(struct repository *r, const struct object_id *oid, int flags) { |