Skip to content

Commit 8371234

Browse files
spearceJunio C Hamano
authored andcommitted
Remove uncontested renamed files during merge.
Prior to 65ac6e9 we deleted a file from the working directory during a merge if the file existed before the merge started but was renamed by the branch being merged in. This broke in 65ac6e as git-merge-recursive did not actually update the working directory on an uncontested rename. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 1349f87 commit 8371234

File tree

2 files changed

+98
-1
lines changed

2 files changed

+98
-1
lines changed

merge-recursive.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -889,7 +889,7 @@ static int process_renames(struct path_list *a_renames,
889889
struct diff_filespec src_other, dst_other;
890890
int try_merge, stage = a_renames == renames1 ? 3: 2;
891891

892-
remove_file(1, ren1_src, 1);
892+
remove_file(1, ren1_src, index_only);
893893

894894
hashcpy(src_other.sha1, ren1->src_entry->stages[stage].sha);
895895
src_other.mode = ren1->src_entry->stages[stage].mode;

t/t6023-merge-rename-nocruft.sh

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#!/bin/sh
2+
3+
test_description='Merge-recursive merging renames'
4+
. ./test-lib.sh
5+
6+
test_expect_success setup \
7+
'
8+
cat >A <<\EOF &&
9+
a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
10+
b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
11+
c cccccccccccccccccccccccccccccccccccccccccccccccc
12+
d dddddddddddddddddddddddddddddddddddddddddddddddd
13+
e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
14+
f ffffffffffffffffffffffffffffffffffffffffffffffff
15+
g gggggggggggggggggggggggggggggggggggggggggggggggg
16+
h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
17+
i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
18+
j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
19+
k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
20+
l llllllllllllllllllllllllllllllllllllllllllllllll
21+
m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
22+
n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
23+
o oooooooooooooooooooooooooooooooooooooooooooooooo
24+
EOF
25+
26+
cat >M <<\EOF &&
27+
A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
28+
B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
29+
C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
30+
D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
31+
E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
32+
F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
33+
G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
34+
H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
35+
I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
36+
J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
37+
K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
38+
L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
39+
M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
40+
N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
41+
O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
42+
EOF
43+
44+
git add A M &&
45+
git commit -m "initial has A and M" &&
46+
git branch white &&
47+
git branch red &&
48+
49+
git checkout white &&
50+
sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
51+
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
52+
rm -f A M &&
53+
git update-index --add --remove A B M N &&
54+
git commit -m "white renames A->B, M->N" &&
55+
56+
git checkout red &&
57+
echo created by red >R &&
58+
git update-index --add R &&
59+
git commit -m "red creates R" &&
60+
61+
git checkout master'
62+
63+
# This test broke in 65ac6e9c3f47807cb603af07a6a9e1a43bc119ae
64+
test_expect_success 'merge white into red (A->B,M->N)' \
65+
'
66+
git checkout -b red-white red &&
67+
git merge white &&
68+
git write-tree >/dev/null || {
69+
echo "BAD: merge did not complete"
70+
return 1
71+
}
72+
73+
test -f B || {
74+
echo "BAD: B does not exist in working directory"
75+
return 1
76+
}
77+
test -f N || {
78+
echo "BAD: N does not exist in working directory"
79+
return 1
80+
}
81+
test -f R || {
82+
echo "BAD: R does not exist in working directory"
83+
return 1
84+
}
85+
86+
test -f A && {
87+
echo "BAD: A still exists in working directory"
88+
return 1
89+
}
90+
test -f M && {
91+
echo "BAD: M still exists in working directory"
92+
return 1
93+
}
94+
return 0
95+
'
96+
97+
test_done

0 commit comments

Comments
 (0)