Merge branch 'jz/apply-3way-cached'
"git apply" now takes "--3way" and "--cached" at the same time, and work and record results only in the index. * jz/apply-3way-cached: git-apply: allow simultaneous --cached and --3way options
This commit is contained in:
commit
5a7e52bed2
@ -87,8 +87,10 @@ OPTIONS
|
|||||||
Attempt 3-way merge if the patch records the identity of blobs it is supposed
|
Attempt 3-way merge if the patch records the identity of blobs it is supposed
|
||||||
to apply to and we have those blobs available locally, possibly leaving the
|
to apply to and we have those blobs available locally, possibly leaving the
|
||||||
conflict markers in the files in the working tree for the user to
|
conflict markers in the files in the working tree for the user to
|
||||||
resolve. This option implies the `--index` option, and is incompatible
|
resolve. This option implies the `--index` option unless the
|
||||||
with the `--reject` and the `--cached` options.
|
`--cached` option is used, and is incompatible with the `--reject` option.
|
||||||
|
When used with the `--cached` option, any conflicts are left at higher stages
|
||||||
|
in the cache.
|
||||||
|
|
||||||
--build-fake-ancestor=<file>::
|
--build-fake-ancestor=<file>::
|
||||||
Newer 'git diff' output has embedded 'index information'
|
Newer 'git diff' output has embedded 'index information'
|
||||||
|
7
apply.c
7
apply.c
@ -134,8 +134,6 @@ int check_apply_state(struct apply_state *state, int force_apply)
|
|||||||
|
|
||||||
if (state->apply_with_reject && state->threeway)
|
if (state->apply_with_reject && state->threeway)
|
||||||
return error(_("--reject and --3way cannot be used together."));
|
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 (state->threeway) {
|
||||||
if (is_not_gitdir)
|
if (is_not_gitdir)
|
||||||
return error(_("--3way outside a repository"));
|
return error(_("--3way outside a repository"));
|
||||||
@ -4646,6 +4644,11 @@ static int write_out_results(struct apply_state *state, struct patch *list)
|
|||||||
}
|
}
|
||||||
string_list_clear(&cpath, 0);
|
string_list_clear(&cpath, 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);
|
repo_rerere(state->repo, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,4 +180,54 @@ test_expect_success 'apply -3 with ambiguous repeating file' '
|
|||||||
test_cmp expect one_two_repeat
|
test_cmp expect one_two_repeat
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'apply with --3way --cached clean apply' '
|
||||||
|
# Merging side should be similar to applying this patch
|
||||||
|
git diff ...side >P.diff &&
|
||||||
|
|
||||||
|
# The corresponding cleanly applied merge
|
||||||
|
git reset --hard &&
|
||||||
|
git checkout main~ &&
|
||||||
|
git merge --no-commit side &&
|
||||||
|
git ls-files -s >expect.ls &&
|
||||||
|
|
||||||
|
# should succeed
|
||||||
|
git reset --hard &&
|
||||||
|
git checkout main~ &&
|
||||||
|
git apply --cached --3way P.diff &&
|
||||||
|
git ls-files -s >actual.ls &&
|
||||||
|
print_sanitized_conflicted_diff >actual.diff &&
|
||||||
|
|
||||||
|
# The cache should resemble the corresponding merge
|
||||||
|
# (both files at stage #0)
|
||||||
|
test_cmp expect.ls actual.ls &&
|
||||||
|
# However the working directory should not change
|
||||||
|
>expect.diff &&
|
||||||
|
test_cmp expect.diff actual.diff
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'apply with --3way --cached and conflicts' '
|
||||||
|
# Merging side should be similar to applying this patch
|
||||||
|
git diff ...side >P.diff &&
|
||||||
|
|
||||||
|
# The corresponding conflicted merge
|
||||||
|
git reset --hard &&
|
||||||
|
git checkout main^0 &&
|
||||||
|
test_must_fail git merge --no-commit side &&
|
||||||
|
git ls-files -s >expect.ls &&
|
||||||
|
|
||||||
|
# should fail to apply
|
||||||
|
git reset --hard &&
|
||||||
|
git checkout main^0 &&
|
||||||
|
test_must_fail git apply --cached --3way P.diff &&
|
||||||
|
git ls-files -s >actual.ls &&
|
||||||
|
print_sanitized_conflicted_diff >actual.diff &&
|
||||||
|
|
||||||
|
# The cache should resemble the corresponding merge
|
||||||
|
# (one file at stage #0, one file at stages #1 #2 #3)
|
||||||
|
test_cmp expect.ls actual.ls &&
|
||||||
|
# However the working directory should not change
|
||||||
|
>expect.diff &&
|
||||||
|
test_cmp expect.diff actual.diff
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user