git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Patrick Steinhardt <ps@pks.im>
To: phillip.wood@dunelm.org.uk
Cc: git@vger.kernel.org, "D. Ben Knoble" <ben.knoble@gmail.com>,
	"Junio C Hamano" <gitster@pobox.com>,
	"Sergey Organov" <sorganov@gmail.com>,
	"Jean-Noël AVILA" <jn.avila@free.fr>,
	"Martin von Zweigbergk" <martinvonz@gmail.com>,
	"Kristoffer Haugsbakk" <kristofferhaugsbakk@fastmail.com>,
	"Elijah Newren" <newren@gmail.com>,
	"Karthik Nayak" <karthik.188@gmail.com>
Subject: Re: [PATCH v6 05/11] builtin/history: implement "reword" subcommand
Date: Tue, 2 Dec 2025 19:50:38 +0100	[thread overview]
Message-ID: <aS80_rTVHP44JKhx@pks.im> (raw)
In-Reply-To: <b36a644e-2d8d-41cf-b59b-e72ce0ca855c@gmail.com>

On Mon, Nov 17, 2025 at 04:27:59PM +0000, Phillip Wood wrote:
> Hi Patrick
> On 27/10/2025 11:33, Patrick Steinhardt wrote:
> 
> > +static int collect_commits(struct repository *repo,
> > +			   struct commit *old_commit,
> > +			   struct commit *new_commit,
> > +			   struct strvec *out)
> 
> Now that we're not using the sequencer it would be nice to stop messing
> about converting object ids to and from strings and return an array of
> "struct commit" instead of "struct strvec"

I was trying to avoid using a strvec, but honestly that turned out to be
more pain than it is worth. We don't have functions like
`strvec_splice()` for simple arrays, and there is no commit array struct
that provides similar wrappers, either.

