git/list[1] front-page[2] threads[3] people[4] search[5] about
wed 2026-10-07 17:29 UTC

Re: [PATCH 2/2] builtin/stash: merge index in-core

From
D. Ben Knoble <ben.knoble@gmail.com>
Date
Sep 22, 2026, 20:34 UTC
Message-ID
<CALnO6CDxew2b0X+HMiT0Vai_hj+MaueV9Ht2BOB5zrsZ27QUwg@mail.gmail.com>
In-Reply-To
<41d28f9d-b86a-4d65-9a85-656ea9d216e9@gmail.com>
Thanks again, Philip :)
On Tue, Sep 22, 2026 at 9:57 AM Phillip Wood <phillip.wood123@gmail.com> wrote:
Show 8 quoted lines
>
> Hi Ben
>
> On 22/09/2026 13:43, D. Ben Knoble wrote:
> I think there are wierd cases where one diff algorithm results in
> conflicts and another doesn't because they generate different (but
> equally valid) diffs so allowing the user to tweak the algorithm we use
> via init_ui_merge_options() is probably a good idea.
Gotcha; I've already queued this locally.
Show 13 quoted lines
> >>> +                     o.verbosity = 0;
> >>
> >> Looking at the code in merge-ort.c it appears the verbosity option was
> >> used by the recursive strategy but isn't used anymore so I think we
> >> could drop this.
> >
> > Intriguing. (Assuming the default "2") There's a "< 5" check in
> > path_msg() that wouldn't be affected by dropping this, and a "> 2"
> > check in checkout() that… also wouldn't be affected?
>
> The former is not affected because we're cherry-picking so never have an
> inner merge from merging multiple merge bases. The latter is not
> affected because we don't checkout the result!

That's very helpful; I find it challenging right now to navigate the various call-graphs here :)

Show 10 quoted lines
> > But it might matter if something is setting the verbosity elsewhere
> > (config, GIT_MERGE_VERBOSITY), and I think we really want this merge
> > to be quiet? I seem to remember reading commits in this area quieting
> > "git reset" and so on to keep the noise down.
> >
> > So I'm inclined to leave it for now, especially in case it later does get used.
>
> merge ort does not print anything - it just adds messages to an strmap
> in struct merge_result() which we ignore here. I guess setting it to
> zero might avoid a little work generating the messages.
Possibly! I still think it signals our intent to be quiet better this way, too.
Show 17 quoted lines
> >>> +                     oidcpy(&index_tree, &result.tree->object.oid);
> >>> +                     clear_merge_options(&o);
> >>
> >> Looking at replay.c:replay_revisions() I think this should be
> >>
> >> merge_finalize(&opts, &result);
> >
> > Hm, possibly. It does look like that does more with the "result,"
> > which is probably needed.
>
> Oh, we definitely want to free the strmap in the merge result.
>
>  > But it doesn't actually clear the merge options.
>
> Isn't that because there are no allocations in that struct? (obuf is
> unused - it looks like we could clean up the struct by removing the
> members that were used by merge-recursive but are ignored by merge-ort)

Maybe---I was more worried about un-reusable state, but it's true that the clear function is a no-op right now, heh. So it was a bit of "in case one day this is mandatory," perhaps.

Show 12 quoted lines
> > On one hand, I thought it could be important not to reuse that struct
> > between merges. But if we do use the "ui" init, it might be ok?
> > replay_revisions() does use the same struct between calls to
> > merge_incore_nonrecursive().
> >
> > Oh, but one other thing: we unconditionally reinit the merge options
> > later on in do_apply_stash(). We could conditionally initialize there
> > ("if (has_index)"), I suppose?
>
> I'd just move the call to init_ui_merge_options() above "if (index)". As
> far as I know it should be fine to reuse it - any state is stored in the
> result

Yeah, that's smarter. Locally I got tripped by the case where we said --index but skip some work; but it should be fine to unconditionally initialize those options earlier.

Show 5 quoted lines
> > Funny, I was getting aborts before removing the asserts because I
> > hadn't set the labels, aha. Looks like we've come back around to
> > keeping the labels.
>
> Sorry for that detour
No worries.
Show 5 quoted lines
> > I'll probably keep a similar structure as the
> > working tree merge uses, I think.
>
> I'd use fixed names and not bother with all the conditionals around the
> label text to keep it simple.

That's what I ended up with locally, yeah. I finally decided it was too complicated to do anything else for labels that would be really hard to find.

