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:
Junio C Hamano 2013-12-17 11:32:04 -08:00
Родитель 66c24cd8a4 77b43cac9f
Коммит 4766036ecd
3 изменённых файлов: 121 добавлений и 97 удалений

Просмотреть файл

@ -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)) {