зеркало из https://github.com/microsoft/git.git
Merge branch 'jk/two-way-merge-corner-case-fix' into maint
"git am --abort" sometimes complained about not being able to write a tree with an 0{40} object in it. * jk/two-way-merge-corner-case-fix: t1005: add test for "read-tree --reset -u A B" t1005: reindent unpack-trees: fix "read-tree -u --reset A B" with conflicted index
This commit is contained in:
Коммит
4766036ecd
|
@ -5,39 +5,39 @@
|
||||||
# write the index and that together with -u it doesn't touch the work tree.
|
# write the index and that together with -u it doesn't touch the work tree.
|
||||||
#
|
#
|
||||||
read_tree_must_succeed () {
|
read_tree_must_succeed () {
|
||||||
git ls-files -s >pre-dry-run &&
|
git ls-files -s >pre-dry-run &&
|
||||||
git read-tree -n "$@" &&
|
git read-tree -n "$@" &&
|
||||||
git ls-files -s >post-dry-run &&
|
git ls-files -s >post-dry-run &&
|
||||||
test_cmp pre-dry-run post-dry-run &&
|
test_cmp pre-dry-run post-dry-run &&
|
||||||
git read-tree "$@"
|
git read-tree "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
read_tree_must_fail () {
|
read_tree_must_fail () {
|
||||||
git ls-files -s >pre-dry-run &&
|
git ls-files -s >pre-dry-run &&
|
||||||
test_must_fail git read-tree -n "$@" &&
|
test_must_fail git read-tree -n "$@" &&
|
||||||
git ls-files -s >post-dry-run &&
|
git ls-files -s >post-dry-run &&
|
||||||
test_cmp pre-dry-run post-dry-run &&
|
test_cmp pre-dry-run post-dry-run &&
|
||||||
test_must_fail git read-tree "$@"
|
test_must_fail git read-tree "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
read_tree_u_must_succeed () {
|
read_tree_u_must_succeed () {
|
||||||
git ls-files -s >pre-dry-run &&
|
git ls-files -s >pre-dry-run &&
|
||||||
git diff-files -p >pre-dry-run-wt &&
|
git diff-files -p >pre-dry-run-wt &&
|
||||||
git read-tree -n "$@" &&
|
git read-tree -n "$@" &&
|
||||||
git ls-files -s >post-dry-run &&
|
git ls-files -s >post-dry-run &&
|
||||||
git diff-files -p >post-dry-run-wt &&
|
git diff-files -p >post-dry-run-wt &&
|
||||||
test_cmp pre-dry-run post-dry-run &&
|
test_cmp pre-dry-run post-dry-run &&
|
||||||
test_cmp pre-dry-run-wt post-dry-run-wt &&
|
test_cmp pre-dry-run-wt post-dry-run-wt &&
|
||||||
git read-tree "$@"
|
git read-tree "$@"
|
||||||
}
|
}
|
||||||
|
|
||||||
read_tree_u_must_fail () {
|
read_tree_u_must_fail () {
|
||||||
git ls-files -s >pre-dry-run &&
|
git ls-files -s >pre-dry-run &&
|
||||||
git diff-files -p >pre-dry-run-wt &&
|
git diff-files -p >pre-dry-run-wt &&
|
||||||
test_must_fail git read-tree -n "$@" &&
|
test_must_fail git read-tree -n "$@" &&
|
||||||
git ls-files -s >post-dry-run &&
|
git ls-files -s >post-dry-run &&
|
||||||
git diff-files -p >post-dry-run-wt &&
|
git diff-files -p >post-dry-run-wt &&
|
||||||
test_cmp pre-dry-run post-dry-run &&
|
test_cmp pre-dry-run post-dry-run &&
|
||||||
test_cmp pre-dry-run-wt post-dry-run-wt &&
|
test_cmp pre-dry-run-wt post-dry-run-wt &&
|
||||||
test_must_fail git read-tree "$@"
|
test_must_fail git read-tree "$@"
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,84 +8,99 @@ test_description='read-tree -u --reset'
|
||||||
# two-tree test
|
# two-tree test
|
||||||
|
|
||||||
test_expect_success 'setup' '
|
test_expect_success 'setup' '
|
||||||
git init &&
|
git init &&
|
||||||
mkdir df &&
|
mkdir df &&
|
||||||
echo content >df/file &&
|
echo content >df/file &&
|
||||||
git add df/file &&
|
git add df/file &&
|
||||||
git commit -m one &&
|
git commit -m one &&
|
||||||
git ls-files >expect &&
|
git ls-files >expect &&
|
||||||
rm -rf df &&
|
rm -rf df &&
|
||||||
echo content >df &&
|
echo content >df &&
|
||||||
git add df &&
|
git add df &&
|
||||||
echo content >new &&
|
echo content >new &&
|
||||||
git add new &&
|
git add new &&
|
||||||
git commit -m two
|
git commit -m two
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'reset should work' '
|
test_expect_success 'reset should work' '
|
||||||
read_tree_u_must_succeed -u --reset HEAD^ &&
|
read_tree_u_must_succeed -u --reset HEAD^ &&
|
||||||
git ls-files >actual &&
|
git ls-files >actual &&
|
||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'reset should remove remnants from a failed merge' '
|
test_expect_success 'reset should remove remnants from a failed merge' '
|
||||||
read_tree_u_must_succeed --reset -u HEAD &&
|
read_tree_u_must_succeed --reset -u HEAD &&
|
||||||
git ls-files -s >expect &&
|
git ls-files -s >expect &&
|
||||||
sha1=$(git rev-parse :new) &&
|
sha1=$(git rev-parse :new) &&
|
||||||
(
|
(
|
||||||
echo "100644 $sha1 1 old"
|
echo "100644 $sha1 1 old"
|
||||||
echo "100644 $sha1 3 old"
|
echo "100644 $sha1 3 old"
|
||||||
) | git update-index --index-info &&
|
) | git update-index --index-info &&
|
||||||
>old &&
|
>old &&
|
||||||
git ls-files -s &&
|
git ls-files -s &&
|
||||||
read_tree_u_must_succeed --reset -u HEAD &&
|
read_tree_u_must_succeed --reset -u HEAD &&
|
||||||
git ls-files -s >actual &&
|
git ls-files -s >actual &&
|
||||||
! test -f old
|
! test -f old
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'two-way reset should remove remnants too' '
|
||||||
|
read_tree_u_must_succeed --reset -u HEAD &&
|
||||||
|
git ls-files -s >expect &&
|
||||||
|
sha1=$(git rev-parse :new) &&
|
||||||
|
(
|
||||||
|
echo "100644 $sha1 1 old"
|
||||||
|
echo "100644 $sha1 3 old"
|
||||||
|
) | git update-index --index-info &&
|
||||||
|
>old &&
|
||||||
|
git ls-files -s &&
|
||||||
|
read_tree_u_must_succeed --reset -u HEAD HEAD &&
|
||||||
|
git ls-files -s >actual &&
|
||||||
|
! test -f old
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'Porcelain reset should remove remnants too' '
|
test_expect_success 'Porcelain reset should remove remnants too' '
|
||||||
read_tree_u_must_succeed --reset -u HEAD &&
|
read_tree_u_must_succeed --reset -u HEAD &&
|
||||||
git ls-files -s >expect &&
|
git ls-files -s >expect &&
|
||||||
sha1=$(git rev-parse :new) &&
|
sha1=$(git rev-parse :new) &&
|
||||||
(
|
(
|
||||||
echo "100644 $sha1 1 old"
|
echo "100644 $sha1 1 old"
|
||||||
echo "100644 $sha1 3 old"
|
echo "100644 $sha1 3 old"
|
||||||
) | git update-index --index-info &&
|
) | git update-index --index-info &&
|
||||||
>old &&
|
>old &&
|
||||||
git ls-files -s &&
|
git ls-files -s &&
|
||||||
git reset --hard &&
|
git reset --hard &&
|
||||||
git ls-files -s >actual &&
|
git ls-files -s >actual &&
|
||||||
! test -f old
|
! test -f old
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'Porcelain checkout -f should remove remnants too' '
|
test_expect_success 'Porcelain checkout -f should remove remnants too' '
|
||||||
read_tree_u_must_succeed --reset -u HEAD &&
|
read_tree_u_must_succeed --reset -u HEAD &&
|
||||||
git ls-files -s >expect &&
|
git ls-files -s >expect &&
|
||||||
sha1=$(git rev-parse :new) &&
|
sha1=$(git rev-parse :new) &&
|
||||||
(
|
(
|
||||||
echo "100644 $sha1 1 old"
|
echo "100644 $sha1 1 old"
|
||||||
echo "100644 $sha1 3 old"
|
echo "100644 $sha1 3 old"
|
||||||
) | git update-index --index-info &&
|
) | git update-index --index-info &&
|
||||||
>old &&
|
>old &&
|
||||||
git ls-files -s &&
|
git ls-files -s &&
|
||||||
git checkout -f &&
|
git checkout -f &&
|
||||||
git ls-files -s >actual &&
|
git ls-files -s >actual &&
|
||||||
! test -f old
|
! test -f old
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'Porcelain checkout -f HEAD should remove remnants too' '
|
test_expect_success 'Porcelain checkout -f HEAD should remove remnants too' '
|
||||||
read_tree_u_must_succeed --reset -u HEAD &&
|
read_tree_u_must_succeed --reset -u HEAD &&
|
||||||
git ls-files -s >expect &&
|
git ls-files -s >expect &&
|
||||||
sha1=$(git rev-parse :new) &&
|
sha1=$(git rev-parse :new) &&
|
||||||
(
|
(
|
||||||
echo "100644 $sha1 1 old"
|
echo "100644 $sha1 1 old"
|
||||||
echo "100644 $sha1 3 old"
|
echo "100644 $sha1 3 old"
|
||||||
) | git update-index --index-info &&
|
) | git update-index --index-info &&
|
||||||
>old &&
|
>old &&
|
||||||
git ls-files -s &&
|
git ls-files -s &&
|
||||||
git checkout -f HEAD &&
|
git checkout -f HEAD &&
|
||||||
git ls-files -s >actual &&
|
git ls-files -s >actual &&
|
||||||
! test -f old
|
! test -f old
|
||||||
'
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
|
@ -1763,14 +1763,23 @@ int twoway_merge(const struct cache_entry * const *src,
|
||||||
newtree = NULL;
|
newtree = NULL;
|
||||||
|
|
||||||
if (current) {
|
if (current) {
|
||||||
if ((!oldtree && !newtree) || /* 4 and 5 */
|
if (current->ce_flags & CE_CONFLICTED) {
|
||||||
(!oldtree && newtree &&
|
if (same(oldtree, newtree) || o->reset) {
|
||||||
same(current, newtree)) || /* 6 and 7 */
|
if (!newtree)
|
||||||
(oldtree && newtree &&
|
return deleted_entry(current, current, o);
|
||||||
same(oldtree, newtree)) || /* 14 and 15 */
|
else
|
||||||
(oldtree && newtree &&
|
return merged_entry(newtree, current, o);
|
||||||
!same(oldtree, newtree) && /* 18 and 19 */
|
}
|
||||||
same(current, newtree))) {
|
return o->gently ? -1 : reject_merge(current, o);
|
||||||
|
}
|
||||||
|
else if ((!oldtree && !newtree) || /* 4 and 5 */
|
||||||
|
(!oldtree && newtree &&
|
||||||
|
same(current, newtree)) || /* 6 and 7 */
|
||||||
|
(oldtree && newtree &&
|
||||||
|
same(oldtree, newtree)) || /* 14 and 15 */
|
||||||
|
(oldtree && newtree &&
|
||||||
|
!same(oldtree, newtree) && /* 18 and 19 */
|
||||||
|
same(current, newtree))) {
|
||||||
return keep_entry(current, o);
|
return keep_entry(current, o);
|
||||||
}
|
}
|
||||||
else if (oldtree && !newtree && same(current, oldtree)) {
|
else if (oldtree && !newtree && same(current, oldtree)) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче