Merge branch 'pb/web'
[git] / t / t6022-merge-rename.sh
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 &&
46 git branch white &&
47 git branch red &&
48 git branch blue &&
49
50 sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&
51 mv A+ A &&
52 git commit -a -m "master updates A" &&
53
54 git checkout white &&
55 sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
56 sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
57 rm -f A M &&
58 git update-index --add --remove A B M N &&
59 git commit -m "white renames A->B, M->N" &&
60
61 git checkout red &&
62 sed -e "/^g /s/.*/g : red changes a line/" <A >B &&
63 sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
64 rm -f A M &&
65 git update-index --add --remove A B M N &&
66 git commit -m "red renames A->B, M->N" &&
67
68 git checkout blue &&
69 sed -e "/^g /s/.*/g : blue changes a line/" <A >C &&
70 sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
71 rm -f A M &&
72 git update-index --add --remove A C M N &&
73 git commit -m "blue renames A->C, M->N" &&
74
75 git checkout master'
76
77 test_expect_success 'pull renaming branch into unrenaming one' \
78 '
79         git show-branch
80         git pull . white && {
81                 echo "BAD: should have conflicted"
82                 exit 1
83         }
84         git ls-files -s
85         test "$(git ls-files -u B | wc -l)" -eq 3 || {
86                 echo "BAD: should have left stages for B"
87                 exit 1  
88         }
89         test "$(git ls-files -s N | wc -l)" -eq 1 || {
90                 echo "BAD: should have merged N"
91                 exit 1  
92         }
93         sed -ne "/^g/{
94         p
95         q
96         }" B | grep master || {
97                 echo "BAD: should have listed our change first"
98                 exit 1
99         }
100         test "$(git diff white N | wc -l)" -eq 0 || {
101                 echo "BAD: should have taken colored branch"
102                 exit 1
103         }
104 '
105
106 test_expect_success 'pull renaming branch into another renaming one' \
107 '
108         rm -f B
109         git reset --hard
110         git checkout red
111         git pull . white && {
112                 echo "BAD: should have conflicted"
113                 exit 1
114         }
115         test "$(git ls-files -u B | wc -l)" -eq 3 || {
116                 echo "BAD: should have left stages"
117                 exit 1  
118         }
119         test "$(git ls-files -s N | wc -l)" -eq 1 || {
120                 echo "BAD: should have merged N"
121                 exit 1  
122         }
123         sed -ne "/^g/{
124         p
125         q
126         }" B | grep red || {
127                 echo "BAD: should have listed our change first"
128                 exit 1
129         }
130         test "$(git diff white N | wc -l)" -eq 0 || {
131                 echo "BAD: should have taken colored branch"
132                 exit 1
133         }
134 '
135
136 test_expect_success 'pull unrenaming branch into renaming one' \
137 '
138         git reset --hard
139         git show-branch
140         git pull . master && {
141                 echo "BAD: should have conflicted"
142                 exit 1
143         }
144         test "$(git ls-files -u B | wc -l)" -eq 3 || {
145                 echo "BAD: should have left stages"
146                 exit 1  
147         }
148         test "$(git ls-files -s N | wc -l)" -eq 1 || {
149                 echo "BAD: should have merged N"
150                 exit 1  
151         }
152         sed -ne "/^g/{
153         p
154         q
155         }" B | grep red || {
156                 echo "BAD: should have listed our change first"
157                 exit 1
158         }
159         test "$(git diff white N | wc -l)" -eq 0 || {
160                 echo "BAD: should have taken colored branch"
161                 exit 1
162         }
163 '
164
165 test_expect_success 'pull conflicting renames' \
166 '
167         git reset --hard
168         git show-branch
169         git pull . blue && {
170                 echo "BAD: should have conflicted"
171                 exit 1
172         }
173         test "$(git ls-files -u A | wc -l)" -eq 1 || {
174                 echo "BAD: should have left a stage"
175                 exit 1  
176         }
177         test "$(git ls-files -u B | wc -l)" -eq 1 || {
178                 echo "BAD: should have left a stage"
179                 exit 1  
180         }
181         test "$(git ls-files -u C | wc -l)" -eq 1 || {
182                 echo "BAD: should have left a stage"
183                 exit 1  
184         }
185         test "$(git ls-files -s N | wc -l)" -eq 1 || {
186                 echo "BAD: should have merged N"
187                 exit 1  
188         }
189         sed -ne "/^g/{
190         p
191         q
192         }" B | grep red || {
193                 echo "BAD: should have listed our change first"
194                 exit 1
195         }
196         test "$(git diff white N | wc -l)" -eq 0 || {
197                 echo "BAD: should have taken colored branch"
198                 exit 1
199         }
200 '
201
202 test_done