git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v5 08/10] sha1_file: support lazily fetching missing objects

From
JHJeff Hostetler <git@jeffhostetler.com>
Date
Dec 5, 2017, 16:02 UTC
Message-ID
<2d1958ed-c6f2-2111-dec5-a1dd3c842f7d@jeffhostetler.com>
In-Reply-To
<CAP8UFD2Q075aKG0yEbOy-W2+NSa6n8AEVu=yWn9q=xSnQwn5=g@mail.gmail.com>
On 12/2/2017 1:29 PM, Christian Couder wrote:
> On Tue, Nov 21, 2017 at 10:07 PM, Jeff Hostetler <git@jeffhostetler.com> wrote:
>> From: Jonathan Tan <jonathantanmy@google.com>
[...]
>>   int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, unsigned flags)
>>   {
[...]
Show 38 quoted lines
>>
>> -       if (!find_pack_entry(real, &e)) {
>> -               /* Most likely it's a loose object. */
>> -               if (!sha1_loose_object_info(real, oi, flags))
>> -                       return 0;
>> +retry:
>> +       if (find_pack_entry(real, &e))
>> +               goto found_packed;
>>
>> -               /* Not a loose object; someone else may have just packed it. */
>> -               if (flags & OBJECT_INFO_QUICK) {
>> -                       return -1;
>> -               } else {
>> -                       reprepare_packed_git();
>> -                       if (!find_pack_entry(real, &e))
>> -                               return -1;
>> -               }
>> +       /* Most likely it's a loose object. */
>> +       if (!sha1_loose_object_info(real, oi, flags))
>> +               return 0;
>> +
>> +       /* Not a loose object; someone else may have just packed it. */
>> +       reprepare_packed_git();
>> +       if (find_pack_entry(real, &e))
>> +               goto found_packed;
>> +
>> +       /* Check if it is a missing object */
>> +       if (fetch_if_missing && repository_format_partial_clone &&
>> +           !already_retried) {
>> +               fetch_object(repository_format_partial_clone, real);
>> +               already_retried = 1;
>> +               goto retry;
>>          }
>>
>> +       return -1;
>> +
>> +found_packed:
>>          if (oi == &blank_oi)
[...]
Show 5 quoted lines
> 
> The above is adding 2 different gotos into this function while there
> are quite simple ways to avoid them. See
> https://public-inbox.org/git/CAP8UFD2THRj7+RXmismUtUOpXQv4wM7aZsejpd_FHEOycP+ZJA@mail.gmail.com/
> and the follow up email in the thread.

Personally, I'm OK with limited goto's like these. Yes, they are ugly, but not that complicated. Alternatively, we could put everything between the 2 labels in a while (1) {...} and replace the goto's with break's and continue's. I think it would be better to revisit this later, as I'd rather not start refactoring sha1_file.c in the middle of what is already a 30+ commit patch series (for the 3 parts of partial clone).

Thoughts? Jeff

Previous: Christian CouderNext: Jeff Hostetler
Message 11 of 20 in “Partial clone part 2: fsck and promisors”
  1. 00/10 Partial clone part 2: fsck and promisorsJeff Hostetler, Nov 21, 2017
  2. 01/10 extension.partialclone: introduce partial clone extensionJeff Hostetler, Nov 21, 2017
  3. 04/10 fsck: support referenced promisor objectsJeff Hostetler, Nov 21, 2017
  4. 09/10 rev-list: support termination at promisor objectsJeff Hostetler, Nov 21, 2017
  5. 10/10 gc: do not repack promisor packfilesJeff Hostetler, Nov 21, 2017
  6. Christian CouderDec 2, 2017
  7. Jeff HostetlerDec 5, 2017
  8. 05/10 fsck: support promisor objects as CLI argumentJeff Hostetler, Nov 21, 2017
  9. 08/10 sha1_file: support lazily fetching missing objectsJeff Hostetler, Nov 21, 2017
  10. Christian CouderDec 2, 2017
  11. Jeff HostetlerDec 5, 2017
  12. 07/10 introduce fetch-object: fetch one promisor objectJeff Hostetler, Nov 21, 2017
  13. Christian CouderDec 2, 2017
  14. Jeff HostetlerDec 5, 2017
  15. 02/10 fsck: introduce partialclone extensionJeff Hostetler, Nov 21, 2017
  16. 03/10 fsck: support refs pointing to promisor objectsJeff Hostetler, Nov 21, 2017
  17. 06/10 index-pack: refactor writing of .keep filesJeff Hostetler, Nov 21, 2017
  18. Junio C HamanoNov 22, 2017
  19. Jonathan TanNov 22, 2017
  20. Jonathan TanNov 22, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.