I'll get v2 out in the morning, probably.
-- 
D. Ben Knoble
Previous: Phillip WoodNext: D. Ben Knoble
Message 10 of 78 in “Hi all,”
  1. 0/2 Hi all,D. Ben Knoble, Sep 19, 2026
  2. 1/2 builtin/stash: remove unused headerD. Ben Knoble, Sep 19, 2026
  3. 2/2 builtin/stash: merge index in-coreD. Ben Knoble, Sep 19, 2026
  4. D. Ben KnobleSep 19, 2026
  5. Phillip WoodSep 21, 2026
  6. Junio C HamanoSep 21, 2026
  7. D. Ben KnobleSep 22, 2026
  8. D. Ben KnobleSep 22, 2026
  9. Phillip WoodSep 22, 2026
  10. D. Ben KnobleSep 22, 2026
  11. 0/4 stash: clean up index-mode test mergeD. Ben Knoble, Sep 23, 2026
  12. 1/4 builtin/stash: remove unused headerD. Ben Knoble, Sep 23, 2026
  13. 2/4 stash: prepare merge options earlierD. Ben Knoble, Sep 23, 2026
  14. 3/4 t: test failed "stash apply --index"D. Ben Knoble, Sep 23, 2026
  15. 4/4 builtin/stash: merge index in-coreD. Ben Knoble, Sep 23, 2026
  16. Phillip WoodSep 24, 2026
  17. Phillip WoodSep 24, 2026
  18. Junio C HamanoSep 24, 2026
  19. Junio C HamanoSep 25, 2026
  20. D. Ben KnobleSep 25, 2026
  21. D. Ben KnobleSep 25, 2026
  22. D. Ben KnobleSep 25, 2026
  23. Phillip WoodSep 25, 2026
  24. Phillip WoodSep 25, 2026
  25. Phillip WoodSep 25, 2026
  26. D. Ben KnobleSep 25, 2026
  27. D. Ben KnobleSep 25, 2026
  28. Junio C HamanoSep 25, 2026
  29. Junio C HamanoSep 25, 2026
  30. Phillip WoodSep 26, 2026
  31. Phillip WoodSep 26, 2026
  32. D. Ben KnobleSep 26, 2026
  33. D. Ben KnobleSep 26, 2026
  34. 0/5 stash: clean up index-mode test mergeD. Ben Knoble, Sep 26, 2026
  35. 1/5 builtin/stash: remove unused headerD. Ben Knoble, Sep 26, 2026
  36. 2/5 stash: prepare merge options earlierD. Ben Knoble, Sep 26, 2026
  37. 3/5 t3903: test stash --index mergesD. Ben Knoble, Sep 26, 2026
  38. 4/5 t3903: test failed "stash apply --index"D. Ben Knoble, Sep 26, 2026
  39. 5/5 builtin/stash: merge index in-coreD. Ben Knoble, Sep 26, 2026
  40. D. Ben KnobleSep 26, 2026
  41. Junio C HamanoSep 27, 2026
  42. Junio C HamanoSep 27, 2026
  43. Junio C HamanoSep 28, 2026
  44. Phillip WoodSep 28, 2026
  45. D. Ben KnobleSep 28, 2026
  46. D. Ben KnobleSep 28, 2026
  47. D. Ben KnobleSep 28, 2026
  48. D. Ben KnobleSep 28, 2026
  49. D. Ben KnobleSep 28, 2026
  50. Phillip WoodSep 28, 2026
  51. Thomas BachemSep 28, 2026
  52. Junio C HamanoSep 28, 2026
  53. D. Ben KnobleSep 28, 2026
  54. Phillip WoodSep 28, 2026
  55. Phillip WoodSep 28, 2026
  56. D. Ben KnobleSep 28, 2026
  57. Phillip WoodSep 29, 2026
  58. D. Ben KnobleSep 29, 2026
  59. 0/5 stash: clean up index-mode test mergeD. Ben Knoble, Sep 29, 2026
  60. 1/5 builtin/stash: remove unused headerD. Ben Knoble, Sep 29, 2026
  61. 2/5 stash: prepare merge options earlierD. Ben Knoble, Sep 29, 2026
  62. 3/5 t3903: test failed "stash apply --index"D. Ben Knoble, Sep 29, 2026
  63. 4/5 t5520: don't expire reflogs where it mattersD. Ben Knoble, Sep 29, 2026
  64. 5/5 builtin/stash: merge index in-coreD. Ben Knoble, Sep 29, 2026
  65. Phillip WoodSep 29, 2026
  66. Phillip WoodSep 29, 2026
  67. Phillip WoodSep 29, 2026
  68. Ben KnobleSep 29, 2026
  69. Junio C HamanoSep 29, 2026
  70. D. Ben KnobleSep 30, 2026
  71. 1/4 builtin/stash: remove unused headerD. Ben Knoble, Sep 30, 2026
  72. 0/4 stash: clean up index-mode test mergeD. Ben Knoble, Sep 30, 2026
  73. 3/4 t3903: test failed "stash apply --index"D. Ben Knoble, Sep 30, 2026
  74. 2/4 stash: prepare merge options earlierD. Ben Knoble, Sep 30, 2026
  75. 4/4 builtin/stash: merge index in-coreD. Ben Knoble, Sep 30, 2026
  76. D. Ben KnobleSep 30, 2026
  77. Phillip WoodOct 1, 2026
  78. Junio C HamanoOct 1, 2026

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.