[PATCH v3 1/3] interactive -p: add new `--rework-with-file` flag to interactive machinery
- From
Abraham Samuel Adekunle <abrahamadekunle50@gmail.com>
- Date
- Feb 6, 2026, 15:54 UTC
- Message-ID
- <c0fa65b429b4a5c33c4a2092e0e8d014a61e4569.1770390576.git.abrahamadekunle50@gmail.com>
- In-Reply-To
- <cover.1770390576.git.abrahamadekunle50@gmail.com>
When using the interactive add, reset, stash or checkout machinery, we do not have the option of reworking with a file because the session automatically advances to the next file or ends if we have just one file, immediately all hunks in a file are decided on.
Introduce the flag "--rework-with-file" when interactively selecting patches with the '--patch' option, which does not auto advance, thereby allowing users the option to rework with files. This ensures the current auto-advance method stays as the default method.
Signed-off-by: Abraham Samuel Adekunle <abrahamadekunle50@gmail.com> --- add-interactive.c | 3 +++ add-interactive.h | 5 +++-- builtin/add.c | 4 ++++ builtin/checkout.c | 6 ++++++ builtin/reset.c | 4 ++++ builtin/stash.c | 8 ++++++++ t/t9902-completion.sh | 1 + 7 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/add-interactive.c b/add-interactive.c index 68fc09547d..4eda115da8 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -64,6 +64,7 @@ void init_add_i_state(struct add_i_state *s, struct repository *r, s->r = r; s->context = -1; s->interhunkcontext = -1; + s->no_auto_advance = 0; s->use_color_interactive = check_color_config(r, "color.interactive"); @@ -124,6 +125,8 @@ void init_add_i_state(struct add_i_state *s, struct repository *r, die(_("%s cannot be negative"), "--inter-hunk-context"); s->interhunkcontext = add_p_opt->interhunkcontext; } + if (add_p_opt->no_auto_advance) + s->no_auto_advance = 1; } void clear_add_i_state(struct add_i_state *s) diff --git a/add-interactive.h b/add-interactive.h index da49502b76..aef2feca56 100644 --- a/add-interactive.h +++ b/add-interactive.h @@ -6,9 +6,10 @@ struct add_p_opt { int context; int interhunkcontext; + int no_auto_advance; }; -#define ADD_P_OPT_INIT { .context = -1, .interhunkcontext = -1 } +#define ADD_P_OPT_INIT { .context = -1, .interhunkcontext = -1, .no_auto_advance = 0 } struct add_i_state { struct repository *r; @@ -28,7 +29,7 @@ struct add_i_state { int use_single_key; char *interactive_diff_filter, *interactive_diff_algorithm; - int context, interhunkcontext; + int context, interhunkcontext, no_auto_advance; }; void init_add_i_state(struct add_i_state *s, struct repository *r, diff --git a/builtin/add.c b/builtin/add.c index 32709794b3..408827cf54 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -256,6 +256,8 @@ static struct option builtin_add_options[] = { OPT_GROUP(""), OPT_BOOL('i', "interactive", &add_interactive, N_("interactive picking")), OPT_BOOL('p', "patch", &patch_interactive, N_("select hunks interactively")), + OPT_BOOL(0, "rework-with-file", &add_p_opt.no_auto_advance, + N_("rework with files when selecting hunks interactively")), OPT_DIFF_UNIFIED(&add_p_opt.context), OPT_DIFF_INTERHUNK_CONTEXT(&add_p_opt.interhunkcontext), OPT_BOOL('e', "edit", &edit_interactive, N_("edit current diff and apply")), @@ -418,6 +420,8 @@ int cmd_add(int argc, die(_("the option '%s' requires '%s'"), "--unified", "--interactive/--patch"); if (add_p_opt.interhunkcontext != -1) die(_("the option '%s' requires '%s'"), "--inter-hunk-context", "--interactive/--patch"); + if (add_p_opt.no_auto_advance) + die(_("the option '%s' requires '%s'"), "--rework-with-file", "--interactive/--patch"); } if (edit_interactive) { diff --git a/builtin/checkout.c b/builtin/checkout.c index 261699e2f5..3e98d06be1 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -63,6 +63,7 @@ struct checkout_opts { int patch_mode; int patch_context; int patch_interhunk_context; + int no_auto_advance; int quiet; int merge; int force; @@ -549,6 +550,7 @@ static int checkout_paths(const struct checkout_opts *opts, struct add_p_opt add_p_opt = { .context = opts->patch_context, .interhunkcontext = opts->patch_interhunk_context, + .no_auto_advance = opts->no_auto_advance }; const char *rev = new_branch_info->name; char rev_oid[GIT_MAX_HEXSZ + 1]; @@ -1747,6 +1749,8 @@ static struct option *add_checkout_path_options(struct checkout_opts *opts, N_("checkout their version for unmerged files"), 3, PARSE_OPT_NONEG), OPT_BOOL('p', "patch", &opts->patch_mode, N_("select hunks interactively")), + OPT_BOOL(0, "rework-with-file", &opts->no_auto_advance, + N_("rework with files when selecting hunks interactively")), OPT_DIFF_UNIFIED(&opts->patch_context), OPT_DIFF_INTERHUNK_CONTEXT(&opts->patch_interhunk_context), OPT_BOOL(0, "ignore-skip-worktree-bits", &opts->ignore_skipworktree, @@ -1801,6 +1805,8 @@ static int checkout_main(int argc, const char **argv, const char *prefix, die(_("the option '%s' requires '%s'"), "--unified", "--patch"); if (opts->patch_interhunk_context != -1) die(_("the option '%s' requires '%s'"), "--inter-hunk-context", "--patch"); + if (opts->no_auto_advance) + die(_("the option '%s' requires '%s'"), "--rework-with-file", "--patch"); } if (opts->show_progress < 0) { diff --git a/builtin/reset.c b/builtin/reset.c index ed35802af1..1e7b93785d 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -371,6 +371,8 @@ int cmd_reset(int argc, PARSE_OPT_OPTARG, option_parse_recurse_submodules_worktree_updater), OPT_BOOL('p', "patch", &patch_mode, N_("select hunks interactively")), + OPT_BOOL(0, "rework-with-file", &add_p_opt.no_auto_advance, + N_("rework with files when selecting hunks interactively")), OPT_DIFF_UNIFIED(&add_p_opt.context), OPT_DIFF_INTERHUNK_CONTEXT(&add_p_opt.interhunkcontext), OPT_BOOL('N', "intent-to-add", &intent_to_add, @@ -443,6 +445,8 @@ int cmd_reset(int argc, die(_("the option '%s' requires '%s'"), "--unified", "--patch"); if (add_p_opt.interhunkcontext != -1) die(_("the option '%s' requires '%s'"), "--inter-hunk-context", "--patch"); + if (add_p_opt.no_auto_advance) + die(_("the option '%s' requires '%s'"), "--rework-with-file", "--patch"); } /* git reset tree [--] paths... can be used to diff --git a/builtin/stash.c b/builtin/stash.c index 948eba06fb..1311707ea6 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -1849,6 +1849,8 @@ static int push_stash(int argc, const char **argv, const char *prefix, N_("stash staged changes only")), OPT_BOOL('p', "patch", &patch_mode, N_("stash in patch mode")), + OPT_BOOL(0, "rework-with-file", &add_p_opt.no_auto_advance, + N_("rework with files when selecting hunks interactively")), OPT_DIFF_UNIFIED(&add_p_opt.context), OPT_DIFF_INTERHUNK_CONTEXT(&add_p_opt.interhunkcontext), OPT__QUIET(&quiet, N_("quiet mode")), @@ -1911,6 +1913,8 @@ static int push_stash(int argc, const char **argv, const char *prefix, die(_("the option '%s' requires '%s'"), "--unified", "--patch"); if (add_p_opt.interhunkcontext != -1) die(_("the option '%s' requires '%s'"), "--inter-hunk-context", "--patch"); + if (add_p_opt.no_auto_advance) + die(_("the option '%s' requires '%s'"), "--rework-with-file", "--patch"); } if (add_p_opt.context < -1) @@ -1952,6 +1956,8 @@ static int save_stash(int argc, const char **argv, const char *prefix, N_("stash staged changes only")), OPT_BOOL('p', "patch", &patch_mode, N_("stash in patch mode")), + OPT_BOOL(0, "rework-with-file", &add_p_opt.no_auto_advance, + N_("rework with files when selecting hunks interactively")), OPT_DIFF_UNIFIED(&add_p_opt.context), OPT_DIFF_INTERHUNK_CONTEXT(&add_p_opt.interhunkcontext), OPT__QUIET(&quiet, N_("quiet mode")), @@ -1983,6 +1989,8 @@ static int save_stash(int argc, const char **argv, const char *prefix, die(_("the option '%s' requires '%s'"), "--unified", "--patch"); if (add_p_opt.interhunkcontext != -1) die(_("the option '%s' requires '%s'"), "--inter-hunk-context", "--patch"); + if (add_p_opt.no_auto_advance) + die(_("the option '%s' requires '%s'"), "--rework-with-file", "--patch"); } ret = do_push_stash(&ps, stash_msg, quiet, keep_index, diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index 964e1f1569..302534e92d 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -2601,6 +2601,7 @@ test_expect_success 'double dash "git checkout"' ' --ignore-skip-worktree-bits Z --ignore-other-worktrees Z --recurse-submodules Z + --rework-with-file Z --progress Z --guess Z --no-guess Z
-- 2.39.5 (Apple Git-154)