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

Re: GSoC Git Proposal Draft - ZheNing Hu

From
Jeff King <peff@peff.net>
Date
Apr 2, 2021, 15:39 UTC
Message-ID
<YGc6ybE1wD1ck0uB@coredump.intra.peff.net>
In-Reply-To
<CAOLTT8RfE4nn5NnjZh7xuF09-5=+K+_j_2kP0327HVdR4x_wAQ@mail.gmail.com>
On Fri, Apr 02, 2021 at 05:03:17PM +0800, ZheNing Hu wrote:
Show 18 quoted lines
> * Because part of the feature of `git for-each-ref` is very similar to
> that of `git cat-file`, I think `git cat-file` can learn some feasible
> solutions from it.
> 
> #### My possible solutions:
> 
> 1. Same [solution](https://github.com/git/git/pull/568/commits/cc40c464e813fc7a6bd93a01661646114d694d76)
> as Olga, add member `struct ref_format format` in `struct
> batch_options`.
> 2. Use the function
> [`verify_ref_format()`](https://github.com/gitgitgadget/git/blob/84d06cdc06389ae7c462434cb7b1db0980f63860/ref-filter.c#L904)
> to replace the first `expand_format()` for parsing format strings.
> 3. Write a function like
> [`format_ref_array_item()`](https://github.com/gitgitgadget/git/blob/84d06cdc06389ae7c462434cb7b1db0980f63860/ref-filter.c#L2392),
> get information about objects, and use `get_object()` to grub the
> information which we prefer (or just use `grab_common_value()`).
> 4. The migration of `%(rest)` may require learning the handling of
> `%(if)` ,`%(else)`.

I think one thing to keep an eye on here is the performance of cat-file. The formatting code used by for-each-ref is rather slow (it may load more of the object details than is necessary, it is too eager to allocate intermediate strings, and so on). That's usually not _too_ big a problem for ref-filter, because the number of refs tends to be much smaller than the number of total objects. But I'd expect that moving to the ref-filter code would make something like:

 git cat-file --batch-all-objects --batch-check='%(objectname) %(objecttype)'
measurably slower.

IMHO the right path forward is not to try porting cat-file to use the ref-filter code, but to start first with writing a universal formatting module that takes the best of both implementations (and the commit pretty-printer):

  - separate the format-parsing stage from formatting actual items, as
    ref-filter does. This lets us have more complex formats without
    paying a per-item runtime cost while formatting. This should also
    allow us to handle multiple syntaxes for the same thing (e.g.,
    ref-filter %(authorname) vs pretty.c %an).
  - figure out which data will be needed for each item based on the
    parsed format, and then do the minimum amount of work to get that
    data (using "oid_object_info_extended()" helps here, because it
    likewise tries to do as little work as possible to satisfy the
    request, but there are many elements that it doesn't know about)
  - likewise avoid doing any intermediate work we can; as much as
    possible, format the result directly into a result strbuf, rather
    than allocating many sub-strings and assembling them (as cat-file
    does).
  - handle formats where the necessary item data may or may not be
    present. E.g., if we're given a refname, then "%(refname)" makes
    sense. But in cat-file we'd not have a refname, and just an object.
    We should still be able to use the same formatting code to handle
    "%(objecttype)", etc. Likewise for formats which require a specific
    type (say %(authorname) for a commit, but the object is a blob).
    Ref-filter does this to some degree for things like authorname, but
    we'd be extending it to the case that we don't even have a refname.
-Peff
Previous: ZheNing HuNext: ZheNing Hu
Message 4 of 11 in “GSoC Git Proposal Draft - ZheNing Hu”
  1. ZheNing HuApr 2, 2021
  2. Christian CouderApr 2, 2021
  3. ZheNing HuApr 3, 2021
  4. Jeff KingApr 2, 2021
  5. ZheNing HuApr 3, 2021
  6. Jeff KingApr 7, 2021
  7. ZheNing HuApr 8, 2021
  8. ZheNing HuApr 11, 2021
  9. ZheNing HuApr 11, 2021
  10. Jeff KingApr 13, 2021
  11. ZheNing HuApr 13, 2021

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.