threads / discuss / 55802

[QUESTION] how to quickly find an oid in the git repository

Subject: [QUESTION] how to quickly find an oid in the git repository

## tl;dr

3 messages between May 30, 2021 and May 31, 2021.

replies: 2people: 2as markdown or json

ZheNing Hu· May 30, 2021, 06:53 UTC · lore

When I tried to make cat-file --batch use ref-filter logic, I encountered this problem:

get_oid_with_context() does not really let me know if an oid is in the git repository. E.g.

get_oid_with_context(the_repository, "0000000000000000000000000000000000000000",...)

will return FOUND. (I really want it to tell me MISSING_OBJECT or something else)

On the other hand, oid_object_info_extended() will parse an object in depth, using it will seriously affect performance. So I want to know if there is a function that can quickly find the oid? I searched in `object-name.c`, `object-file.c`, and there seems to be no clue...

-- ZheNing Hu

Jeff King· May 30, 2021, 20:54 UTC · re: ZheNing Hu · lore

Re: [QUESTION] how to quickly find an oid in the git repository

On Sun, May 30, 2021 at 02:53:24PM +0800, ZheNing Hu wrote:
Show 11 quoted lines
> When I tried to make cat-file --batch use ref-filter logic,
> I encountered this problem:
> 
> get_oid_with_context() does not really let me know
> if an oid is in the git repository. E.g.
> 
> get_oid_with_context(the_repository,
> "0000000000000000000000000000000000000000",...)
> 
> will return FOUND. (I really want it to tell me MISSING_OBJECT
> or something else)
Right, it's purely a name->oid lookup.
> On the other hand, oid_object_info_extended() will parse an object
> in depth, using it will seriously affect performance. So I want to know
> if there is a function that can quickly find the oid? I searched in
> `object-name.c`, `object-file.c`, and there seems to be no clue...

You should be able to use oid_object_info_extended() here. It will try to do as little work as possible to fulfill the items requested in the object_info struct. So a blank one (or even passing NULL) will return an error if the object doesn't exist, but not otherwise.

There's also has_object_file(), which is essentially a wrapper for this.
-Peff
ZheNing Hu· May 31, 2021, 11:30 UTC · re: Jeff King · lore

Re: [QUESTION] how to quickly find an oid in the git repository

Jeff King <peff@peff.net> 于2021年5月31日周一 上午4:54写道:
Show 12 quoted lines
> > On the other hand, oid_object_info_extended() will parse an object
> > in depth, using it will seriously affect performance. So I want to know
> > if there is a function that can quickly find the oid? I searched in
> > `object-name.c`, `object-file.c`, and there seems to be no clue...
>
> You should be able to use oid_object_info_extended() here. It will try
> to do as little work as possible to fulfill the items requested in the
> object_info struct. So a blank one (or even passing NULL) will return an
> error if the object doesn't exist, but not otherwise.
>
> There's also has_object_file(), which is essentially a wrapper for this.
>

This is exactly what I want. It seems that the real performance problem is not because of the use of oid_object_info_extended(), but the possible copy of the object data in it.

> -Peff

Thanks! -- ZheNing Hu

← back to recent threads