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

[PATCH 1/2] replay: die descriptively when invalid commit-ish

From
Kkristofferhaugsbakk@fastmail.com <kristofferhaugsbakk@fastmail.com>
Date
Dec 22, 2025, 22:04 UTC
Message-ID
<replay_die_descr.140@msgid.xyz>
In-Reply-To
<CV_replay_die_descr.13f@msgid.xyz>
From: Kristoffer Haugsbakk <code@khaugsbakk.name>

Giving an invalid commit-ish to `--onto` or `--advance` makes git-replay(1) fail with:

    fatal: Replaying down to root commit is not supported yet!
Going backwards from this point:
1. `onto` is `NULL` from `determine_replay_mode`;
2. that function in turn calls `peel_committish`; and
3. here we return `NULL` if `repo_get_oid` fails.
Let’s die immediately with a descriptive error message instead.

Doing this also provides us with a descriptive error if we “forget” to provide an argument to `--onto` (but we really do unintentionally):[1]

    $ git replay --onto ^main topic1
    fatal: '^main' is not a valid commit-ish
† 1: The argument to `--onto` is mandatory and the option parser accepts
     both `--onto=<name>` (stuck form) and `--onto name`. The latter
     form makes it easy to unintentionally pass something to the option
     when you really meant to pass a positional argument.
Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
---
 builtin/replay.c         |  2 +-
 t/t3650-replay-basics.sh | 16 ++++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/builtin/replay.c b/builtin/replay.c
index 6172c8aacc9..175b64c5335 100644
--- a/builtin/replay.c
+++ b/builtin/replay.c
@@ -33,7 +33,7 @@ static struct commit *peel_committish(struct repository *repo, const char *name)
 	struct object_id oid;
 
 	if (repo_get_oid(repo, name, &oid))
-		return NULL;
+		die(_("'%s' is not a valid commit-ish"), name);
 	obj = parse_object(repo, &oid);
 	return (struct commit *)repo_peel_to_type(repo, name, 0, obj,
 						  OBJ_COMMIT);
diff --git a/t/t3650-replay-basics.sh b/t/t3650-replay-basics.sh
index 58b37599357..bfe8e01da49 100755
--- a/t/t3650-replay-basics.sh
+++ b/t/t3650-replay-basics.sh
@@ -51,6 +51,22 @@ test_expect_success 'setup bare' '
 	git clone --bare . bare
 '
 
+test_expect_success '--onto with invalid commit-ish' '
+	cat >expect <<-EOF &&
+	fatal: ${SQ}refs/not-valid${SQ} is not a valid commit-ish
+	EOF
+	test_must_fail git replay --onto=refs/not-valid topic1..topic2 2>actual &&
+	test_cmp expect actual
+'
+
+test_expect_success '--advance with invalid commit-ish' '
+	cat >expect <<-EOF &&
+	fatal: ${SQ}refs/not-valid${SQ} is not a valid commit-ish
+	EOF
+	test_must_fail git replay --advance=refs/not-valid topic1..topic2 2>actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'using replay to rebase two branches, one on top of other' '
 	git replay --onto main topic1..topic2 >result &&
 
-- 
2.52.0.10.g08704017180
Previous: kristofferhaugsbakk@fastmail.comNext: Junio C Hamano
Message 2 of 35 in “replay: die descriptively when invalid commit-ish”
  1. 0/2 replay: die descriptively when invalid commit-ishkristofferhaugsbakk@fastmail.com, Dec 22, 2025
  2. 1/2 replay: die descriptively when invalid commit-ishkristofferhaugsbakk@fastmail.com, Dec 22, 2025
  3. Junio C HamanoDec 23, 2025
  4. Phillip WoodDec 23, 2025
  5. Junio C HamanoDec 23, 2025
  6. Kristoffer HaugsbakkDec 30, 2025
  7. 2/2 t3650: add more regression tests for failure conditionskristofferhaugsbakk@fastmail.com, Dec 22, 2025
  8. Phillip WoodDec 23, 2025
  9. Kristoffer HaugsbakkDec 30, 2025
  10. Junio C HamanoDec 23, 2025
  11. Kristoffer HaugsbakkDec 30, 2025
  12. Elijah NewrenDec 24, 2025
  13. Kristoffer HaugsbakkDec 30, 2025
  14. 0/5 replay: die descriptively when invalid commit-ishkristofferhaugsbakk@fastmail.com, Dec 30, 2025
  15. 1/5 replay: remove dead code and rearrangekristofferhaugsbakk@fastmail.com, Dec 30, 2025
  16. Elijah NewrenDec 30, 2025
  17. Junio C HamanoDec 30, 2025
  18. Kristoffer HaugsbakkJan 2, 2026
  19. 2/5 replay: find *onto only after testing for ref namekristofferhaugsbakk@fastmail.com, Dec 30, 2025
  20. Elijah NewrenDec 30, 2025
  21. 3/5 replay: die descriptively when invalid commit-ish is givenkristofferhaugsbakk@fastmail.com, Dec 30, 2025
  22. Elijah NewrenDec 30, 2025
  23. Kristoffer HaugsbakkJan 2, 2026
  24. 4/5 replay: die if we cannot parse objectkristofferhaugsbakk@fastmail.com, Dec 30, 2025
  25. 5/5 t3650: add more regression tests for failure conditionskristofferhaugsbakk@fastmail.com, Dec 30, 2025
  26. Elijah NewrenDec 30, 2025
  27. 0/6 replay: die descriptively when invalid commit-ishkristofferhaugsbakk@fastmail.com, Jan 5, 2026
  28. 1/6 replay: remove dead code and rearrangekristofferhaugsbakk@fastmail.com, Jan 5, 2026
  29. 2/6 replay: find *onto only after testing for ref namekristofferhaugsbakk@fastmail.com, Jan 5, 2026
  30. 3/6 replay: die descriptively when invalid commit-ish is givenkristofferhaugsbakk@fastmail.com, Jan 5, 2026
  31. 4/6 replay: improve code comment and die messagekristofferhaugsbakk@fastmail.com, Jan 5, 2026
  32. 5/6 replay: die if we cannot parse objectkristofferhaugsbakk@fastmail.com, Jan 5, 2026
  33. 6/6 t3650: add more regression tests for failure conditionskristofferhaugsbakk@fastmail.com, Jan 5, 2026
  34. Elijah NewrenJan 6, 2026
  35. Junio C HamanoJan 7, 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.