Skip to content

Commit 4766036

Browse files
committed
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
2 parents 66c24cd + 77b43ca commit 4766036

File tree

3 files changed

+121
-97
lines changed

3 files changed

+121
-97
lines changed

t/lib-read-tree.sh

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,39 @@
55
# write the index and that together with -u it doesn't touch the work tree.
66
#
77
read_tree_must_succeed () {
8-
git ls-files -s >pre-dry-run &&
9-
git read-tree -n "$@" &&
10-
git ls-files -s >post-dry-run &&
11-
test_cmp pre-dry-run post-dry-run &&
12-
git read-tree "$@"
8+
git ls-files -s >pre-dry-run &&
9+
git read-tree -n "$@" &&
10+
git ls-files -s >post-dry-run &&
11+
test_cmp pre-dry-run post-dry-run &&
12+
git read-tree "$@"
1313
}
1414

1515
read_tree_must_fail () {
16-
git ls-files -s >pre-dry-run &&
17-
test_must_fail git read-tree -n "$@" &&
18-
git ls-files -s >post-dry-run &&
19-
test_cmp pre-dry-run post-dry-run &&
20-
test_must_fail git read-tree "$@"
16+
git ls-files -s >pre-dry-run &&
17+
test_must_fail git read-tree -n "$@" &&
18+
git ls-files -s >post-dry-run &&
19+
test_cmp pre-dry-run post-dry-run &&
20+
test_must_fail git read-tree "$@"
2121
}
2222

2323
read_tree_u_must_succeed () {
24-
git ls-files -s >pre-dry-run &&
25-
git diff-files -p >pre-dry-run-wt &&
26-
git read-tree -n "$@" &&
27-
git ls-files -s >post-dry-run &&
28-
git diff-files -p >post-dry-run-wt &&
29-
test_cmp pre-dry-run post-dry-run &&
30-
test_cmp pre-dry-run-wt post-dry-run-wt &&
31-
git read-tree "$@"
24+
git ls-files -s >pre-dry-run &&
25+
git diff-files -p >pre-dry-run-wt &&
26+
git read-tree -n "$@" &&
27+
git ls-files -s >post-dry-run &&
28+
git diff-files -p >post-dry-run-wt &&
29+
test_cmp pre-dry-run post-dry-run &&
30+
test_cmp pre-dry-run-wt post-dry-run-wt &&
31+
git read-tree "$@"
3232
}
3333

3434
read_tree_u_must_fail () {
35-
git ls-files -s >pre-dry-run &&
36-
git diff-files -p >pre-dry-run-wt &&
37-
test_must_fail git read-tree -n "$@" &&
38-
git ls-files -s >post-dry-run &&
39-
git diff-files -p >post-dry-run-wt &&
40-
test_cmp pre-dry-run post-dry-run &&
41-
test_cmp pre-dry-run-wt post-dry-run-wt &&
42-
test_must_fail git read-tree "$@"
35+
git ls-files -s >pre-dry-run &&
36+
git diff-files -p >pre-dry-run-wt &&
37+
test_must_fail git read-tree -n "$@" &&
38+
git ls-files -s >post-dry-run &&
39+
git diff-files -p >post-dry-run-wt &&
40+
test_cmp pre-dry-run post-dry-run &&
41+
test_cmp pre-dry-run-wt post-dry-run-wt &&
42+
test_must_fail git read-tree "$@"
4343
}

t/t1005-read-tree-reset.sh

Lines changed: 78 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -8,84 +8,99 @@ test_description='read-tree -u --reset'
88
# two-tree test
99

1010
test_expect_success 'setup' '
11-
git init &&
12-
mkdir df &&
13-
echo content >df/file &&
14-
git add df/file &&
15-
git commit -m one &&
16-
git ls-files >expect &&
17-
rm -rf df &&
18-
echo content >df &&
19-
git add df &&
20-
echo content >new &&
21-
git add new &&
22-
git commit -m two
11+
git init &&
12+
mkdir df &&
13+
echo content >df/file &&
14+
git add df/file &&
15+
git commit -m one &&
16+
git ls-files >expect &&
17+
rm -rf df &&
18+
echo content >df &&
19+
git add df &&
20+
echo content >new &&
21+
git add new &&
22+
git commit -m two
2323
'
2424

2525
test_expect_success 'reset should work' '
26-
read_tree_u_must_succeed -u --reset HEAD^ &&
27-
git ls-files >actual &&
28-
test_cmp expect actual
26+
read_tree_u_must_succeed -u --reset HEAD^ &&
27+
git ls-files >actual &&
28+
test_cmp expect actual
2929
'
3030

3131
test_expect_success 'reset should remove remnants from a failed merge' '
32-
read_tree_u_must_succeed --reset -u HEAD &&
33-
git ls-files -s >expect &&
34-
sha1=$(git rev-parse :new) &&
35-
(
36-
echo "100644 $sha1 1 old"
37-
echo "100644 $sha1 3 old"
38-
) | git update-index --index-info &&
39-
>old &&
40-
git ls-files -s &&
41-
read_tree_u_must_succeed --reset -u HEAD &&
42-
git ls-files -s >actual &&
43-
! test -f old
32+
read_tree_u_must_succeed --reset -u HEAD &&
33+
git ls-files -s >expect &&
34+
sha1=$(git rev-parse :new) &&
35+
(
36+
echo "100644 $sha1 1 old"
37+
echo "100644 $sha1 3 old"
38+
) | git update-index --index-info &&
39+
>old &&
40+
git ls-files -s &&
41+
read_tree_u_must_succeed --reset -u HEAD &&
42+
git ls-files -s >actual &&
43+
! test -f old
44+
'
45+
46+
test_expect_success 'two-way reset should remove remnants too' '
47+
read_tree_u_must_succeed --reset -u HEAD &&
48+
git ls-files -s >expect &&
49+
sha1=$(git rev-parse :new) &&
50+
(
51+
echo "100644 $sha1 1 old"
52+
echo "100644 $sha1 3 old"
53+
) | git update-index --index-info &&
54+
>old &&
55+
git ls-files -s &&
56+
read_tree_u_must_succeed --reset -u HEAD HEAD &&
57+
git ls-files -s >actual &&
58+
! test -f old
4459
'
4560

