diff options
| author | Abraham Samuel Adekunle <abrahamadekunle50@gmail.com> | 2026-02-14 12:03:54 +0100 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-02-17 10:48:36 -0800 |
| commit | 06c81a1118a6c9a77505b0ae3092576fa4c01763 (patch) | |
| tree | 70016fd379f1968b614387561b779b0be270352c | |
| parent | 68cb7f9e92a5d8e9824f5b52ac3d0a9d8f653dbe (diff) | |
| download | git-06c81a1118a6c9a77505b0ae3092576fa4c01763.tar.xz | |
interactive -p: add new `--auto-advance` flag
When using the interactive add, reset, stash or checkout machinery,
we do not have the option of reworking with a file when selecting
hunks, because the session automatically advances to the next file
or ends if we have just one file.
Introduce the flag `--auto-advance` which auto advances by default,
when interactively selecting patches with the '--patch' option.
However, the `--no-auto-advance` option does not auto advance, thereby
allowing users the option to rework with files.
Signed-off-by: Abraham Samuel Adekunle <abrahamadekunle50@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
| -rw-r--r-- | add-interactive.c | 2 | ||||
| -rw-r--r-- | add-interactive.h | 4 | ||||
| -rw-r--r-- | builtin/add.c | 4 | ||||
| -rw-r--r-- | builtin/checkout.c | 7 | ||||
| -rw-r--r-- | builtin/reset.c | 4 | ||||
| -rw-r--r-- | builtin/stash.c | 8 | ||||
| -rwxr-xr-x | t/t9902-completion.sh | 1 |
7 files changed, 29 insertions, 1 deletions
diff --git a/add-interactive.c b/add-interactive.c index 68fc09547d..ce9e737e0f 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->auto_advance = add_p_opt->auto_advance; s->use_color_interactive = check_color_config(r, "color.interactive"); @@ -1017,6 +1018,7 @@ static int run_patch(struct add_i_state *s, const struct pathspec *ps, struct add_p_opt add_p_opt = { .context = s->context, .interhunkcontext = s->interhunkcontext, + .auto_advance = s->auto_advance }; struct strvec args = STRVEC_INIT; struct pathspec ps_selected = { 0 }; diff --git a/add-interactive.h b/add-interactive.h index da49502b76..7843397775 100644 --- a/add-interactive.h +++ b/add-interactive.h @@ -6,9 +6,10 @@ struct add_p_opt { int context; int interhunkcontext; + int auto_advance; }; -#define ADD_P_OPT_INIT { .context = -1, .interhunkcontext = -1 } +#define ADD_P_OPT_INIT { .context = -1, .interhunkcontext = -1, .auto_advance = 1 } struct add_i_state { struct repository *r; @@ -29,6 +30,7 @@ struct add_i_state { int use_single_key; char *interactive_diff_filter, *interactive_diff_algorithm; int context, interhunkcontext; + int 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..4357f87b7f 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, "auto-advance", &add_p_opt.auto_advance, + N_("auto advance to the next file 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.auto_advance) + die(_("the option '%s' requires '%s'"), "--no-auto-advance", "--interactive/--patch"); } if (edit_interactive) { diff --git a/builtin/checkout.c b/builtin/checkout.c index 66b69df6e6..6710b53fd0 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 auto_advance; int quiet; int merge; int force; @@ -111,6 +112,7 @@ struct checkout_opts { .merge = -1, \ .patch_context = -1, \ .patch_interhunk_context = -1, \ + .auto_advance = 1, \ } struct branch_info { @@ -549,6 +551,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, + .auto_advance = opts->auto_advance }; const char *rev = new_branch_info->name; char rev_oid[GIT_MAX_HEXSZ + 1]; @@ -1801,6 +1804,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->auto_advance) + die(_("the option '%s' requires '%s'"), "--no-auto-advance", "--patch"); } if (opts->show_progress < 0) { @@ -1999,6 +2004,8 @@ int cmd_checkout(int argc, OPT_BOOL(0, "guess", &opts.dwim_new_local_branch, N_("second guess 'git checkout <no-such-branch>' (default)")), OPT_BOOL(0, "overlay", &opts.overlay_mode, N_("use overlay mode (default)")), + OPT_BOOL(0, "auto-advance", &opts.auto_advance, + N_("auto advance to the next file when selecting hunks interactively")), OPT_END() }; diff --git a/builtin/reset.c b/builtin/reset.c index ed35802af1..7535591530 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, "auto-advance", &add_p_opt.auto_advance, + N_("auto advance to the next file 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.auto_advance) + die(_("the option '%s' requires '%s'"), "--no-auto-advance", "--patch"); } /* git reset tree [--] paths... can be used to diff --git a/builtin/stash.c b/builtin/stash.c index 948eba06fb..1a98358fa6 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, "auto-advance", &add_p_opt.auto_advance, + N_("auto advance to the next file 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.auto_advance) + die(_("the option '%s' requires '%s'"), "--no-auto-advance", "--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, "auto-advance", &add_p_opt.auto_advance, + N_("auto advance to the next file 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.auto_advance) + die(_("the option '%s' requires '%s'"), "--no-auto-advance", "--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..3da5527ae5 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 + --auto-advance Z --progress Z --guess Z --no-guess Z |
