summaryrefslogtreecommitdiff
path: root/apply.c
diff options
context:
space:
mode:
authorJerry Zhang <jerry@skydio.com>2021-04-08 02:13:44 (GMT)
committerJunio C Hamano <gitster@pobox.com>2021-04-08 05:20:33 (GMT)
commitc0c2a37ac2b9338c3a93340cbcbab69690da4df0 (patch)
tree246b559d28fd4d7b0c67b38a678bad683a93c59e /apply.c
parent923cd87ac8550a8e277bfeb19198a11b6a8ed854 (diff)
downloadgit-c0c2a37ac2b9338c3a93340cbcbab69690da4df0.zip
git-c0c2a37ac2b9338c3a93340cbcbab69690da4df0.tar.gz
git-c0c2a37ac2b9338c3a93340cbcbab69690da4df0.tar.bz2
git-apply: allow simultaneous --cached and --3way options
"git apply" does not allow "--cached" and "--3way" to be used together, since "--3way" writes conflict markers into the working tree. Allow "git apply" to accept "--cached" and "--3way" at the same time. When a single file auto-resolves cleanly, the result is placed in the index at stage #0 and the command exits with 0 status. For a file that has a conflict which cannot be cleanly auto-resolved, the original contents from common ancestor (stage conflict at the content level, and the command exists with non-zero status, because there is no place (like the working tree) to leave a half-resolved merge for the user to resolve. The user can use `git diff` to view the contents of the conflict, or `git checkout -m -- .` to regenerate the conflict markers in the working directory. Don't attempt rerere in this case since it depends on conflict markers written to file for its database storage and lookup. There would be two main changes required to get rerere working: 1. Allow the rerere api to accept in memory object rather than files, which would allow us to pass in the conflict markers contained in the result from ll_merge(). 2. Rerere can't write to the working directory, so it would have to apply the result to cache stage #0 directly. A flag would be needed to control this. Signed-off-by: Jerry Zhang <jerry@skydio.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'apply.c')
-rw-r--r--apply.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/apply.c b/apply.c
index 6919726..8c5b298 100644
--- a/apply.c
+++ b/apply.c
@@ -134,8 +134,6 @@ int check_apply_state(struct apply_state *state, int force_apply)
if (state->apply_with_reject && state->threeway)
return error(_("--reject and --3way cannot be used together."));
- if (state->cached && state->threeway)
- return error(_("--cached and --3way cannot be used together."));
if (state->threeway) {
if (is_not_gitdir)
return error(_("--3way outside a repository"));
@@ -4646,7 +4644,12 @@ static int write_out_results(struct apply_state *state, struct patch *list)
}
string_list_clear(&cpath, 0);
- repo_rerere(state->repo, 0);
+ /*
+ * rerere relies on the partially merged result being in the working
+ * tree with conflict markers, but that isn't written with --cached.
+ */
+ if (!state->cached)
+ repo_rerere(state->repo, 0);
}
return errs;