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

Re: [PATCH 1/3] merge-ort: copy a few small helper functions from merge-recursive.c

From
Elijah Newren <newren@gmail.com>
Date
Dec 16, 2020, 21:34 UTC
Message-ID
<CABPp-BE-EXbJxvJ-dy8SfK3-1rjsM0eKAq1G_vWMfC+A5UTHaQ@mail.gmail.com>
In-Reply-To
<xmqqlfdx32ln.fsf@gitster.c.googlers.com>
On Wed, Dec 16, 2020 at 12:42 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 21 quoted lines
>
> Elijah Newren <newren@gmail.com> writes:
>
> > I wonder if a slightly different codeflow may be easier to follow
> >>
> >>         struct commit_list *result = NULL;
> >>         while (list) {
> >>                 struct commit_list *next = list->next;
> >>                 list->next = result;
> >>                 result = list;
> >>                 list = next;
> >>         }
> >>         return result;
> >>
> >> if we were to try improving this for readability?
> >
> > Looks like Felipe also came up with the same version you did (modulo
> > the temporary variable name).
>
> Funny if it was sent as a response to the message that already had
> the same answer...
Show 23 quoted lines
>
> >> I dunno if it matters too much, though.
> >
> > Yeah, reverse_commit_list() has been unchanged in merge-recursive.c
> > since its introduction in August of 2006.  The function's purpose
> > seems obvious from its name, so no one ever needs to look at or modify
> > the implementation.  I'm certain I'll never touch it again.  So, I
> > personally don't care what the particular implementation is, and I'm
> > happy to take whatever reviewers prefer here.
> >
> > Since we have three people weighing in with opinions though -- and on
> > a point that's irrelevant to me -- do you want to make the call here
> > Junio?
>
> If I were pressed to give a suggestion, I have two ;-)
>
> I would prefer to see us first find out if all other callers of
> get_merge_bases() _care_ about a particular order of the resulting
> list.  If they do not care [*1*] and if it seems feasible to teach
> get_merge_bases() build its return value reversed already without
> too much extra effort, then the commit list reverser can
> disappear and get_merge_bases() can be fixed to return its commit
> list in older-to-newer order.

The ones in sequencer.c and builtin/merge.c care about the order, but they manually reverse it (because they are going to call the merge machinery). So, these two would benefit from it being reversed. However...

notes-merge.c and submodule.c both have subtle dependencies on the order (in ways that might be buggy). They could perhaps be taught to depend on the reversed order, but I'm leery of touching something that looks possibly buggy (one even has a TODO highlighting it) and becoming responsible.

get_octopus_merge_bases() depends on the order from get_merge_bases(), and builtin/merge-base.c depends on that function. So, the output order of a command depends on it, which might thus affect user scripts.

builtin/pull.c also depends on the order returned by get_octopus_merge_bases().

That's enough dependencies that I'm inclined to just leave this side of things as they are.

Show 9 quoted lines
> If the above does not happen, then I'd prefer to see a single commit
> list reverser in commit.c and have it *shared* between the two merge
> backends, instead of adding another one in merge-ort.c while leaving
> the one in merge-recursive.c behind.  And the single implementation
> can be either "copied from merge-recursive as that may be
> unintuitive or harder to follow but at least we know it is battle
> tested", or the one we see above.  If we were to take the latter, we
> really need to avoid making stupid mistakes while attempting to
> replace an existing awkward one with "simplified" version, though.

commit.c seems like a natural location. I'll insert a patch at the beginning of the series to move the function there, and just use Johannes' original version from 2006 as-is -- that'll make it easier to verify that my patch is simply moving things, anyway.

Show 7 quoted lines
> Sorry for listing even more work, but since you asked ... ;-)
>
>
> [Footnote]
>
> *1* if those who care actually would benefit if we used
> older-to-newer order, it would be even better.
Previous: Felipe ContrerasNext: Elijah Newren via GitGitGadget
Message 17 of 37 in “merge-ort: implement recursive merges”
  1. 0/3 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 15, 2020
  2. 3/3 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 15, 2020
  3. Junio C HamanoDec 16, 2020
  4. Elijah NewrenDec 16, 2020
  5. Elijah NewrenDec 16, 2020
  6. 2/3 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 15, 2020
  7. 1/3 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 15, 2020
  8. Junio C HamanoDec 16, 2020
  9. Johannes SchindelinDec 16, 2020
  10. Elijah NewrenDec 16, 2020
  11. Derrick StoleeDec 16, 2020
  12. Junio C HamanoDec 16, 2020
  13. Felipe ContrerasDec 16, 2020
  14. Elijah NewrenDec 16, 2020
  15. Junio C HamanoDec 16, 2020
  16. Felipe ContrerasDec 16, 2020
  17. Elijah NewrenDec 16, 2020
  18. 0/3 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 16, 2020
  19. 2/3 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 16, 2020
  20. 3/3 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 16, 2020
  21. Junio C HamanoDec 16, 2020
  22. Elijah NewrenDec 16, 2020
  23. 1/3 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 16, 2020
  24. 0/3 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 16, 2020
  25. 1/3 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 16, 2020
  26. 2/3 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 16, 2020
  27. 3/3 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 16, 2020
  28. 0/3 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 16, 2020
  29. 1/3 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 16, 2020
  30. 2/3 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 16, 2020
  31. 3/3 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 16, 2020
  32. 0/4 merge-ort: implement recursive mergesElijah Newren via GitGitGadget, Dec 16, 2020
  33. 1/4 commit: move reverse_commit_list() from merge-recursiveElijah Newren via GitGitGadget, Dec 16, 2020
  34. Derrick StoleeDec 17, 2020
  35. 2/4 merge-ort: copy a few small helper functions from merge-recursive.cElijah Newren via GitGitGadget, Dec 16, 2020
  36. 3/4 merge-ort: make clear_internal_opts() aware of partial clearingElijah Newren via GitGitGadget, Dec 16, 2020
  37. 4/4 merge-ort: implement merge_incore_recursive()Elijah Newren via GitGitGadget, Dec 16, 2020

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.