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

Re: [RFC PATCH 02/10] Move textconv_object to be with other textconv methods

From
Jeff King <peff@peff.net>
Date
May 8, 2017, 21:55 UTC
Message-ID
<20170508215525.gcyzzntqvm52mqcc@sigill.intra.peff.net>
In-Reply-To
<xmqq1ss0cg8t.fsf@gitster.mtv.corp.google.com>
On Mon, May 08, 2017 at 10:02:58AM +0900, Junio C Hamano wrote:
Show 8 quoted lines
> Stefan Beller <sbeller@google.com> writes:
> 
> > I guess it is ok for now and in this series, but we may want
> > to split up diff.[ch] in the future into multiple finer grained files.
> 
> For what end?  Such a split would require more symbols internal to
> diff.[ch] to become external, which is a big downside, so we need to
> have a large reward to compensate it if we were to go there.

I think there are two sides to that coin. Let's say you have a file with five functions (and you can replace function with structs, global variables, etc; any unit of complexity that might or might not be externally visible):

  /* called by both a() and b() */
  static void a_and_b_helper();
  /* called by a() */
  static void a_helper();
  void a();
  /* called by b() */
  static void b_helper();
  void b();

When they are in the same file, b() and b_helper() can see a_helper(), even though they don't need it. And that means increased complexity in dealing with a_helper(), because its visibility is larger than necessary. We have to worry about what a change to it might do to b() (or more realistically, c(), d(), etc).

If we split this apart, we end up with three files:
   common.c:
     void a_and_b_helper();
   a.c:
     static void a_helper();
     void a();
   b.c:
     static void b_helper();
     void b();

The specific helpers have less visibility, which is good. The public functions a() and b() were already public, so no change. But now the common helper is public, too, even though nobody except a() and b() care about it.

So it's a tradeoff. And the important question is: is the bleed-over between a() and b() worse than the common bits being made public? That can't be answered without looking at how many distinct "a" and "b"-like chunks there are in the file, and what the common bits look like. I'm not sure of the answer for diff.c. Without digging, both ends of the spectrum seem equally plausible to me: that it is mostly a set of N distinct units which could be split apart, or that it really is a few public functions calling the same common core over and over.

And a follow-on question is what we can do to mitigate the cost of making the common code public. We could advertise a_and_b_helper() only in diff-internal.h, and then makes it only semi-public (anybody can include that, of course, but including diff-internal.h seems like it ought to be a red flag). That only helps the programmer, though; we'd still be losing out on compiler optimizations and static analysis that only looks at one translation unit at a time.

Phew. That ended up a little long-winded. All of it is to say that I don't think it makes sense to reject a split out-of-hand, but nor is it always a good thing. It depends on what's in the file.

-Peff
Previous: Junio C HamanoNext: Stefan Beller
Message 16 of 52 in “Add blame to libgit”
  1. 00/10 Add blame to libgitJeff Smith, May 5, 2017
  2. 01/10 Remove unneeded dependency on blob.h from blameJeff Smith, May 5, 2017
  3. Ævar Arnfjörð BjarmasonMay 5, 2017
  4. 03/10 Add some missing definitions to header filesJeff Smith, May 5, 2017
  5. Junio C HamanoMay 5, 2017
  6. 05/10 Split blame origin into its own fileJeff Smith, May 5, 2017
  7. 07/10 Break out scoreboard a little betterJeff Smith, May 5, 2017
  8. Junio C HamanoMay 5, 2017
  9. 09/10 Break out scoreboard init and setupJeff Smith, May 5, 2017
  10. 08/10 Split blame scoreboard into its own fileJeff Smith, May 5, 2017
  11. 06/10 Move fake_working_tree_commit() to libJeff Smith, May 5, 2017
  12. 02/10 Move textconv_object to be with other textconv methodsJeff Smith, May 5, 2017
  13. Junio C HamanoMay 5, 2017
  14. Stefan BellerMay 5, 2017
  15. Junio C HamanoMay 8, 2017
  16. Jeff KingMay 8, 2017
  17. Stefan BellerMay 8, 2017
  18. Junio C HamanoMay 9, 2017
  19. Jeff KingMay 9, 2017
  20. 04/10 Remove unused parameter from get_origin()Jeff Smith, May 5, 2017
  21. 10/10 Move scoreboard init and setup to libJeff Smith, May 5, 2017
  22. Junio C HamanoMay 5, 2017
  23. 00/22 Add blame to libgitJeff Smith, May 14, 2017
  24. 01/22 blame: remove unneeded dependency on blob.hJeff Smith, May 14, 2017
  25. 03/22 blame: remove unused parametersJeff Smith, May 14, 2017
  26. 02/22 blame: move textconv_object with related functionsJeff Smith, May 14, 2017
  27. 05/22 blame: move scoreboard structure to headerJeff Smith, May 14, 2017
  28. 06/22 blame: move stat counters to scoreboardJeff Smith, May 14, 2017
  29. 04/22 blame: move origin and entry structures to headerJeff Smith, May 14, 2017
  30. Junio C HamanoMay 14, 2017
  31. 07/22 blame: move copy/move thresholds to scoreboardJeff Smith, May 14, 2017
  32. 08/22 blame: move contents_from to scoreboardJeff Smith, May 14, 2017
  33. 11/22 blame: move xdl_opts flags to scoreboardJeff Smith, May 14, 2017
  34. 10/22 blame: move show_root flag to scoreboardJeff Smith, May 14, 2017
  35. 09/22 blame: move reverse flag to scoreboardJeff Smith, May 14, 2017
  36. 18/22 blame: move fake-commit-related methods to libgitJeff Smith, May 14, 2017
  37. 21/22 blame: create scoreboard setup function in libgitJeff Smith, May 14, 2017
  38. 19/22 blame: move scoreboard-related methods to libgitJeff Smith, May 14, 2017
  39. 15/22 blame: wrap blame_sort and compare_blame_finalJeff Smith, May 14, 2017
  40. 20/22 blame: create scoreboard init function in libgitJeff Smith, May 14, 2017
  41. 22/22 blame: create entry prepend function in libgitJeff Smith, May 14, 2017
  42. 13/22 blame: make sanity_check use a callback in scoreboardJeff Smith, May 14, 2017
  43. 17/22 blame: move origin-related methods to libgitJeff Smith, May 14, 2017
  44. 16/22 blame: rework methods that determine 'final' commitJeff Smith, May 14, 2017
  45. 14/22 blame: move progess updates to a scoreboard callbackJeff Smith, May 14, 2017
  46. 12/22 blame: move no_whole_file_rename flag to scoreboardJeff Smith, May 14, 2017
  47. Junio C HamanoMay 15, 2017
  48. Jeffrey SmithMay 15, 2017
  49. Junio C HamanoMay 16, 2017
  50. Jeffrey SmithMay 16, 2017
  51. Junio C HamanoMay 16, 2017
  52. Jeffrey SmithMay 5, 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.