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

[PATCH 2/2] [WIP] sequencer.c: carry forward notes on HEAD across "rebase -x"

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 12, 2021, 03:01 UTC
Message-ID
<20210312030107.1849942-3-gitster@pobox.com>
In-Reply-To
<20210312030107.1849942-1-gitster@pobox.com>

When the external command invoked by "rebase -x" replaces the HEAD, we seem to lose the notes attached to the original HEAD, which is why we have been losing the amlog mappings in the git core project.

Here is a half-successful attempt to fix it. For whatever reason, when the external command is "git commit --amend --no-edit", the updated code carries notes forward correctly, but when the command is changed to "git commit --amend -m tweak", it fails to do so, and I do not have more time to work on this, so I'd stop here with an expected failure in the test.

Help is appreciated.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 sequencer.c                   | 10 +++++++++-
 t/t3404-rebase-interactive.sh | 18 ++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/sequencer.c b/sequencer.c
index 92a4871997..e0bdc39e4d 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -3276,7 +3276,10 @@ static int do_exec(struct repository *r, const char *command_line)
 {
 	struct strvec child_env = STRVEC_INIT;
 	const char *child_argv[] = { NULL, NULL };
-	int dirty, status;
+	int dirty, status, bad_head;
+	struct object_id old_head_oid, new_head_oid;
+
+	bad_head = get_oid("HEAD", &old_head_oid);
 
 	fprintf(stderr, _("Executing: %s\n"), command_line);
 	child_argv[0] = command_line;
@@ -3286,6 +3289,11 @@ static int do_exec(struct repository *r, const char *command_line)
 	status = run_command_v_opt_cd_env(child_argv, RUN_USING_SHELL, NULL,
 					  child_env.v);
 
+	bad_head |= get_oid("HEAD", &new_head_oid);
+
+	if (!bad_head && !oideq(&old_head_oid, &new_head_oid))
+		commit_post_rewrite(r, &old_head_oid, &new_head_oid);
+
 	/* force re-reading of the cache */
 	if (discard_index(r->index) < 0 || repo_read_index(r) < 0)
 		return error(_("could not read index"));
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 66bcbbf952..3222c594ab 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -155,6 +155,8 @@ test_expect_success 'rebase -i with the exec command checks tree cleanness' '
 	git rebase --continue
 '
 
+# NEEDSWORK: Fix c762aada1ab3a2c428c with s/@/HEAD/;
+
 test_expect_success 'rebase -x with empty command fails' '
 	test_when_finished "git rebase --abort ||:" &&
 	test_must_fail env git rebase -x "" @ 2>actual &&
@@ -867,6 +869,22 @@ test_expect_success 'rebase -i can copy notes over a fixup' '
 	test_cmp expect output
 '
 
+test_expect_success 'notes are copied even rebase -x changes HEAD' '
+	git reset --hard n3 &&
+	git rebase -x "git commit --amend --no-edit" n1^1 &&
+	git log --format="%s <%N>" n1^1..n3 >expect &&
+	git log --format="%s <%N>" n1^1..HEAD >actual &&
+	test_cmp expect actual
+'
+
+test_expect_failure 'notes are copied even rebase -x changes HEAD' '
+	git reset --hard n3 &&
+	git rebase -x "git commit --amend -m tweak" n1^1 &&
+	git log --format="tweak <%N>" n1^1..n3 >expect &&
+	git log --format="%s <%N>" n1^1..HEAD >actual &&
+	test_cmp expect actual
+'
+
 test_expect_success 'rebase while detaching HEAD' '
 	git symbolic-ref HEAD &&
 	grandparent=$(git rev-parse HEAD~2) &&
-- 
2.31.0-rc2-175-g3820f1c72e
Previous: Junio C HamanoNext: Phillip Wood
Message 4 of 8 in “[BUG] cmd given to "rebase -x cmd" cannot see the original HEAD?”
  1. Junio C HamanoMar 11, 2021
  2. 0/2 "rebase -x cmd" loses notesJunio C Hamano, Mar 12, 2021
  3. 1/2 sequencer.c: make commit_post_rewrite() take two object namesJunio C Hamano, Mar 12, 2021
  4. 2/2 [WIP] sequencer.c: carry forward notes on HEAD across "rebase -x"Junio C Hamano, Mar 12, 2021
  5. Phillip WoodMar 12, 2021
  6. Ævar Arnfjörð BjarmasonMar 12, 2021
  7. Phillip WoodMar 12, 2021
  8. [WIP][PATCH] rebase: update the list of rewritten commits when amending pickPhillip Wood, Mar 12, 2021

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.