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

Re: [PATCH v3 1/9] rebase -i: generate the script via rebase--helper

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
May 1, 2017, 11:47 UTC
Message-ID
<alpine.DEB.2.20.1705011307450.3480@virtualbox>
In-Reply-To
<xmqq4lx5i83q.fsf@gitster.mtv.corp.google.com>
Hi Junio,
On Sun, 30 Apr 2017, Junio C Hamano wrote:
Show 9 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> 
> > In that case, I would strongly advise to consider redesigning the API.
> 
> The API we currently have and is used by "log", "rev-list" and friends
> is to have setup_revisions() parse the av[], i.e. the textual API, and
> it is sufficient to hide from the caller the implementation detail of
> what bit rev_info structure has and which bits are flipped when reacting
> to say "--format=..."  option [*1*].

Yes, this (parsing options passed in as strings, with the very real possibility of catching coding errors only at runtime) is the current way the API is used.

Sometimes.
And sometimes not.

For example, in builtin/bisect.c's show_diff_tree() function, we *do* call setup_revisions(), but with argc = 0. We set all the options beforehand to avoid parsing, to avoid runtime-instead-of-compile-time errors.

The same holds true for builtin/merge.c's squash_message() function.
> As the implementaiton detail of which bits are flipped when reacting to
> each options is _not_ the API, we are essentially left with two choices:
> write this series to the current textual API, or invent an alternate API
> [*2*] and write this series to that new API.

You make it sound as if my goal was to imitate slavishly what that option did that was passed to the Git command in the git-rebase--interactive.sh script.

But that is not what my goal is.

My goal is to imitate the *intent* of the shell script. Faithfully, of course. The fact that the shell script had no better way to access the internal API than to call the Git command is just a red herring.

What I really want to do *is* to access the revision machinery, as bare metal as possible, because sequencer *is bare metal, too*.

The current code fulfills that goal rather excellently.

Your suggested change to call the parser and pass plain options as plain text really flies in the face of this goal.

Your suggested alternative is actually not necessary here, as the code does exactly what it is supposed to do: it calls, from the internal libgit.a, another part of libgit.a, and therefore it is totally legitimate to use implementation details.

If my code were bleeding implementation details to the user interface, I would agree with you that there is an issue.

But that code does not do that. To the contrary, it hides those implementation details behind a rather simple user interface.

In the long run, I think you are correct in your fear that bits may be set incorrectly.

The solution for that is, of course, not to rewrite the API. The solution is to make the API less fragile.

To be explicit about the fragility in question: the API should not require the pretty_given bit at all, but it should use an initialized pretty_print_context within the rev_info struct as indicator that the pretty print machinery should be used to print out commit messages.

There is something even more fragile about the current concept of parsing --pretty: the fact that get_commit_format() sets a *file-local* variable `user_format`, and that that variable is then used for formatting when pretty_given = 1, is just asking for trouble.

This fragile aspect of the API simply dooms the revision API to suffer side effects until fixed.

After writing this, I really, really, really fail even more to see why you make such a big deal out of the pretty_given bit. It is insignificant. If I were you, I would worry much, much, much, MUCH more about the fact that `user_format` in pretty.c is changed implicitly by sequencer_make_script() (not the fault of my patch, of course, but of the way get_commit_format() operates).

Obviously this latter issue (the `user_format` side effect) is what is a real problem later on, when we try to make rebase a true builtin, as sequencer_make_script() will be called as part of a larger operation that will subsequently run the rebase, and may very well use the revision machinery to print other commit messages again, *possibly using that `user_format` by mistake*.

Now, if your suggestion to undo the compile-time safety in favor of a runtime error, say, in case of a speling eror (which I really would like to avoid, as I find it a highly sloppy development style to turn compile time errors into runtime errors for no good reason) would help avoid this problem with the `user_format`, I would grudgingly bite my tongue, implement what you suggested and move forward.

But it does not. All it does make the code less safe by pushing a possible problem from the time of compilation to the time of running the code. Meaning that problems would be found by users, when developers could have caught them without this change.

I really wish we were on the same page that this is a really bad idea.

Ciao, Dscho

