aboutsummaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2026-02-16 07:45:45 +0100
committerJunio C Hamano <gitster@pobox.com>2026-02-17 08:37:51 -0800
commit0f2a0c507701f5b166de62ddfe23d48ed2d884e1 (patch)
tree91bb67a6433d619dac1e20009c100459ebd18f5d /builtin
parent76a3f28243ebb0be492f30210f2426a9f511f920 (diff)
downloadgit-0f2a0c507701f5b166de62ddfe23d48ed2d884e1.tar.xz
builtin/history: check for merges before asking for user input
The replay infrastructure is not yet capable of replaying merge commits. Unfortunately, we only notice that we're about to replay merges after we have already asked the user for input, so any commit message that the user may have written will be discarded in that case. Fix this by checking whether the revwalk contains merge commits before we ask for user input. Adapt one of the tests that is expected to fail because of this check to use false(1) as editor. If the editor had been executed by Git, it would fail with the error message "Aborting commit as launching the editor failed." Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r--builtin/history.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/builtin/history.c b/builtin/history.c
index 1de51372ea..ff90e93d6e 100644
--- a/builtin/history.c
+++ b/builtin/history.c
@@ -177,6 +177,41 @@ static int parse_ref_action(const struct option *opt, const char *value, int uns
return 0;
}
+static int revwalk_contains_merges(struct repository *repo,
+ const struct strvec *revwalk_args)
+{
+ struct strvec args = STRVEC_INIT;
+ struct rev_info revs;
+ int ret;
+
+ strvec_pushv(&args, revwalk_args->v);
+ strvec_push(&args, "--min-parents=2");
+
+ repo_init_revisions(repo, &revs, NULL);
+
+ setup_revisions_from_strvec(&args, &revs, NULL);
+ if (args.nr != 1)
+ BUG("revisions were set up with invalid argument");
+
+ if (prepare_revision_walk(&revs) < 0) {
+ ret = error(_("error preparing revisions"));
+ goto out;
+ }
+
+ if (get_revision(&revs)) {
+ ret = error(_("replaying merge commits is not supported yet!"));
+ goto out;
+ }
+
+ reset_revision_walk();
+ ret = 0;
+
+out:
+ release_revisions(&revs);
+ strvec_clear(&args);
+ return ret;
+}
+
static int setup_revwalk(struct repository *repo,
enum ref_action action,
struct commit *original,
@@ -236,6 +271,10 @@ static int setup_revwalk(struct repository *repo,
strvec_push(&args, "HEAD");
}
+ ret = revwalk_contains_merges(repo, &args);
+ if (ret < 0)
+ goto out;
+
setup_revisions_from_strvec(&args, revs, NULL);
if (args.nr != 1)
BUG("revisions were set up with invalid argument");