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

Re: [PATCH 00/30] Read loose references lazily

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 25, 2012, 18:39 UTC
Message-ID
<xmqqbomfd5bt.fsf@junio.mtv.corp.google.com>
In-Reply-To
<1335307536-26914-1-git-send-email-mhagger@alum.mit.edu>
mhagger@alum.mit.edu writes:
Show 17 quoted lines
> From: Michael Haggerty <mhagger@alum.mit.edu>
>
> This is the next installment of the ref-api saga.  The main result of
> this patch series is to teach git to read loose references one
> directory at a time, only when they are needed.
>
> The first nine commits are not very interesting; they convert
> get_ref_dir() and do_for_each_reflog() to use strbufs and to tighten
> up their specifications.  The search_for_subdir() function extracted
> in patch 5 will be useful later.  Patch 6 slightly reduces the amount
> of work needed to read loose refs from disk, and also changes the
> function's API in a way that will be needed later when directories are
> read one at a time.
>
> Patches 10 - 25 mostly switch a lot of code from using ref_dir
> pointers to using ref_entry pointers as arguments and return values.
> This is important, because ...

The earlier parts looked sane, but the ref_dir set of patches looked like merely working around the fact that "struct ref_dir" does not have the name field and you had to upcast it to ref_entry to access the full name.

All the places that used to take ref_dir never wanted to get an entry that represents a leaf node (i.e. ref_value kind of ref_entry), but now because you made everybody to take ref_entry, the resulting code is much more error prone and the static type checking done by the compiler helps us much less when updating the code. It can already be seen that you had to sprinkle a lot of assert(flag & REF_DIR), but at runtime in non-debug build that will become no-op and it is not a substitute for the static type checking we used to have.

Can't we approach this differently so that we can keep the type safety?
Previous: mhagger@alum.mit.eduNext: Michael Haggerty
Message 36 of 37 in “Read loose references lazily”
  1. 00/30 Read loose references lazilymhagger@alum.mit.edu, Apr 24, 2012
  2. 01/30 get_ref_dir(): return early if directory cannot be readmhagger@alum.mit.edu, Apr 24, 2012
  3. 02/30 get_ref_dir(): use a strbuf to hold refnamemhagger@alum.mit.edu, Apr 24, 2012
  4. 03/30 get_ref_dir(): rename "base" parameter to "dirname"mhagger@alum.mit.edu, Apr 24, 2012
  5. 04/30 get_ref_dir(): require that the dirname argument ends in '/'mhagger@alum.mit.edu, Apr 24, 2012
  6. 05/30 refs.c: extract function search_for_subdir()mhagger@alum.mit.edu, Apr 24, 2012
  7. 06/30 get_ref_dir(): take the containing directory as argumentmhagger@alum.mit.edu, Apr 24, 2012
  8. 07/30 do_for_each_reflog(): return early on errormhagger@alum.mit.edu, Apr 24, 2012
  9. 08/30 do_for_each_reflog(): use a strbuf to hold logfile namemhagger@alum.mit.edu, Apr 24, 2012
  10. 09/30 do_for_each_reflog(): reuse strbuf across recursive function callsmhagger@alum.mit.edu, Apr 24, 2012
  11. 10/30 refs: wrap top-level ref_dirs in ref_entriesmhagger@alum.mit.edu, Apr 24, 2012
  12. Michael HaggertyApr 26, 2012
  13. 11/30 get_packed_refs(): return (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  14. 12/30 get_loose_refs(): return (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  15. 13/30 is_refname_available(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  16. 14/30 find_ref(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  17. 15/30 read_packed_refs(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  18. 16/30 add_ref(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  19. 17/30 find_containing_direntry(): use (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  20. 18/30 get_ref_dir(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  21. 19/30 get_ref_dir(): remove dirname argumentmhagger@alum.mit.edu, Apr 24, 2012
  22. 20/30 search_for_subdir(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  23. 21/30 search_ref_dir(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  24. 22/30 add_entry(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  25. 23/30 do_for_each_ref_in_dirs(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  26. 24/30 do_for_each_ref_in_dir(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  27. 25/30 sort_ref_dir(): take (ref_entry *) instead of (ref_dir *)mhagger@alum.mit.edu, Apr 24, 2012
  28. 26/30 struct ref_dir: store a reference to the enclosing ref_cachemhagger@alum.mit.edu, Apr 24, 2012
  29. 27/30 read_loose_refs(): rename function from get_ref_dir()mhagger@alum.mit.edu, Apr 24, 2012
  30. 28/30 read_loose_refs(): access ref_cache via the ref_dir fieldmhagger@alum.mit.edu, Apr 24, 2012
  31. 29/30 create_dir_entry(): allow the flag value to be passed as an argumentmhagger@alum.mit.edu, Apr 24, 2012
  32. Junio C HamanoApr 25, 2012
  33. Junio C HamanoApr 25, 2012
  34. Michael HaggertyApr 26, 2012
  35. 30/30 refs: read loose references lazilymhagger@alum.mit.edu, Apr 24, 2012
  36. Junio C HamanoApr 25, 2012
  37. Michael HaggertyApr 26, 2012

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.