From: "D. Ben Knoble" <ben.knoble@gmail.com>
To: git@vger.kernel.org
Cc: "D. Ben Knoble" <ben.knoble@gmail.com>,
Eli Barzilay <eli@barzilay.org>,
Phillip Wood <phillip.wood@dunelm.org.uk>
Subject: [PATCH v2 0/4] stash: clean up index-mode test merge
Date: Wed, 23 Sep 2026 08:58:03 -0400 [thread overview]
Message-ID: <cover.1790168285.git.ben.knoble@gmail.com> (raw)
In-Reply-To: <cover.1789853192.git.ben.knoble@gmail.com>
Hi all,
This small patch series fixes a bug reported by Eli Barzilay in the
interaction between autostashing, staged index entries, and
stash.index=true.
The first patch is an incidental cleanup, and the second re-arranges one
line to make the change easier. The third adds a new test, while the
fourth holds the interesting bits.
Changes in v2:
• Do give branch labels for the incore merge, although they are never
seen (and clarify commit message as a result, also keeping the
merge-ort asserts). Phillip was right: without those, we do segfault
on conflicts.
• Use the ui merge options to keep the same diff algorithm.
• Use merge_finalize instead of clear_merge_options, and reuse the
options between merge calls if they are already initialized.
• Add a new 2/4 to simplify merge options initialization.
• Add a new 3/4 with a test case for conflicted index merges.
v1: <cover.1789853192.git.ben.knoble@gmail.com>
[1/4] builtin/stash: remove unused header
[2/4] stash: prepare merge options earlier
[3/4] t: test failed "stash apply --index"
[4/4] builtin/stash: merge index in-core
builtin/stash.c | 83 +++++++++++-------------------------------------
t/t3903-stash.sh | 18 +++++++++++
t/t7600-merge.sh | 9 ++++++
3 files changed, 45 insertions(+), 65 deletions(-)
Diff-intervalle contre v1 :
1: b6798c8a25 = 1: b6798c8a25 builtin/stash: remove unused header
-: ---------- > 2: 1e2343c7fc stash: prepare merge options earlier
-: ---------- > 3: 5bd4b78cac t: test failed "stash apply --index"
2: 782fe91251 ! 4: e49936ee12 builtin/stash: merge index in-core
@@ Commit message
Fortunately, we can achieve 2 goals at once: avoid round-tripping to the
file-system (and invoking expensive subprocesses) by performing the
- merge in-core. Since the results are never seen, we don't need to set
- the usual branch and ancestor labels.
+ merge in-core. If there are conflicts, we discard the resulting tree, so
+ we don't see the usual branch and ancestor labels, but the merge
+ subroutines insist on their presence, so use something simple.
We *could* swap just the git-reset(1) subprocess with our internal
reset_tree() and refresh_index(), which would fix the bug. We'd much
@@ Commit message
Reported-by: Eli Barzilay <eli@barzilay.org>
Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
-
- ## Notes (benknoble/commits) ##
- We *could* leave the asserts in, but then we somewhat uselessly set the
- conflict labels, which I did in the original patch [1]. Phillip
- suggested we don't need them, and I otherwise agree.
-
- [1]: https://lore.kernel.org/git/CALnO6CDfwscMWZktBu3FtXOQVbcBRo76nqK07kMnrzC5cPyZiQ@mail.gmail.com/
-
- In all the versions of 231e2dd49d (merge-ort: add some high-level
- algorithm structure, 2020-12-13) I could find on the mailing list, the
- "assert(opt->ancestor)" is present without explanation or comment, so
- I'm not in a good place to assess the impact of removing it and its
- compatriots.
-
- Cc: Elijah Newren <newren@gmail.com>
-
## builtin/stash.c ##
@@ builtin/stash.c: static int create_index_from_tree(const struct object_id *tree_id,
return ret;
@@ builtin/stash.c: static enum stash_apply_result do_apply_stash(const char *prefi
- return error(_("could not generate diff %s^!."),
- oid_to_hex(&info->w_commit));
- }
-+ init_basic_merge_options(&o, the_repository);
++ o.branch1 = "Upstream index";
++ o.branch2 = "Stashed index changes";
++ o.ancestor = "Stash base";
- ret = apply_cached(&out);
- strbuf_release(&out);
@@ builtin/stash.c: static enum stash_apply_result do_apply_stash(const char *prefi
- discard_index(the_repository->index);
- repo_read_index(the_repository);
+ oidcpy(&index_tree, &result.tree->object.oid);
-+ clear_merge_options(&o);
++ merge_finalize(&o, &result);
}
}
- ## merge-ort.c ##
-@@ merge-ort.c: static void merge_start(struct merge_options *opt, struct merge_result *result)
- trace2_region_enter("merge", "sanity checks", opt->repo);
- assert(opt->repo);
-
-- assert(opt->branch1 && opt->branch2);
--
- assert(opt->detect_directory_renames >= MERGE_DIRECTORY_RENAMES_NONE &&
- opt->detect_directory_renames <= MERGE_DIRECTORY_RENAMES_TRUE);
- assert(opt->rename_limit >= -1);
-@@ merge-ort.c: void merge_incore_nonrecursive(struct merge_options *opt,
- trace2_region_enter("merge", "incore_nonrecursive", opt->repo);
-
- trace2_region_enter("merge", "merge_start", opt->repo);
-- assert(opt->ancestor != NULL);
- merge_check_renames_reusable(opt, result, merge_base, side1, side2);
- merge_start(opt, result);
- /*
-
## t/t7600-merge.sh ##
@@ t/t7600-merge.sh: verify_no_mergehead () {
test_cmp result.1-5 file
base-commit: 339ab2a8f14c0c304ae2f28df1a859f3d2cf610c
--
2.56.0.rc1.315.gc6ed9934b7.dirty
next prev parent reply other threads:[~2026-09-23 12: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 ` D. Ben Knoble [this message]
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
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=cover.1790168285.git.ben.knoble@gmail.com \
--to=ben.knoble@gmail.com \
--cc=eli@barzilay.org \
--cc=git@vger.kernel.org \
--cc=phillip.wood@dunelm.org.uk \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.