4661
test_expect_success 'Porcelain reset should remove remnants too' '
47-
read_tree_u_must_succeed --reset -u HEAD &&
48-
git ls-files -s >expect &&
49-
sha1=$(git rev-parse :new) &&
50-
(
51-
echo "100644 $sha1 1 old"
52-
echo "100644 $sha1 3 old"
53-
) | git update-index --index-info &&
54-
>old &&
55-
git ls-files -s &&
56-
git reset --hard &&
57-
git ls-files -s >actual &&
58-
! test -f old
62+
read_tree_u_must_succeed --reset -u HEAD &&
63+
git ls-files -s >expect &&
64+
sha1=$(git rev-parse :new) &&
65+
(
66+
echo "100644 $sha1 1 old"
67+
echo "100644 $sha1 3 old"
68+
) | git update-index --index-info &&
69+
>old &&
70+
git ls-files -s &&
71+
git reset --hard &&
72+
git ls-files -s >actual &&
73+
! test -f old
5974
'
6075

6176
test_expect_success 'Porcelain checkout -f should remove remnants too' '
62-
read_tree_u_must_succeed --reset -u HEAD &&
63-
git ls-files -s >expect &&
64-
sha1=$(git rev-parse :new) &&
65-
(
66-
echo "100644 $sha1 1 old"
67-
echo "100644 $sha1 3 old"
68-
) | git update-index --index-info &&
69-
>old &&
70-
git ls-files -s &&
71-
git checkout -f &&
72-
git ls-files -s >actual &&
73-
! test -f old
77+
read_tree_u_must_succeed --reset -u HEAD &&
78+
git ls-files -s >expect &&
79+
sha1=$(git rev-parse :new) &&
80+
(
81+
echo "100644 $sha1 1 old"
82+
echo "100644 $sha1 3 old"
83+
) | git update-index --index-info &&
84+
>old &&
85+
git ls-files -s &&
86+
git checkout -f &&
87+
git ls-files -s >actual &&
88+
! test -f old
7489
'
7590

7691
test_expect_success 'Porcelain checkout -f HEAD should remove remnants too' '
77-
read_tree_u_must_succeed --reset -u HEAD &&
78-
git ls-files -s >expect &&
79-
sha1=$(git rev-parse :new) &&
80-
(
81-
echo "100644 $sha1 1 old"
82-
echo "100644 $sha1 3 old"
83-
) | git update-index --index-info &&
84-
>old &&
85-
git ls-files -s &&
86-
git checkout -f HEAD &&
87-
git ls-files -s >actual &&
88-
! test -f old
92+
read_tree_u_must_succeed --reset -u HEAD &&
93+
git ls-files -s >expect &&
94+
sha1=$(git rev-parse :new) &&
95+
(
96+
echo "100644 $sha1 1 old"
97+
echo "100644 $sha1 3 old"
98+
) | git update-index --index-info &&
99+
>old &&
100+
git ls-files -s &&
101+
git checkout -f HEAD &&
102+
git ls-files -s >actual &&
103+
! test -f old
89104
'
90105

91106
test_done

unpack-trees.c

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,14 +1763,23 @@ int twoway_merge(const struct cache_entry * const *src,
17631763
newtree = NULL;
17641764

17651765
if (current) {
1766-
if ((!oldtree && !newtree) || /* 4 and 5 */
1767-
(!oldtree && newtree &&
1768-
same(current, newtree)) || /* 6 and 7 */
1769-
(oldtree && newtree &&
1770-
same(oldtree, newtree)) || /* 14 and 15 */
1771-
(oldtree && newtree &&
1772-
!same(oldtree, newtree) && /* 18 and 19 */
1773-
same(current, newtree))) {
1766+
if (current->ce_flags & CE_CONFLICTED) {
1767+
if (same(oldtree, newtree) || o->reset) {
1768+
if (!newtree)
1769+
return deleted_entry(current, current, o);
1770+
else
1771+
return merged_entry(newtree, current, o);
1772+
}
1773+
return o->gently ? -1 : reject_merge(current, o);
1774+
}
1775+
else if ((!oldtree && !newtree) || /* 4 and 5 */
1776+
(!oldtree && newtree &&
1777+
same(current, newtree)) || /* 6 and 7 */
1778+
(oldtree && newtree &&
1779+
same(oldtree, newtree)) || /* 14 and 15 */
1780+
(oldtree && newtree &&
1781+
!same(oldtree, newtree) && /* 18 and 19 */
1782+
same(current, newtree))) {
17741783
return keep_entry(current, o);
17751784
}
17761785
else if (oldtree && !newtree && same(current, oldtree)) {

0 commit comments

Comments
 (0)