зеркало из https://github.com/microsoft/git.git
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:
Коммит
5a7e52bed2
|
@ -87,8 +87,10 @@ OPTIONS
|
|||
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
|
||||
conflict markers in the files in the working tree for the user to
|
||||
resolve. This option implies the `--index` option, and is incompatible
|
||||
with the `--reject` and the `--cached` options.
|
||||
resolve. This option implies the `--index` option unless the
|
||||
`--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>::
|
||||
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)
|
||||
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,6 +4644,11 @@ static int write_out_results(struct apply_state *state, struct patch *list)
|
|||
}
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -180,4 +180,54 @@ test_expect_success 'apply -3 with ambiguous repeating file' '
|
|||
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
|
||||
|
|
Загрузка…
Ссылка в новой задаче