From: Junio C Hamano <gitster@pobox.com>
To: "D. Ben Knoble" <ben.knoble@gmail.com>
Cc: git@vger.kernel.org, "Eli Barzilay" <eli@barzilay.org>,
"Phillip Wood" <phillip.wood@dunelm.org.uk>,
"Elijah Newren" <newren@gmail.com>,
"Patrick Steinhardt" <ps@pks.im>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Victoria Dye" <vdye@github.com>, "Adam Johnson" <me@adamj.eu>,
"Jeff King" <peff@peff.net>
Subject: Re: [PATCH v3 5/5] builtin/stash: merge index in-core
Date: Sun, 27 Sep 2026 11:59:41 -0700 [thread overview]
Message-ID: <xmqqo6dir04i.fsf@gitster.g> (raw)
In-Reply-To: <fde7fb7988b695707c6f2776adc18eec7fe4696a.1790425008.git.ben.knoble@gmail.com> (D. Ben Knoble's message of "Sat, 26 Sep 2026 08:16:48 -0400")
"D. Ben Knoble" <ben.knoble@gmail.com> writes:
> @@ -671,29 +627,27 @@ static enum stash_apply_result do_apply_stash(const char *prefix,
> oideq(&c_tree, &info->i_tree)) {
> has_index = 0;
> } else {
> - struct strbuf out = STRBUF_INIT;
> + struct merge_result result = { 0 };
>
> - if (diff_tree_binary(&out, &info->w_commit)) {
> - strbuf_release(&out);
> - return error(_("could not generate diff %s^!."),
> - oid_to_hex(&info->w_commit));
> - }
> + o.branch1 = "Current index";
> + o.branch2 = "Stashed index changes";
> + o.ancestor = "Stash base";
>
> - ret = apply_cached(&out);
> - strbuf_release(&out);
> - if (ret)
> + o.verbosity = 0;
We realize that 'o' is a struct merge_options defined on the stack
for this function, initialized with init_ui_merge_options() fairly
early on. It would have initialized '.verbosity' to the default
verbosity, the merge.verbosity configuration variable, or the
GIT_MERGE_VERBOSITY environment variable.
You drop the verbosity here, presumably because you want to match
the previous implementation 'diff-tree | apply --cached' (which I
guess was fairly quiet, but I do not use 'stash pop --index'
myself).
> + head = lookup_tree(o.repo, &c_tree);
> + merge = lookup_tree(o.repo, &info->i_tree);
> + merge_base = lookup_tree(o.repo, &info->b_tree);
> +
> + merge_incore_nonrecursive(&o, merge_base, head, merge,
> + &result);
> +
> + oidcpy(&index_tree, &result.tree->object.oid);
> + merge_finalize(&o, &result);
And then the (index) merge is quiet, which is nice.
> +
> + if (!result.clean)
> return error(_("conflicts in index. "
> "Try without --index."));
> -
> - discard_index(the_repository->index);
> - repo_read_index(the_repository);
> - if (write_index_as_tree(&index_tree, the_repository->index,
> - repo_get_index_file(the_repository), 0, NULL))
> - return error(_("could not save index tree"));
> -
> - reset_head();
> - discard_index(the_repository->index);
> - repo_read_index(the_repository);
> }
> }
But the thing is, this is not the end of the function, or the last
call to the merge machinery using 'o'. We then use the same 'o' to
drive another three-way merge. Yet nobody restores '.verbosity'
that was unconditionally turned off above for that second merge.
It is a bit surprising that the existing test suite did not catch
this. Perhaps we do not test --quiet and the merge.verbosity
configuration in combination?
Anyway, I think you'd need something like the following (caveat
emptor: written against checked out 'seen' while reading the patch,
and not even compile tested).
Thanks.
builtin/stash.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git c/builtin/stash.c w/builtin/stash.c
index 0f10b9c703..a165419d77 100644
--- c/builtin/stash.c
+++ w/builtin/stash.c
@@ -622,6 +622,9 @@ static enum stash_apply_result do_apply_stash(const char *prefix,
init_ui_merge_options(&o, the_repository);
+ if (quiet)
+ o.verbosity = 0;
+
if (index) {
if (oideq(&info->b_tree, &info->i_tree) ||
oideq(&c_tree, &info->i_tree)) {
@@ -633,8 +636,6 @@ static enum stash_apply_result do_apply_stash(const char *prefix,
o.branch2 = "Stashed index changes";
o.ancestor = "Stash base";
- o.verbosity = 0;
-
head = lookup_tree(o.repo, &c_tree);
merge = lookup_tree(o.repo, &info->i_tree);
merge_base = lookup_tree(o.repo, &info->b_tree);
@@ -658,9 +659,6 @@ static enum stash_apply_result do_apply_stash(const char *prefix,
if (oideq(&info->b_tree, &c_tree))
o.branch1 = "Version stash was based on";
- if (quiet)
- o.verbosity = 0;
-
if (o.verbosity >= 3)
printf_ln(_("Merging %s with %s"), o.branch1, o.branch2);
next prev parent reply other threads:[~2026-09-27 18:59 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-19 21:26 [PATCH 0/2] Hi all, D. Ben Knoble
2026-09-19 21:26 ` [PATCH 1/2] builtin/stash: remove unused header D. Ben Knoble
2026-09-21 15:10 ` Junio C Hamano
2026-09-19 21:26 ` [PATCH 2/2] builtin/stash: merge index in-core D. Ben Knoble
2026-09-21 13:17 ` Phillip Wood
2026-09-22 12:43 ` D. Ben Knoble
2026-09-22 12:51 ` D. Ben Knoble
2026-09-22 13:57 ` Phillip Wood
2026-09-22 20:34 ` D. Ben Knoble
2026-09-19 21:32 ` [PATCH 0/2] Hi all, D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 0/4] stash: clean up index-mode test merge D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 1/4] builtin/stash: remove unused header D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 2/4] stash: prepare merge options earlier D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 3/4] t: test failed "stash apply --index" D. Ben Knoble
2026-09-24 9:42 ` Phillip Wood
2026-09-25 13:36 ` D. Ben Knoble
2026-09-25 15:45 ` Phillip Wood
2026-09-26 9:53 ` Phillip Wood
2026-09-26 12:07 ` D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 4/4] builtin/stash: merge index in-core D. Ben Knoble
2026-09-24 9:42 ` Phillip Wood
2026-09-25 12:55 ` D. Ben Knoble
2026-09-25 15:58 ` Phillip Wood
2026-09-25 16:16 ` D. Ben Knoble
2026-09-24 21:59 ` Junio C Hamano
2026-09-25 4:12 ` Junio C Hamano
2026-09-25 13:00 ` D. Ben Knoble
2026-09-25 16:24 ` Junio C Hamano
2026-09-26 9:51 ` Phillip Wood
2026-09-26 12:04 ` D. Ben Knoble
2026-09-25 16:04 ` Phillip Wood
2026-09-25 16:17 ` D. Ben Knoble
2026-09-25 16:49 ` Junio C Hamano
2026-09-26 12:16 ` [PATCH v3 0/5] stash: clean up index-mode test merge D. Ben Knoble
2026-09-26 12:16 ` [PATCH v3 1/5] builtin/stash: remove unused header D. Ben Knoble
2026-09-26 12:16 ` [PATCH v3 2/5] stash: prepare merge options earlier D. Ben Knoble
2026-09-26 12:16 ` [PATCH v3 3/5] t3903: test stash --index merges D. Ben Knoble
2026-09-28 15:44 ` Phillip Wood
2026-09-28 15:55 ` D. Ben Knoble
2026-09-29 9:41 ` Phillip Wood
2026-09-26 12:16 ` [PATCH v3 4/5] t3903: test failed "stash apply --index" D. Ben Knoble
2026-09-26 12:16 ` [PATCH v3 5/5] builtin/stash: merge index in-core D. Ben Knoble
2026-09-27 18:59 ` Junio C Hamano [this message]
2026-09-28 12:02 ` D. Ben Knoble
2026-09-28 9:40 ` Junio C Hamano
2026-09-28 12:03 ` D. Ben Knoble
2026-09-28 15:32 ` Junio C Hamano
2026-09-26 12:20 ` [PATCH v3 0/5] stash: clean up index-mode test merge D. Ben Knoble
2026-09-27 19:21 ` Junio C Hamano
2026-09-28 9:50 ` Phillip Wood
2026-09-28 12:05 ` D. Ben Knoble
2026-09-28 12:33 ` D. Ben Knoble
2026-09-28 13:00 ` D. Ben Knoble
2026-09-28 13:45 ` Phillip Wood
2026-09-28 14:50 ` Thomas Bachem
2026-09-28 15:36 ` D. Ben Knoble
2026-09-29 11:38 ` D. Ben Knoble
2026-09-29 15:54 ` Phillip Wood
2026-09-28 15:40 ` Phillip Wood
2026-09-29 12:18 ` [PATCH v4 " D. Ben Knoble
2026-09-29 12:18 ` [PATCH v4 1/5] builtin/stash: remove unused header D. Ben Knoble
2026-09-29 12:18 ` [PATCH v4 2/5] stash: prepare merge options earlier D. Ben Knoble
2026-09-29 12:18 ` [PATCH v4 3/5] t3903: test failed "stash apply --index" D. Ben Knoble
2026-09-29 12:18 ` [PATCH v4 4/5] t5520: don't expire reflogs where it matters D. Ben Knoble
2026-09-29 15:46 ` Phillip Wood
2026-09-29 12:18 ` [PATCH v4 5/5] builtin/stash: merge index in-core D. Ben Knoble
2026-09-29 20:07 ` Junio C Hamano
2026-09-30 1:29 ` D. Ben Knoble
2026-09-29 15:48 ` [PATCH v4 0/5] stash: clean up index-mode test merge Phillip Wood
2026-09-29 17:31 ` Ben Knoble
2026-09-30 21:26 ` D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 0/4] " D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 1/4] builtin/stash: remove unused header D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 2/4] stash: prepare merge options earlier D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 3/4] t3903: test failed "stash apply --index" D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 4/4] builtin/stash: merge index in-core D. Ben Knoble
2026-10-01 15:52 ` [PATCH v5 0/4] stash: clean up index-mode test merge Phillip Wood
2026-10-01 17:47 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqo6dir04i.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=avarab@gmail.com \
--cc=ben.knoble@gmail.com \
--cc=eli@barzilay.org \
--cc=git@vger.kernel.org \
--cc=me@adamj.eu \
--cc=newren@gmail.com \
--cc=peff@peff.net \
--cc=phillip.wood@dunelm.org.uk \
--cc=ps@pks.im \
--cc=vdye@github.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox