public inbox for git@vger.kernel.org 
 help / color / mirror / Atom feed
From: Phillip Wood <phillip.wood123@gmail•com>
To: Patrick Steinhardt <ps@pks•im>, 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: Wed, 10 Dec 2025 09:52:52 +0000	[thread overview]
Message-ID: <266a9cfc-142f-49c0-a2a0-1d67426479b9@gmail.com> (raw)
In-Reply-To: <aS80_rTVHP44JKhx@pks.im>

On 02/12/2025 18:50, Patrick Steinhardt wrote:
> 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.

I'm surprised it was such a pain compared to the cost to using a strvec. 
We're forever converting from a string to a struct commit and back again 
which bloats the code and obscures the interesting and important parts. 
That cost will be paid each time we add a new subcommand. An 
implementation of 'struct commit_vec' that implements commit_vec_push(), 
commit_vec_splice() and commit_vec_clear() is only going to be 30 or 40 
lines of code and gives us a solid foundation for this series. Open 
coding the array and adding a SPLICE_ARRAY macro would also be pretty 
simple.

Thanks

Phillip

>>   > +{
>>> +	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-10  9:52 UTC|newest]

Thread overview: 362+ 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
2026-01-06 15:39                       ` Patrick Steinhardt
2025-12-22 10:46                   ` Phillip Wood
2026-01-06 15:40                     ` Patrick Steinhardt
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
2025-12-10  9:52         ` Phillip Wood [this message]
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
2026-01-06 15:41       ` Patrick Steinhardt
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
2026-01-07 10:10 ` [PATCH v8 0/7] Introduce git-history(1) command for easy history editing Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 1/7] builtin/replay: extract core logic to replay revisions Patrick Steinhardt
2026-01-07 17:53     ` D. Ben Knoble
2026-01-09  7:37       ` Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 2/7] builtin/replay: move core logic into "libgit.a" Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 3/7] replay: small set of cleanups Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 4/7] replay: yield the object ID of the final rewritten commit Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 5/7] wt-status: provide function to expose status for trees Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 6/7] builtin: add new "history" command Patrick Steinhardt
2026-01-07 10:10   ` [PATCH v8 7/7] builtin/history: implement "reword" subcommand Patrick Steinhardt
2026-01-07 18:01     ` D. Ben Knoble
2026-01-09  7:37       ` Patrick Steinhardt
2026-01-09 23:24         ` D. Ben Knoble
2026-01-10  1:20     ` Elijah Newren
2026-01-12 13:03       ` Patrick Steinhardt
2026-01-07 17:39   ` [PATCH v8 0/7] Introduce git-history(1) command for easy history editing D. Ben Knoble
2026-01-09  7:34     ` Patrick Steinhardt
2026-01-09 23:27       ` D. Ben Knoble
2026-01-09  8:35 ` [PATCH v9 " Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 1/7] builtin/replay: extract core logic to replay revisions Patrick Steinhardt
2026-01-10  1:14     ` Elijah Newren
2026-01-12 13:02       ` Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 2/7] builtin/replay: move core logic into "libgit.a" Patrick Steinhardt
2026-01-10  1:16     ` Elijah Newren
2026-01-12 13:02       ` Patrick Steinhardt
2026-01-13  6:00         ` Elijah Newren
2026-01-13  7:31           ` Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 3/7] replay: small set of cleanups Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 4/7] replay: yield the object ID of the final rewritten commit Patrick Steinhardt
2026-01-10  1:17     ` Elijah Newren
2026-01-12 13:03       ` Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 5/7] wt-status: provide function to expose status for trees Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 6/7] builtin: add new "history" command Patrick Steinhardt
2026-01-10  1:17     ` Elijah Newren
2026-01-12 13:02       ` Patrick Steinhardt
2026-01-09  8:35   ` [PATCH v9 7/7] builtin/history: implement "reword" subcommand Patrick Steinhardt
2026-01-10  1:26   ` [PATCH v9 0/7] Introduce git-history(1) command for easy history editing Elijah Newren
2026-01-10 17:14     ` SZEDER Gábor
2026-01-12 13:03       ` Patrick Steinhardt
2026-01-11  5:58   ` [PATCH 0/2] Some Elijah Newren
2026-01-11  5:58     ` [PATCH v9 8/7] SQUASH ME: Fixups Elijah Newren
2026-01-11  5:58     ` [PATCH v9 9/7] history: fix detached HEAD handling Elijah Newren
2026-01-11  6:15     ` [PATCH 0/2] Some Elijah Newren
2026-01-12 13:02     ` Patrick Steinhardt
2026-01-12 14:15 ` [PATCH v10 0/8] Introduce git-history(1) command for easy history editing Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 1/8] builtin/replay: extract core logic to replay revisions Patrick Steinhardt
2026-01-12 15:08     ` Junio C Hamano
2026-01-12 15:37       ` Patrick Steinhardt
2026-01-13  6:00     ` Elijah Newren
2026-01-13  7:31       ` Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 2/8] builtin/replay: move core logic into "libgit.a" Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 3/8] replay: small set of cleanups Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 4/8] replay: support empty commit ranges Patrick Steinhardt
2026-01-13  6:00     ` Elijah Newren
2026-01-13  7:30       ` Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 5/8] replay: support updating detached HEAD Patrick Steinhardt
2026-01-13  6:00     ` Elijah Newren
2026-01-13  7:30       ` Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 6/8] wt-status: provide function to expose status for trees Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 7/8] builtin: add new "history" command Patrick Steinhardt
2026-01-12 14:15   ` [PATCH v10 8/8] builtin/history: implement "reword" subcommand Patrick Steinhardt
2026-01-13  6:01     ` Elijah Newren
2026-01-13  6:01   ` [PATCH v10 0/8] Introduce git-history(1) command for easy history editing Elijah Newren
2026-01-13  9:54 ` [PATCH v11 " Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 1/8] builtin/replay: extract core logic to replay revisions Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 2/8] builtin/replay: move core logic into "libgit.a" Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 3/8] replay: small set of cleanups Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 4/8] replay: support empty commit ranges Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 5/8] replay: support updating detached HEAD Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 6/8] wt-status: provide function to expose status for trees Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 7/8] builtin: add new "history" command Patrick Steinhardt
2026-01-13  9:54   ` [PATCH v11 8/8] builtin/history: implement "reword" subcommand Patrick Steinhardt
2026-01-16 16:28     ` SZEDER Gábor
2026-01-17 22:56       ` Elijah Newren
2026-01-18 17:50         ` Junio C Hamano
2026-02-03  0:01         ` Junio C Hamano
2026-02-05  8:19           ` Patrick Steinhardt
2026-01-16  6:43   ` [PATCH v11 0/8] Introduce git-history(1) command for easy history editing Elijah Newren
2026-01-16 15:21     ` Junio C Hamano
2026-01-16 16:32       ` SZEDER Gábor
2026-01-21 19:02         ` 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=266a9cfc-142f-49c0-a2a0-1d67426479b9@gmail.com \
    --to=phillip.wood123@gmail$(echo .)com \
    --cc=ben.knoble@gmail$(echo .)com \
    --cc=git@vger$(echo .)kernel.org \
    --cc=gitster@pobox$(echo .)com \
    --cc=jn.avila@free$(echo .)fr \
    --cc=karthik.188@gmail$(echo .)com \
    --cc=kristofferhaugsbakk@fastmail$(echo .)com \
    --cc=martinvonz@gmail$(echo .)com \
    --cc=newren@gmail$(echo .)com \
    --cc=phillip.wood@dunelm$(echo .)org.uk \
    --cc=ps@pks$(echo .)im \
    --cc=sorganov@gmail$(echo .)com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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