]> git.ipfire.org Git - thirdparty/git.git/commitdiff
add-patch: allow disabling editing of hunks
authorPatrick Steinhardt <ps@pks.im>
Mon, 2 Mar 2026 12:13:09 +0000 (13:13 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 3 Mar 2026 23:09:36 +0000 (15:09 -0800)
The "add-patch" mode allows the user to edit hunks to apply custom
changes. This is incompatible with a new `git history split` command
that we're about to introduce in a subsequent commit, so we need a way
to disable this mode.

Add a new flag to disable editing hunks.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
add-interactive.c
add-patch.c
add-patch.h
builtin/add.c
builtin/checkout.c
builtin/reset.c
builtin/stash.c

index 152e2a02979e454bcfcd260e720ebbfce5c4cf9b..3cf8a1dbf85e3f3d3606c869137c24e122485544 100644 (file)
@@ -927,7 +927,7 @@ static int run_patch(struct add_i_state *s, const struct pathspec *ps,
                parse_pathspec(&ps_selected,
                               PATHSPEC_ALL_MAGIC & ~PATHSPEC_LITERAL,
                               PATHSPEC_LITERAL_PATH, "", args.v);
-               res = run_add_p(s->r, ADD_P_ADD, &opts, NULL, &ps_selected);
+               res = run_add_p(s->r, ADD_P_ADD, &opts, NULL, &ps_selected, 0);
                strvec_clear(&args);
                clear_pathspec(&ps_selected);
        }
index b4dc7d2293930c657843b6e7717e6348464a53fe..4e28e5c18786e28c425fcd987ccce7a2b59b0db7 100644 (file)
@@ -1604,7 +1604,9 @@ static bool get_first_undecided(const struct file_diff *file_diff, size_t *idx)
        return false;
 }
 
-static size_t patch_update_file(struct add_p_state *s, size_t idx)
+static size_t patch_update_file(struct add_p_state *s,
+                               size_t idx,
+                               unsigned flags)
 {
        size_t hunk_index = 0;
        ssize_t i, undecided_previous, undecided_next, rendered_hunk_index = -1;
@@ -1715,7 +1717,8 @@ static size_t patch_update_file(struct add_p_state *s, size_t idx)
                                permitted |= ALLOW_SPLIT;
                                strbuf_addstr(&s->buf, ",s");
                        }
-                       if (hunk_index + 1 > file_diff->mode_change &&
+                       if (!(flags & ADD_P_DISALLOW_EDIT) &&
+                           hunk_index + 1 > file_diff->mode_change &&
                            !file_diff->deleted) {
                                permitted |= ALLOW_EDIT;
                                strbuf_addstr(&s->buf, ",e");
@@ -2003,7 +2006,8 @@ soft_increment:
 }
 
 static int run_add_p_common(struct add_p_state *state,
-                           const struct pathspec *ps)
+                           const struct pathspec *ps,
+                           unsigned flags)
 {
        size_t binary_count = 0;
        size_t i;
@@ -2017,7 +2021,7 @@ static int run_add_p_common(struct add_p_state *state,
                        i++;
                        continue;
                }
-               if ((i = patch_update_file(state, i)) == state->file_diff_nr)
+               if ((i = patch_update_file(state, i, flags)) == state->file_diff_nr)
                        break;
        }
 
