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);
}
}
static int patch_update_file(struct add_p_state *s,
- struct file_diff *file_diff)
+ struct file_diff *file_diff,
+ unsigned flags)
{
size_t hunk_index = 0;
ssize_t i, undecided_previous, undecided_next, rendered_hunk_index = -1;
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");
}
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;
for (size_t i = 0; i < state->file_diff_nr; i++) {
if (state->file_diff[i].binary && !state->file_diff[i].hunk_nr)
binary_count++;
- else if (patch_update_file(state, state->file_diff + i))
+ else if (patch_update_file(state, state->file_diff + i, flags))
break;
}
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,
goto out;
}
- ret = run_add_p_common(&s, ps);
+ ret = run_add_p_common(&s, ps, flags);
if (ret < 0)
goto out;
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 },
interactive_config_init(&s.cfg, r, opts);
- ret = run_add_p_common(&s, ps);
+ ret = run_add_p_common(&s, ps, flags);
if (ret < 0)
goto out;
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
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);
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);
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)
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)