"Derrick Stolee via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > From: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > > The OBJECT_INFO_FOR_PREFETCH bitflag was added to sha1-file.c in 0f4a4fb1 > (sha1-file: support OBJECT_INFO_FOR_PREFETCH, 2019-03-29) and is used to > prevent the fetch_objects() method when enabled. > > However, there is a problem with the current use. The definition of > OBJECT_INFO_FOR_PREFETCH is given by adding 32 to OBJECT_INFO_QUICK. This is > clearly stated above the definition (in a comment) that this is so > OBJECT_INFO_FOR_PREFETCH implies OBJECT_INFO_QUICK. The problem is that using > "flag & OBJECT_INFO_FOR_PREFETCH" means that OBJECT_INFO_QUICK also implies > OBJECT_INFO_FOR_PREFETCH. So the right test to see prefetch is in effect is not if (!!(flag & TWO_BITS)) but to use if ((flag & TWO_BITS) == TWO_BITS) instead? > Split out the single bit from OBJECT_INFO_FOR_PREFETCH into a new > OBJECT_INFO_SKIP_FETCH_OBJECT as the single bit and keep > OBJECT_INFO_FOR_PREFETCH as the union of two flags. This allows a clearer use > of flag checking while also keeping the implication of OBJECT_INFO_QUICK. OK, I guess that would work and with far less damage to the existing code. > > Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > --- > object-store.h | 10 +++++++--- > sha1-file.c | 2 +- > 2 files changed, 8 insertions(+), 4 deletions(-) > > diff --git a/object-store.h b/object-store.h > index dd3f9b75f0..c90628d839 100644 > --- a/object-store.h > +++ b/object-store.h > @@ -282,10 +282,14 @@ struct object_info { > #define OBJECT_INFO_IGNORE_LOOSE 16 > /* > * Do not attempt to fetch the object if missing (even if fetch_is_missing is > - * nonzero). This is meant for bulk prefetching of missing blobs in a partial > - * clone. Implies OBJECT_INFO_QUICK. > + * nonzero). > */ > -#define OBJECT_INFO_FOR_PREFETCH (32 + OBJECT_INFO_QUICK) > +#define OBJECT_INFO_SKIP_FETCH_OBJECT 32 > +/* > + * This is meant for bulk prefetching of missing blobs in a partial > + * clone. Implies OBJECT_INFO_SKIP_FETCH_OBJECT and OBJECT_INFO_QUICK > + */ > +#define OBJECT_INFO_FOR_PREFETCH (OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_QUICK) > > int oid_object_info_extended(struct repository *r, > const struct object_id *, > diff --git a/sha1-file.c b/sha1-file.c > index ad02649124..0299fdd516 100644 > --- a/sha1-file.c > +++ b/sha1-file.c > @@ -1371,7 +1371,7 @@ int oid_object_info_extended(struct repository *r, const struct object_id *oid, > /* Check if it is a missing object */ > if (fetch_if_missing && repository_format_partial_clone && > !already_retried && r == the_repository && > - !(flags & OBJECT_INFO_FOR_PREFETCH)) { > + !(flags & OBJECT_INFO_SKIP_FETCH_OBJECT)) { > /* > * TODO Investigate having fetch_object() return > * TODO error/success and stopping the music here.