@@ -2035,7 +2039,8 @@ static int run_add_p_common(struct add_p_state *state,
 
 int run_add_p(struct repository *r, enum add_p_mode mode,
              struct interactive_options *opts, const char *revision,
-             const struct pathspec *ps)
+             const struct pathspec *ps,
+             unsigned flags)
 {
        struct add_p_state s = {
                .r = r,
@@ -2084,7 +2089,7 @@ int run_add_p(struct repository *r, enum add_p_mode mode,
                goto out;
        }
 
-       ret = run_add_p_common(&s, ps);
+       ret = run_add_p_common(&s, ps, flags);
        if (ret < 0)
                goto out;
 
@@ -2100,7 +2105,8 @@ int run_add_p_index(struct repository *r,
                    const char *index_file,
                    struct interactive_options *opts,
                    const char *revision,
-                   const struct pathspec *ps)
+                   const struct pathspec *ps,
+                   unsigned flags)
 {
        struct patch_mode mode = {
                .apply_args = { "--cached", NULL },
@@ -2156,7 +2162,7 @@ int run_add_p_index(struct repository *r,
        mode.diff_cmd[1] = "-r";
        mode.diff_cmd[2] = parent_tree_oid;
 
-       ret = run_add_p_common(&s, ps);
+       ret = run_add_p_common(&s, ps, flags);
        if (ret < 0)
                goto out;
 
index cf2a31a40fb918c28034325c2ae404ba235de919..fb6d975b68cc4d435beba83c059310d73eac0ca3 100644 (file)
@@ -53,15 +53,22 @@ enum add_p_mode {
        ADD_P_WORKTREE,
 };
 
+enum add_p_flags {
+       /* Disallow "editing" hunks. */
+       ADD_P_DISALLOW_EDIT = (1 << 0),
+};
+
 int run_add_p(struct repository *r, enum add_p_mode mode,
              struct interactive_options *opts, const char *revision,
-             const struct pathspec *ps);
+             const struct pathspec *ps,
+             unsigned flags);
 
 int run_add_p_index(struct repository *r,
                    struct index_state *index,
                    const char *index_file,
                    struct interactive_options *opts,
                    const char *revision,
-                   const struct pathspec *ps);
+                   const struct pathspec *ps,
+                   unsigned flags);
 
 #endif
index 84f9bcb789fc7b9bea3b21e6c42ccf8393c1387b..eeab779328e42f407d49c8709d85ff1dba89480c 100644 (file)
@@ -172,7 +172,7 @@ int interactive_add(struct repository *repo,
                       prefix, argv);
 
        if (patch)
-               ret = !!run_add_p(repo, ADD_P_ADD, interactive_opts, NULL, &pathspec);
+               ret = !!run_add_p(repo, ADD_P_ADD, interactive_opts, NULL, &pathspec, 0);
        else
                ret = !!run_add_i(repo, &pathspec, interactive_opts);
 
index bebe18c1d9029a0db3a5bc2079726aa58f42dc97..a8863277f225c41cf690e182861efee5e5f157f0 100644 (file)
@@ -563,7 +563,7 @@ static int checkout_paths(const struct checkout_opts *opts,
                        BUG("either flag must have been set, worktree=%d, index=%d",
                            opts->checkout_worktree, opts->checkout_index);
                return !!run_add_p(the_repository, patch_mode, &interactive_opts,
-                                  rev, &opts->pathspec);
+                                  rev, &opts->pathspec, 0);
        }
 
        repo_hold_locked_index(the_repository, &lock_file, LOCK_DIE_ON_ERROR);
index 4a74a82c0a3ae8d4838bb3a3fd406fa5c85f9697..3590be57a5f03c5ff7e881e0889c1ac9dbd7a99f 100644 (file)
@@ -438,7 +438,7 @@ int cmd_reset(int argc,
                        die(_("options '%s' and '%s' cannot be used together"), "--patch", "--{hard,mixed,soft}");
                trace2_cmd_mode("patch-interactive");
                update_ref_status = !!run_add_p(the_repository, ADD_P_RESET,
-                                               &interactive_opts, rev, &pathspec);
+                                               &interactive_opts, rev, &pathspec, 0);
                goto cleanup;
        } else {
                if (interactive_opts.context != -1)
index c467c02c7fb2aaf9bdf8848047ed1683196157f0..7c68a1d7f9a85bf1b4664cf13c3cd02be34fed76 100644 (file)
@@ -1331,7 +1331,7 @@ static int stash_patch(struct stash_info *info, const struct pathspec *ps,
        old_index_env = xstrdup_or_null(getenv(INDEX_ENVIRONMENT));
        setenv(INDEX_ENVIRONMENT, the_repository->index_file, 1);
 
-       ret = !!run_add_p(the_repository, ADD_P_STASH, interactive_opts, NULL, ps);
+       ret = !!run_add_p(the_repository, ADD_P_STASH, interactive_opts, NULL, ps, 0);
 
        the_repository->index_file = old_repo_index_file;
        if (old_index_env && *old_index_env)