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

Re: [PATCH v2 4/4] log: --author-date-order

From
Jeff King <peff@peff.net>
Date
Jun 20, 2013, 20:16 UTC
Message-ID
<20130620201650.GB31364@sigill.intra.peff.net>
In-Reply-To
<7v61x8tw0a.fsf@alter.siamese.dyndns.org>
On Thu, Jun 20, 2013 at 12:36:21PM -0700, Junio C Hamano wrote:
Show 26 quoted lines
> > I like the latter option. It takes a non-trivial amount of time to load
> > the commits from disk, and now we are potentially doing it 2 or 3 times
> > for a run (once to parse, once to get the author info for topo-sort, and
> > possibly later to show it if --pretty is given; though I did not check
> > and maybe we turn off save_commit_buffer with --pretty). It would be
> > nice to have an extended parse_object that handled that. I'm not sure of
> > the interface. Maybe variadic with pairs of type/slab, like:
> >
> >   parse_commit_extended(commit,
> >                         PARSE_COMMIT_AUTHORDATE, &authordate_slab,
> >                         PARSE_COMMIT_DONE);
> >
> > ?
> 
> What I had in mind actually was a custom slab tailored for each
> caller that is an array of struct.  If the caller is interested in
> authordate and authorname, instead of populating two separate
> authordate_slab and authorname_slab, the caller declares a
> 
> 	struct {
>         	unsigned long date;
>                 char name[FLEX_ARRAY];
> 	} author_info;
> 
> prepares author_info_slab, and use your commit_parser API to fill
> them.

Yes, I think it is nicer to stay in one slab if you have multiple values, but it means more custom code for the caller. If the commit_parser API is nice, it should not be that much code, though.

It does make it harder to support arbitrary combinations directly in parse_commit. If a caller wants to also parse_commit and use the same buffer to pick out its custom information, I think we'd need to do one of:

  1. Give parse_commit a callback, so that the callback can pick out the
     data it wants while parse_commit has the commit buffer in memory.
     E.g.:
       void grab_author_info(const char *buf, unsigned long len, void *data)
       {
              struct author_info *ai = data;
              /* fill fields from buffer */
       }
       ...
       parse_commit_extra(commit, grab_author_info,
                          slab_at(&author_slab, commit));
  2. Teach parse_commit to operate not only on a raw commit object, but
     also on the commit_parser API. Like:
       struct commit_parser parser = {0};
       /* actually open the object and start our incremental parser */
       init_commit_parser(&parser, commit);
       /* fill in parents, date, etc, as parse_commit does now */
       parse_commit_from_parser(commit, &parser);
       /* fill in whatever extra data we are interested in */
       *slab_at(&slab, commit) = get_author_date(&parser);
       /* done, drop the buffer */
       close_commit_parser(&parser);

The latter would need to handle transferring ownership of the buffer to "struct commit" from "struct commit_parser" when save_commit_buffer is turned off.

I think we're a bit high-level now to be making such decisions, though, as we do not even have such a commit_parser API.

-Peff
Previous: Junio C HamanoNext: Eric Sunshine
Message 47 of 51 in “add --authorship-order flag to git log / rev-list”
  1. add --authorship-order flag to git log / rev-listelliottcable, Jun 4, 2013
  2. rev-list: add --authorship-order alternative orderingelliottcable, Jun 4, 2013
  3. Junio C HamanoJun 4, 2013
  4. Junio C HamanoJun 4, 2013
  5. Elliott CableJun 6, 2013
  6. Junio C HamanoJun 6, 2013
  7. Elliott CableJun 6, 2013
  8. Junio C HamanoJun 6, 2013
  9. Junio C HamanoJun 6, 2013
  10. toposort: rename "lifo" fieldJunio C Hamano, Jun 6, 2013
  11. Junio C HamanoJun 7, 2013
  12. 0/3 Preparing for --date-order=authorJunio C Hamano, Jun 7, 2013
  13. 1/3 toposort: rename "lifo" fieldJunio C Hamano, Jun 7, 2013
  14. Eric SunshineJun 7, 2013
  15. Junio C HamanoJun 7, 2013
  16. 2/3 commit-queue: LIFO or priority queue of commitsJunio C Hamano, Jun 7, 2013
  17. Eric SunshineJun 7, 2013
  18. 3/3 sort-in-topological-order: use commit-queueJunio C Hamano, Jun 7, 2013
  19. 0/4 log --author-date-orderJunio C Hamano, Jun 9, 2013
  20. 1/4 toposort: rename "lifo" fieldJunio C Hamano, Jun 9, 2013
  21. Eric SunshineJun 10, 2013
  22. Jeff KingJun 10, 2013
  23. 2/4 commit-queue: LIFO or priority queue of commitsJunio C Hamano, Jun 9, 2013
  24. Jeff KingJun 10, 2013
  25. Junio C HamanoJun 10, 2013
  26. Jeff KingJun 10, 2013
  27. Junio C HamanoJun 10, 2013
  28. Jeff KingJun 10, 2013
  29. Junio C HamanoJun 10, 2013
  30. Jeff KingJun 11, 2013
  31. Junio C HamanoJun 11, 2013
  32. 0/4 log --author-date-orderJunio C Hamano, Jun 11, 2013
  33. 1/4 toposort: rename "lifo" fieldJunio C Hamano, Jun 11, 2013
  34. 2/4 prio-queue: priority queue of pointers to structsJunio C Hamano, Jun 11, 2013
  35. 3/4 sort-in-topological-order: use prio-queueJunio C Hamano, Jun 11, 2013
  36. 4/4 log: --author-date-orderJunio C Hamano, Jun 11, 2013
  37. 3/4 sort-in-topological-order: use commit-queueJunio C Hamano, Jun 9, 2013
  38. Junio C HamanoJun 9, 2013
  39. Jeff KingJun 10, 2013
  40. Junio C HamanoJun 10, 2013
  41. Jeff KingJun 10, 2013
  42. 4/4 log: --author-date-orderJunio C Hamano, Jun 9, 2013
  43. Jeff KingJun 10, 2013
  44. Junio C HamanoJun 10, 2013
  45. Jeff KingJun 10, 2013
  46. Junio C HamanoJun 20, 2013
  47. Jeff KingJun 20, 2013
  48. Eric SunshineJun 7, 2013
  49. Jeff KingJun 4, 2013
  50. Junio C HamanoJun 4, 2013
  51. Elliott CableJun 6, 2013

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.