Previous: Junio C HamanoNext: Phillip Wood
Message 39 of 100 in “The final building block for a faster rebase -i”
  1. 0/9 The final building block for a faster rebase -iJohannes Schindelin, Sep 2, 2016
  2. 1/9 rebase -i: generate the script via rebase--helperJohannes Schindelin, Sep 2, 2016
  3. 2/9 rebase -i: remove useless indentationJohannes Schindelin, Sep 2, 2016
  4. 3/9 rebase -i: do not invent onelines when expanding/collapsing SHA-1sJohannes Schindelin, Sep 2, 2016
  5. 4/9 rebase -i: also expand/collapse the SHA-1s via the rebase--helperJohannes Schindelin, Sep 2, 2016
  6. Dennis KaarsemakerSep 2, 2016
  7. Johannes SchindelinSep 3, 2016
  8. 5/9 t3404: relax rebase.missingCommitsCheck testsJohannes Schindelin, Sep 2, 2016
  9. 6/9 rebase -i: check for missing commits in the rebase--helperJohannes Schindelin, Sep 2, 2016
  10. Dennis KaarsemakerSep 2, 2016
  11. 8/9 t3415: test fixup with wrapped onelineJohannes Schindelin, Sep 2, 2016
  12. 7/9 rebase -i: skip unnecessary picks using the rebase--helperJohannes Schindelin, Sep 2, 2016
  13. 9/9 rebase -i: rearrange fixup/squash lines using the rebase--helperJohannes Schindelin, Sep 2, 2016
  14. Josh TriplettSep 3, 2016
  15. Johannes SchindelinSep 4, 2016
  16. 0/9 The final building block for a faster rebase -iJohannes Schindelin, Apr 25, 2017
  17. 3/9 rebase -i: do not invent onelines when expanding/collapsing SHA-1sJohannes Schindelin, Apr 25, 2017
  18. 1/9 rebase -i: generate the script via rebase--helperJohannes Schindelin, Apr 25, 2017
  19. Jeff KingApr 26, 2017
  20. Johannes SchindelinApr 26, 2017
  21. 2/9 rebase -i: remove useless indentationJohannes Schindelin, Apr 25, 2017
  22. 5/9 t3404: relax rebase.missingCommitsCheck testsJohannes Schindelin, Apr 25, 2017
  23. 4/9 rebase -i: also expand/collapse the SHA-1s via the rebase--helperJohannes Schindelin, Apr 25, 2017
  24. 8/9 t3415: test fixup with wrapped onelineJohannes Schindelin, Apr 25, 2017
  25. 6/9 rebase -i: check for missing commits in the rebase--helperJohannes Schindelin, Apr 25, 2017
  26. 9/9 rebase -i: rearrange fixup/squash lines using the rebase--helperJohannes Schindelin, Apr 25, 2017
  27. 7/9 rebase -i: skip unnecessary picks using the rebase--helperJohannes Schindelin, Apr 25, 2017
  28. Jeff KingApr 26, 2017
  29. Johannes SchindelinApr 26, 2017
  30. Junio C HamanoApr 26, 2017
  31. 0/9 The final building block for a faster rebase -iJohannes Schindelin, Apr 26, 2017
  32. 1/9 rebase -i: generate the script via rebase--helperJohannes Schindelin, Apr 26, 2017
  33. Junio C HamanoApr 27, 2017
  34. Johannes SchindelinApr 27, 2017
  35. Junio C HamanoApr 28, 2017
  36. Junio C HamanoApr 28, 2017
  37. Johannes SchindelinApr 28, 2017
  38. Junio C HamanoMay 1, 2017
  39. Johannes SchindelinMay 1, 2017
  40. Phillip WoodApr 28, 2017
  41. Johannes SchindelinApr 28, 2017
  42. Phillip WoodMay 1, 2017
  43. Johannes SchindelinMay 1, 2017
  44. Junio C HamanoMay 1, 2017
  45. Johannes SchindelinMay 1, 2017
  46. 2/9 rebase -i: remove useless indentationJohannes Schindelin, Apr 26, 2017
  47. 3/9 rebase -i: do not invent onelines when expanding/collapsing SHA-1sJohannes Schindelin, Apr 26, 2017
  48. 5/9 t3404: relax rebase.missingCommitsCheck testsJohannes Schindelin, Apr 26, 2017
  49. Junio C HamanoApr 27, 2017
  50. Johannes SchindelinApr 27, 2017
  51. 4/9 rebase -i: also expand/collapse the SHA-1s via the rebase--helperJohannes Schindelin, Apr 26, 2017
  52. Junio C HamanoApr 27, 2017
  53. Junio C HamanoApr 27, 2017
  54. Johannes SchindelinApr 27, 2017
  55. Junio C HamanoApr 28, 2017
  56. Johannes SchindelinApr 28, 2017
  57. 6/9 rebase -i: check for missing commits in the rebase--helperJohannes Schindelin, Apr 26, 2017
  58. Junio C HamanoApr 27, 2017
  59. Johannes SchindelinApr 28, 2017
  60. 7/9 rebase -i: skip unnecessary picks using the rebase--helperJohannes Schindelin, Apr 26, 2017
  61. 8/9 t3415: test fixup with wrapped onelineJohannes Schindelin, Apr 26, 2017
  62. 9/9 rebase -i: rearrange fixup/squash lines using the rebase--helperJohannes Schindelin, Apr 26, 2017
  63. 00/10 The final building block for a faster rebase -iJohannes Schindelin, Apr 28, 2017
  64. 01/10 t3415: verify that an empty instructionFormat is handled as beforeJohannes Schindelin, Apr 28, 2017
  65. 02/10 rebase -i: generate the script via rebase--helperJohannes Schindelin, Apr 28, 2017
  66. 02/10 rebase -i: generate the script via rebase--helperLiam Beguin, May 26, 2017
  67. Johannes SchindelinMay 29, 2017
  68. liam BeguinMay 30, 2017
  69. liam BeguinMay 30, 2017
  70. Junio C HamanoMay 29, 2017
  71. Johannes SchindelinMay 29, 2017
  72. Junio C HamanoMay 30, 2017
  73. Johannes SchindelinMay 30, 2017
  74. revision API design, was Re: [PATCH v4 02/10] rebase -i: generate the script via rebase--helperJohannes Schindelin, May 30, 2017
  75. Junio C HamanoMay 30, 2017
  76. Junio C HamanoJun 1, 2017
  77. 03/10 rebase -i: remove useless indentationJohannes Schindelin, Apr 28, 2017
  78. 03/10 rebase -i: remove useless indentationLiam Beguin, May 26, 2017
  79. Stefan BellerMay 26, 2017
  80. liam BeguinMay 27, 2017
  81. 04/10 rebase -i: do not invent onelines when expanding/collapsing SHA-1sJohannes Schindelin, Apr 28, 2017
  82. 05/10 rebase -i: also expand/collapse the SHA-1s via the rebase--helperJohannes Schindelin, Apr 28, 2017
  83. 05/10 rebase -i: also expand/collapse the SHA-1s via the rebase--helperLiam Beguin, May 26, 2017
  84. Johannes SchindelinMay 29, 2017
  85. 06/10 t3404: relax rebase.missingCommitsCheck testsJohannes Schindelin, Apr 28, 2017
  86. 07/10 rebase -i: check for missing commits in the rebase--helperJohannes Schindelin, Apr 28, 2017
  87. 08/10 rebase -i: skip unnecessary picks using the rebase--helperJohannes Schindelin, Apr 28, 2017
  88. 09/10 t3415: test fixup with wrapped onelineJohannes Schindelin, Apr 28, 2017
  89. 10/10 rebase -i: rearrange fixup/squash lines using the rebase--helperJohannes Schindelin, Apr 28, 2017
  90. 10/10 rebase -i: rearrange fixup/squash lines using the rebase--helperLiam Beguin, May 26, 2017
  91. Johannes SchindelinMay 29, 2017
  92. 00/10 The final building block for a faster rebase -iLiam Beguin, May 26, 2017
  93. René ScharfeMay 27, 2017
  94. Johannes SchindelinMay 29, 2017
  95. Ævar Arnfjörð BjarmasonMay 29, 2017
  96. Johannes SchindelinMay 30, 2017
  97. Ævar Arnfjörð BjarmasonMay 30, 2017
  98. Ævar Arnfjörð BjarmasonMay 31, 2017
  99. Johannes SchindelinMay 29, 2017
  100. Junio C HamanoMay 29, 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.