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
>
next prev parent 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