>  > +{
> > +	struct setup_revision_opt revision_opts = {
> > +		.assume_dashdash = 1,
> > +	};
> > +	struct strvec revisions = STRVEC_INIT;
> > +	struct commit *child;
> > +	struct rev_info rev = { 0 };
> > +	int ret;
> > +
> > +	repo_init_revisions(repo, &rev, NULL);
> > +	strvec_push(&revisions, "");
> > +	strvec_push(&revisions, oid_to_hex(&new_commit->object.oid));
> > +	if (old_commit)
> > +		strvec_pushf(&revisions, "^%s", oid_to_hex(&old_commit->object.oid));
> > +
> > +	setup_revisions_from_strvec(&revisions, &rev, &revision_opts);
> > +	if (revisions.nr != 1 || prepare_revision_walk(&rev)) {
> 
> I'm not that familiar with the revision walking api, what 'revisions.nr !=
> 1' check for here?

It's basically a check that the revision arguments have all been
consumed, except for the initial empty argument. The interface is a bit
weird.

[snip]
> > +		if (!onto) {
> > +			onto = commit;
> > +		} else {
> > +			struct tree *tree = repo_get_commit_tree(repo, commit);
> > +			onto = replay_create_commit(repo, tree, commit, onto);
> > +			if (!onto)
> > +				break;
> 
> Don't we want to avoid updating HEAD if replay_create_commit() fails?

Good point, yes.

> > +		}
> > +	}
> > +
> > +	reset_opts.oid = &onto->object.oid;
> > +	strbuf_addf(&buf, "%s: switch to rewritten %s", action, oid_to_hex(reset_opts.oid));
> 
> We're not switching branches so I wonder if saying "history: <action> <oid>
> <commit subject>" might be a more useful reflog entry

We're not switching branches, true, but we do switch to the rewritten
commit. Also I'm not sure that printing the commit subject here would
make sense, as the question becomes which subject to print: the one
we're moving to, which is the new tip of the branch but may not be the
commit we have rewritten? Or do we print the subject of the rewritten
commit?

> > +static int fill_commit_message(struct repository *repo,
> > +			       const struct object_id *old_tree,
> > +			       const struct object_id *new_tree,
> > +			       const char *default_message,
> > +			       const char *action,
> > +			       struct strbuf *out)
> > +{
> > +	const char *path = git_path_commit_editmsg();
> > +	const char *hint =
> > +		_("Please enter the commit message for the %s changes."
> 
> Maybe "Please edit the commit message"? Also do we want to tell the user
> they can abort by clearing the commit message?

The "Please edit the commit message" thing is taken from other commands
that phrase it similarly. But it certainly does make sense to note that
clearing the commit message aborts, will add.

> > +		  " Lines starting\nwith '%s' will be ignored.\n");
> > +	struct wt_status s;
> > +
> > +	strbuf_addstr(out, default_message);
> > +	strbuf_addch(out, '\n');
> > +	strbuf_commented_addf(out, comment_line_str, hint, action, comment_line_str);
> > +	write_file_buf(path, out->buf, out->len);
> > +
> > +	wt_status_prepare(repo, &s);
> > +	FREE_AND_NULL(s.branch);
> > +	s.ahead_behind_flags = AHEAD_BEHIND_QUICK;
> > +	s.commit_template = 1;
> > +	s.colopts = 0;
> > +	s.display_comment_prefix = 1;
> > +	s.hints = 0;
> > +	s.use_color = 0;
> > +	s.whence = FROM_COMMIT;
> > +	s.committable = 1;
> 
> "git commit" reads a load of status related config settings, is any of that
> relevant here?

Yeah, some of it is. We don't handle them all yet, but this will be
backfilled in the future.

> > +	s.fp = fopen(git_path_commit_editmsg(), "a");
> > +	if (!s.fp)
> > +		return error_errno(_("could not open '%s'"), git_path_commit_editmsg());
> > +
> > +	wt_status_collect_changes_trees(&s, old_tree, new_tree);
> > +	wt_status_print(&s);
> > +	wt_status_collect_free_buffers(&s);
> > +	string_list_clear_func(&s.change, change_data_free);
> > +
> > +	strbuf_reset(out);
> > +	if (launch_editor(path, out, NULL)) {
> > +		fprintf(stderr, _("Please supply the message using the -m option.\n"));
> 
> I'm not sure that's a very helpful suggestion as we don't support "-m" (it's
> not very helpful when "git commit --amend" suggests it either). We should
> just give up if the editor fails.

Ah, this is a leftover error message from previous iterations.

> > +static int cmd_history_reword(int argc,
> > +			      const char **argv,
> > +			      const char *prefix,
> > +			      struct repository *repo)
> > +{
> > +	const char * const usage[] = {
> > +		GIT_HISTORY_REWORD_USAGE,
> > +		NULL,
> > +	};
> > +	struct option options[] = {
> > +		OPT_END(),
> > +	};
> > +	struct strbuf final_message = STRBUF_INIT;
> > +	struct commit *original_commit, *parent, *head;
> > +	struct strvec commits = STRVEC_INIT;
> > +	struct object_id parent_tree_oid, original_commit_tree_oid;
> > +	struct object_id rewritten_commit;
> > +	struct commit_list *from_list = NULL;
> > +	const char *original_message, *original_body, *ptr;
> > +	char *original_author = NULL;
> > +	size_t len;
> > +	int ret;
> > +
> > +	argc = parse_options(argc, argv, prefix, options, usage, 0);
> > +	if (argc != 1) {
> > +		ret = error(_("command expects a single revision"));
> > +		goto out;
> > +	}
> > +	repo_config(repo, git_default_config, NULL);
> > +
> > +	original_commit = lookup_commit_reference_by_name(argv[0]);
> > +	if (!original_commit) {
> > +		ret = error(_("commit to be reworded cannot be found: %s"), argv[0]);
> > +		goto out;
> > +	}
> > +	original_commit_tree_oid = repo_get_commit_tree(repo, original_commit)->object.oid;
> 
> Looking at the implementation of repo_get_commit_tree() it can return NULL

> > diff --git a/t/t3450-history.sh b/t/t3450-history.sh
> > index 417c343d43b..f513463b92b 100755
> > --- a/t/t3450-history.sh
> > +++ b/t/t3450-history.sh
> > @@ -5,13 +5,13 @@ test_description='tests for git-history command'
> >   . ./test-lib.sh
> >   test_expect_success 'does nothing without any arguments' '
> > -	git history >out 2>&1 &&
> > -	test_must_be_empty out
> > +	test_must_fail git history 2>err &&
> > +	test_grep "need a subcommand" err
> >   '
> >   test_expect_success 'raises an error with unknown argument' '
> >   	test_must_fail git history garbage 2>err &&
> > -	test_grep "unrecognized argument: garbage" err
> > +	test_grep "unknown subcommand: .garbage." err
> >   '
> >   test_done
> 
> Do we really need a separate test file just for a couple of tests. I can see
> that having a separate test file for each subcommand makes sense but can't
> we just add these two tests to one of those?

I felt it was dirty to randomly add it to any of the other test suites,
so I decided to instead have it in its own standalone file. It may also
become relevant in the future if we ever needed commands like for
example `git history --continue`, same as the sequencer-based commands
have.

> > diff --git a/t/t3451-history-reword.sh b/t/t3451-history-reword.sh
> > new file mode 100755
> > index 00000000000..09dbc463c59
> > --- /dev/null
> > +++ b/t/t3451-history-reword.sh
> > @@ -0,0 +1,237 @@
> > +#!/bin/sh
> > +
> > +test_description='tests for git-history reword subcommand'
> > +
> > +. ./test-lib.sh
> > +
> > +reword_with_message () {
> > +	cat >message &&
> > +	write_script fake-editor.sh <<-EOF &&
> > +	cp "$(pwd)/message" "\$1"
> 
> Let's hope $(pwd) doesn't contain any dollar signs, backticks, backslashes
> or double quotes. Doing
> 
> 	export MSG_PATH="$(pwd)/message"
> 	write_script fake-editor.sh <<-\EOF &&
> 	cp "$MSG_PATH" "$1"
> 	EOF
> 
> would be safer

True. Will use this:

diff --git a/t/t3451-history-reword.sh b/t/t3451-history-reword.sh
index 8b353e74dc..4c87953176 100755
--- a/t/t3451-history-reword.sh
+++ b/t/t3451-history-reword.sh
@@ -6,11 +6,11 @@ test_description='tests for git-history reword subcommand'
 
 reword_with_message () {
 	cat >message &&
-	write_script fake-editor.sh <<-EOF &&
-	cp "$(pwd)/message" "\$1"
+	write_script fake-editor.sh <<-\EOF &&
+	cp "$ORIG_PATH/message" "$1"
 	EOF
 	test_set_editor "$(pwd)"/fake-editor.sh &&
-	git history reword "$@" &&
+	ORIG_PATH="$(pwd)" git history reword "$@" &&
 	rm fake-editor.sh message
 }
 

> > +test_expect_success 'refuses to work with merge commits' '
> > +	test_when_finished "rm -rf repo" &&
> > +	git init repo &&
> > +	(
> 
> Do we really need to set up a separate repo for each test? The test suite is
> slow enough already without running "git init" followed by a bunch calls to
> test_commit() in each test. Can we instead run "git reset --hard
> <known-starting-point> at the beginning of each test? That removes any
> interdependence between tests but saves a bunch of processes.

I prefer that style as it is extremely hard to reason about tests that
have interdependencies, and not all the state may be removed by a hard
reset.

> > +	test_when_finished "rm -rf repo" &&
> > +	git init repo &&
> > +	(
> > +		cd repo &&
> > +		test_commit first &&
> > +
> > +		write_script fake-editor.sh <<-\EOF &&
> > +		cp "$1" . &&
> > +		printf "\namend a comment\n" >>"$1"
> > +		EOF
> > +		test_set_editor "$(pwd)"/fake-editor.sh &&
> > +		git history reword HEAD &&
> > +
> > +		cat >expect <<-EOF &&
> > +		first
> > +
> > +		# Please enter the commit message for the reworded changes. Lines starting
> > +		# with ${SQ}#${SQ} will be ignored.
> > +		# Changes to be committed:
> > +		#	new file:   first.t
> > +		#
> > +		EOF
> > +		test_cmp expect COMMIT_EDITMSG &&
> > +
> > +		cat >expect <<-EOF &&
> > +		first
> > +
> > +		amend a comment
> > +
> > +		EOF
> > +		git log --format=%B >actual &&
> > +		test_cmp expect actual
> 
> We have test_commit_message() to do this which will accept the expected
> message on stdin.

Ah, indeed.

> > +	)
> > +'
> > +
> > +# For now, git-history(1) does not yet execute any hooks. This is subject to
> > +# change in the future, and if it does this test here is expected to start
> > +# failing. In other words, this test is not an endorsement of the current
> > +# status quo.
> > +test_expect_success 'hooks are not executed for rewritten commits' '
> > +	test_when_finished "rm -rf repo" &&
> > +	git init repo &&
> > +	(
> > +		cd repo &&
> > +		test_commit first &&
> > +		test_commit second &&
> > +		test_commit third &&
> > +
> > +		write_script .git/hooks/prepare-commit-msg <<-EOF &&
> > +		touch "$(pwd)/hooks.log
> 
> This has the same problem of expanding $(pwd) as fake-editor.sh. For
> debugging it would be nicer if the hook scripts did
> 
> 	echo "$hook_name" >>hooks.log
> 
> so we can easily see which hooks are causing the test to fail.

I'll rephrain from doing this as it would require `<<-EOF` instead of
`<<-\EOF`.

> > +		EOF
> > +		write_script .git/hooks/post-commit <<-EOF &&
> > +		touch "$(pwd)/hooks.log
> > +		EOF
> > +		write_script .git/hooks/post-rewrite <<-EOF &&
> > +		touch "$(pwd)/hooks.log
> > +		EOF
> 
> This is good idea. We should add tests for the "pre-commit" and "commit-msg"
> hooks as well.
> 
> Overall the test coverage looks good, the only thing we might want to add is
> a check for the reflog message. Thanks for working on this, I'll try and
> look at the rest of the patches sometime this week.

Thanks!

Patrick

  reply	other threads:[~2025-12-02 18:50 UTC|newest]

Thread overview: 278+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-19 10:55 [PATCH RFC 00/11] Introduce git-history(1) command for easy history editing Patrick Steinhardt
2025-08-19 10:55 ` [PATCH RFC 01/11] sequencer: optionally skip printing commit summary Patrick Steinhardt
2025-08-19 10:55 ` [PATCH RFC 02/11] sequencer: add option to rewind HEAD after picking commits Patrick Steinhardt
2025-08-19 10:55 ` [PATCH RFC 03/11] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 04/11] builtin: add new "history" command Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 05/11] builtin/history: implement "drop" subcommand Patrick Steinhardt
2025-08-20 20:39   ` Ben Knoble
2025-08-22 12:21     ` Patrick Steinhardt
2025-08-23 16:15   ` Jean-Noël AVILA
2025-08-24 16:02     ` Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 06/11] builtin/history: implement "reorder" subcommand Patrick Steinhardt
2025-08-23 16:24   ` Jean-Noël AVILA
2025-08-24 17:25   ` Kristoffer Haugsbakk
2025-08-24 17:34     ` Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 07/11] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 08/11] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 09/11] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 10/11] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-08-20 21:15   ` D. Ben Knoble
2025-08-22 12:21     ` Patrick Steinhardt
2025-08-19 10:56 ` [PATCH RFC 11/11] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-08-20 21:27   ` D. Ben Knoble
2025-08-22 12:22     ` Patrick Steinhardt
2025-08-22 18:08       ` Junio C Hamano
2025-08-24 16:03         ` Patrick Steinhardt
2025-08-23 16:37   ` Jean-Noël AVILA
2025-08-24 16:02     ` Patrick Steinhardt
2025-08-19 21:28 ` [PATCH RFC 00/11] Introduce git-history(1) command for easy history editing D. Ben Knoble
2025-08-20  6:54   ` Patrick Steinhardt
2025-08-20 16:55     ` Ben Knoble
2025-08-20 17:36 ` Junio C Hamano
2025-08-20 17:49   ` Ben Knoble
2025-08-22 12:21     ` Patrick Steinhardt
2025-08-22 17:58       ` Junio C Hamano
2025-08-21 16:26   ` Sergey Organov
2025-08-21 17:21     ` Ben Knoble
2025-08-21 18:15       ` Sergey Organov
2025-08-24  1:25 ` Martin von Zweigbergk
2025-08-24 16:03   ` Patrick Steinhardt
2025-09-17 20:12     ` SZEDER Gábor
2025-12-03 18:18       ` Matthias Beyer
2025-12-10  9:58         ` Phillip Wood
2025-12-10 10:37           ` Matthias Beyer
2025-12-10 11:34             ` Phillip Wood
2025-12-10 14:18               ` Junio C Hamano
2025-12-19 12:22                 ` Patrick Steinhardt
2025-12-19 13:58                   ` SZEDER Gábor
2025-12-19 14:09                     ` Patrick Steinhardt
2025-12-19 16:30                   ` Elijah Newren
2025-12-20 16:51                     ` Elijah Newren
2025-12-22 10:46                   ` Phillip Wood
2025-12-22 13:47                   ` D. Ben Knoble
2025-12-10 16:49             ` Martin von Zweigbergk
2025-12-10 18:27               ` Elijah Newren
2025-12-10 18:45                 ` Martin von Zweigbergk
2025-12-10 19:55                   ` Elijah Newren
2025-12-15 23:50             ` Kristoffer Haugsbakk
2025-08-24 17:31 ` Kristoffer Haugsbakk
2025-08-24 17:38   ` Patrick Steinhardt
2025-08-24 17:42 ` [PATCH RFC v2 00/16] " Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 01/16] sequencer: optionally skip printing commit summary Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 02/16] sequencer: add option to rewind HEAD after picking commits Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 03/16] sequencer: introduce new history editing mode Patrick Steinhardt
2025-08-26 12:55     ` D. Ben Knoble
2025-09-03 12:19       ` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 04/16] sequencer: stop using `the_repository` in `sequencer_remove_state()` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 05/16] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-08-25 16:38     ` Junio C Hamano
2025-09-03 12:19       ` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 06/16] builtin: add new "history" command Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 07/16] builtin/history: introduce subcommands to manage interrupted rewrites Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 08/16] builtin/history: implement "drop" subcommand Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 09/16] builtin/history: implement "reorder" subcommand Patrick Steinhardt
2025-08-26 13:03     ` D. Ben Knoble
2025-09-03 12:19       ` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 10/16] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-08-25 16:41     ` Junio C Hamano
2025-08-24 17:42   ` [PATCH RFC v2 11/16] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 12/16] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-08-25 16:43     ` Junio C Hamano
2025-08-24 17:42   ` [PATCH RFC v2 13/16] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 14/16] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-08-24 17:42   ` [PATCH RFC v2 15/16] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-08-24 18:03     ` Kristoffer Haugsbakk
2025-09-03 12:20       ` Patrick Steinhardt
2025-08-26 13:14     ` D. Ben Knoble
2025-09-03 12:20       ` Patrick Steinhardt
2025-09-03 21:55         ` D. Ben Knoble
2025-09-04 12:57           ` Patrick Steinhardt
2025-09-12 18:26             ` D. Ben Knoble
2025-09-15  9:32               ` Patrick Steinhardt
2025-09-15 13:04                 ` Ben Knoble
2025-08-24 17:42   ` [PATCH RFC v2 16/16] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-08-24 18:08     ` Kristoffer Haugsbakk
2025-09-03 12:20       ` Patrick Steinhardt
2025-09-03 23:39   ` [PATCH RFC v2 00/16] Introduce git-history(1) command for easy history editing D. Ben Knoble
2025-09-04 13:05     ` Patrick Steinhardt
2025-09-04 14:27 ` [PATCH RFC v3 00/18] " Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 01/18] sequencer: optionally skip printing commit summary Patrick Steinhardt
2025-09-10 14:01     ` Phillip Wood
2025-09-15  9:32       ` Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 02/18] sequencer: add option to rewind HEAD after picking commits Patrick Steinhardt
2025-09-10 14:04     ` Phillip Wood
2025-09-15  9:32       ` Patrick Steinhardt
2025-09-15 14:10         ` Phillip Wood
2025-09-04 14:27   ` [PATCH RFC v3 03/18] sequencer: introduce new history editing mode Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 04/18] sequencer: stop using `the_repository` in `sequencer_remove_state()` Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 05/18] sequencer: wire up "rewritten-hook" for REPLAY_HISTORY_EDIT Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 06/18] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 07/18] builtin: add new "history" command Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 08/18] builtin/history: introduce subcommands to manage interrupted rewrites Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 09/18] builtin/history: implement "drop" subcommand Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 10/18] builtin/history: implement "reorder" subcommand Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 11/18] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 12/18] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 13/18] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 14/18] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 15/18] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 16/18] sequencer: allow callers to provide mappings for the old commit Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 17/18] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-09-10 14:04     ` Phillip Wood
2025-09-15  9:32       ` Patrick Steinhardt
2025-09-04 14:27   ` [PATCH RFC v3 18/18] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-09-10 14:05     ` Phillip Wood
2025-09-15  9:32       ` Patrick Steinhardt
2025-09-15 14:10         ` Phillip Wood
2025-09-16  8:09           ` Patrick Steinhardt
2025-09-16  8:42             ` Phillip Wood
2025-09-05 10:29   ` [PATCH RFC v3 00/18] Introduce git-history(1) command for easy history editing Kristoffer Haugsbakk
2025-09-05 11:29     ` Patrick Steinhardt
2025-09-07  6:46   ` Elijah Newren
2025-09-10 14:05     ` Phillip Wood
2025-09-10 14:08       ` Phillip Wood
2025-09-15  9:33     ` Patrick Steinhardt
2025-09-16 11:23       ` Oswald Buddenhagen
2025-09-10 20:05   ` Junio C Hamano
2025-09-15  9:32     ` Patrick Steinhardt
2025-10-01 15:57 ` [PATCH v4 00/12] " Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 01/12] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-10-14  8:49     ` Karthik Nayak
2025-10-21 11:43       ` Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 02/12] replay: extract logic to pick commits Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 03/12] replay: stop using `the_repository` Patrick Steinhardt
2025-10-14  8:53     ` Karthik Nayak
2025-10-01 15:57   ` [PATCH v4 04/12] replay: parse commits before dereferencing them Patrick Steinhardt
2025-10-14  8:57     ` Karthik Nayak
2025-10-01 15:57   ` [PATCH v4 05/12] builtin: add new "history" command Patrick Steinhardt
2025-10-02  9:26     ` Kristoffer Haugsbakk
2025-10-14  9:07     ` Karthik Nayak
2025-10-21 11:43       ` Patrick Steinhardt
2025-10-22  3:32       ` Junio C Hamano
2025-10-22 12:12         ` Karthik Nayak
2025-10-01 15:57   ` [PATCH v4 06/12] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-10-14 11:04     ` Karthik Nayak
2025-10-21 11:43       ` Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 07/12] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 08/12] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-10-02  9:25     ` Kristoffer Haugsbakk
2025-10-14 12:35     ` Karthik Nayak
2025-10-21 11:44       ` Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 09/12] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 10/12] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-10-02  9:28     ` Kristoffer Haugsbakk
2025-10-02 10:24       ` Patrick Steinhardt
2025-10-14 13:08     ` Karthik Nayak
2025-10-01 15:57   ` [PATCH v4 11/12] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-10-01 15:57   ` [PATCH v4 12/12] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-10-14 13:38     ` Karthik Nayak
2025-10-21 11:44       ` Patrick Steinhardt
2025-10-21 21:19         ` D. Ben Knoble
2025-10-27  9:58           ` Patrick Steinhardt
2025-10-14 13:41   ` [PATCH v4 00/12] Introduce git-history(1) command for easy history editing Karthik Nayak
2025-10-14 16:47   ` Junio C Hamano
2025-10-21 14:15 ` [PATCH v5 " Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 01/12] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-10-21 20:38     ` Junio C Hamano
2025-10-21 14:15   ` [PATCH v5 02/12] replay: extract logic to pick commits Patrick Steinhardt
2025-10-21 20:41     ` Junio C Hamano
2025-10-21 14:15   ` [PATCH v5 03/12] replay: stop using `the_repository` Patrick Steinhardt
2025-10-21 20:48     ` Junio C Hamano
2025-10-21 20:52     ` Junio C Hamano
2025-10-21 14:15   ` [PATCH v5 04/12] replay: parse commits before dereferencing them Patrick Steinhardt
2025-10-21 20:57     ` Junio C Hamano
2025-10-27  9:57       ` Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 05/12] builtin: add new "history" command Patrick Steinhardt
2025-10-21 21:15     ` Junio C Hamano
2025-10-27  9:57       ` Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 06/12] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-10-21 21:34     ` Junio C Hamano
2025-10-21 21:43       ` D. Ben Knoble
2025-10-27  9:58         ` Patrick Steinhardt
2025-10-27  9:58       ` Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 07/12] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 08/12] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 09/12] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 10/12] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-10-21 14:15   ` [PATCH v5 11/12] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-10-21 14:16   ` [PATCH v5 12/12] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-10-21 18:53   ` [PATCH v5 00/12] Introduce git-history(1) command for easy history editing Junio C Hamano
2025-10-27 11:33 ` [PATCH v6 00/11] " Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 01/11] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 02/11] replay: extract logic to pick commits Patrick Steinhardt
2025-11-17 16:27     ` Phillip Wood
2025-11-20  7:01       ` Elijah Newren
2025-10-27 11:33   ` [PATCH v6 03/11] replay: stop using `the_repository` Patrick Steinhardt
2025-11-20  7:01     ` Elijah Newren
2025-12-02 18:47       ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 04/11] builtin: add new "history" command Patrick Steinhardt
2025-11-17 16:28     ` Phillip Wood
2025-12-02 18:48       ` Patrick Steinhardt
2025-11-20  7:02     ` Elijah Newren
2025-12-02 18:48       ` Patrick Steinhardt
2025-12-02 22:44         ` D. Ben Knoble
2025-12-03 10:48           ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 05/11] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-11-17 16:27     ` Phillip Wood
2025-12-02 18:50       ` Patrick Steinhardt [this message]
2025-12-10  9:52         ` Phillip Wood
2025-11-20  7:03     ` Elijah Newren
2025-12-02 18:50       ` Patrick Steinhardt
2025-11-25  8:31     ` SZEDER Gábor
2025-12-02 18:50       ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 06/11] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-11-20  7:03     ` Elijah Newren
2025-10-27 11:33   ` [PATCH v6 07/11] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-11-20  7:03     ` Elijah Newren
2025-11-20 15:05     ` Phillip Wood
2025-12-02 18:48       ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 08/11] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-11-20  7:03     ` Elijah Newren
2025-11-20 15:05     ` Phillip Wood
2025-10-27 11:33   ` [PATCH v6 09/11] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-11-20  7:04     ` Elijah Newren
2025-11-20 15:05       ` Phillip Wood
2025-12-02 18:49       ` Patrick Steinhardt
2025-10-27 11:33   ` [PATCH v6 10/11] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-11-20  7:04     ` Elijah Newren
2025-10-27 11:33   ` [PATCH v6 11/11] builtin/history: implement "split" subcommand Patrick Steinhardt
2025-11-20  7:05     ` Elijah Newren
2025-12-02 18:49       ` Patrick Steinhardt
2025-11-21 14:31     ` Phillip Wood
2025-12-02 18:51       ` Patrick Steinhardt
2025-12-10  9:51         ` Phillip Wood
2025-12-19 13:00           ` Patrick Steinhardt
2025-11-12 19:13   ` [PATCH v6 00/11] Introduce git-history(1) command for easy history editing Sergey Organov
2025-11-20  7:07   ` Elijah Newren
2025-11-20 20:28     ` Junio C Hamano
2025-11-20 20:40       ` Elijah Newren
2025-11-20 20:49         ` Junio C Hamano
2025-11-20 22:02           ` Elijah Newren
2025-11-21 14:31             ` Phillip Wood
2025-11-21 16:01               ` Junio C Hamano
2025-11-23  2:54                 ` Elijah Newren
2025-12-02 18:49                   ` Patrick Steinhardt
2025-12-05  8:49                     ` Elijah Newren
2025-12-09  7:53                       ` Patrick Steinhardt
2025-12-09 17:43                         ` Martin von Zweigbergk
2025-12-10 11:32                           ` Phillip Wood
2025-12-10  6:55                         ` Elijah Newren
2025-12-09 18:29                     ` Kristoffer Haugsbakk
2025-12-12 22:00                       ` Working on top of mega merges D. Ben Knoble
2025-11-23  2:30               ` [PATCH v6 00/11] Introduce git-history(1) command for easy history editing Elijah Newren
2025-11-24 16:31                 ` Phillip Wood
2025-11-25  3:39                   ` Elijah Newren
2025-12-03 10:48 ` [PATCH v7 00/12] " Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 01/12] wt-status: provide function to expose status for trees Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 02/12] replay: extract logic to pick commits Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 03/12] replay: stop using `the_repository` Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 04/12] builtin: add new "history" command Patrick Steinhardt
2025-12-22 17:11     ` Kristoffer Haugsbakk
2025-12-03 10:48   ` [PATCH v7 05/12] builtin/history: implement "reword" subcommand Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 06/12] add-patch: split out header from "add-interactive.h" Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 07/12] add-patch: split out `struct interactive_options` Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 08/12] add-patch: remove dependency on "add-interactive" subsystem Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 09/12] add-patch: add support for in-memory index patching Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 10/12] add-patch: allow disabling editing of hunks Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 11/12] cache-tree: allow writing in-memory index as tree Patrick Steinhardt
2025-12-03 10:48   ` [PATCH v7 12/12] builtin/history: implement "split" subcommand Patrick Steinhardt

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=aS80_rTVHP44JKhx@pks.im \
    --to=ps@pks.im \
    --cc=ben.knoble@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jn.avila@free.fr \
    --cc=karthik.188@gmail.com \
    --cc=kristofferhaugsbakk@fastmail.com \
    --cc=martinvonz@gmail.com \
    --cc=newren@gmail.com \
    --cc=phillip.wood@dunelm.org.uk \
    --cc=sorganov@gmail.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;
as well as URLs for NNTP newsgroup(s).