Optionally work without python
[git.git] / t / t6022-merge-rename.sh
1 #!/bin/sh
2
3 test_description='Merge-recursive merging renames'
4 . ./test-lib.sh
5
6 if test "$no_python"; then
7         echo "Skipping: no python => no recursive merge"
8         test_done
9         exit 0
10 fi
11
12 test_expect_success setup \
13 '
14 cat >A <<\EOF &&
15 a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
16 b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
17 c cccccccccccccccccccccccccccccccccccccccccccccccc
18 d dddddddddddddddddddddddddddddddddddddddddddddddd
19 e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
20 f ffffffffffffffffffffffffffffffffffffffffffffffff
21 g gggggggggggggggggggggggggggggggggggggggggggggggg
22 h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
23 i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
24 j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
25 k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
26 l llllllllllllllllllllllllllllllllllllllllllllllll
27 m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
28 n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
29 o oooooooooooooooooooooooooooooooooooooooooooooooo
30 EOF
31
32 cat >M <<\EOF &&
33 A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
34 B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
35 C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
36 D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
37 E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
38 F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
39 G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
40 H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
41 I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
42 J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
43 K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
44 L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
45 M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
46 N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
47 O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
48 EOF
49
50 git add A M &&
51 git commit -m initial &&
52 git branch white &&
53 git branch red &&
54 git branch blue &&
55
56 sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&
57 mv A+ A &&
58 git commit -a -m "master updates A" &&
59
60 git checkout white &&
61 sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
62 sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
63 rm -f A M &&
64 git update-index --add --remove A B M N &&
65 git commit -m "white renames A->B, M->N" &&
66
67 git checkout red &&
68 sed -e "/^g /s/.*/g : red changes a line/" <A >B &&
69 sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
70 rm -f A M &&
71 git update-index --add --remove A B M N &&
72 git commit -m "red renames A->B, M->N" &&
73
74 git checkout blue &&
75 sed -e "/^g /s/.*/g : blue changes a line/" <A >C &&
76 sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
77 rm -f A M &&
78 git update-index --add --remove A C M N &&
79 git commit -m "blue renames A->C, M->N" &&
80
81 git checkout master'
82
83 test_expect_success 'pull renaming branch into unrenaming one' \
84 '
85         git show-branch
86         git pull . white && {
87                 echo "BAD: should have conflicted"
88                 exit 1
89         }
90         git ls-files -s
91         test "$(git ls-files -u B | wc -l)" -eq 3 || {
92                 echo "BAD: should have left stages for B"
93                 exit 1  
94         }
95         test "$(git ls-files -s N | wc -l)" -eq 1 || {
96                 echo "BAD: should have merged N"
97                 exit 1  
98         }
99         sed -ne "/^g/{
100         p
101         q
102         }" B | grep master || {
103                 echo "BAD: should have listed our change first"
104                 exit 1
105         }
106         test "$(git diff white N | wc -l)" -eq 0 || {
107                 echo "BAD: should have taken colored branch"
108                 exit 1
109         }
110 '
111
112 test_expect_success 'pull renaming branch into another renaming one' \
113 '
114         git reset --hard
115         git checkout red
116         git pull . white && {
117                 echo "BAD: should have conflicted"
118                 exit 1
119         }
120         test "$(git ls-files -u B | wc -l)" -eq 3 || {
121                 echo "BAD: should have left stages"
122                 exit 1  
123         }
124         test "$(git ls-files -s N | wc -l)" -eq 1 || {
125                 echo "BAD: should have merged N"
126                 exit 1  
127         }
128         sed -ne "/^g/{
129         p
130         q
131         }" B | grep red || {
132                 echo "BAD: should have listed our change first"
133                 exit 1
134         }
135         test "$(git diff white N | wc -l)" -eq 0 || {
136                 echo "BAD: should have taken colored branch"
137                 exit 1
138         }
139 '
140
141 test_expect_success 'pull unrenaming branch into renaming one' \
142 '
143         git reset --hard
144         git show-branch
145         git pull . master && {
146                 echo "BAD: should have conflicted"
147                 exit 1
148         }
149         test "$(git ls-files -u B | wc -l)" -eq 3 || {
150                 echo "BAD: should have left stages"
151                 exit 1  
152         }
153         test "$(git ls-files -s N | wc -l)" -eq 1 || {
154                 echo "BAD: should have merged N"
155                 exit 1  
156         }
157         sed -ne "/^g/{
158         p
159         q
160         }" B | grep red || {
161                 echo "BAD: should have listed our change first"
162                 exit 1
163         }
164         test "$(git diff white N | wc -l)" -eq 0 || {
165                 echo "BAD: should have taken colored branch"
166                 exit 1
167         }
168 '
169
170 test_expect_success 'pull conflicting renames' \
171 '
172         git reset --hard
173         git show-branch
174         git pull . blue && {
175                 echo "BAD: should have conflicted"
176                 exit 1
177         }
178         test "$(git ls-files -u A | wc -l)" -eq 1 || {
179                 echo "BAD: should have left a stage"
180                 exit 1  
181         }
182         test "$(git ls-files -u B | wc -l)" -eq 1 || {
183                 echo "BAD: should have left a stage"
184                 exit 1  
185         }
186         test "$(git ls-files -u C | wc -l)" -eq 1 || {
187                 echo "BAD: should have left a stage"
188                 exit 1  
189         }
190         test "$(git ls-files -s N | wc -l)" -eq 1 || {
191                 echo "BAD: should have merged N"
192                 exit 1  
193         }
194         sed -ne "/^g/{
195         p
196         q
197         }" B | grep red || {
198                 echo "BAD: should have listed our change first"
199                 exit 1
200         }
201         test "$(git diff white N | wc -l)" -eq 0 || {
202                 echo "BAD: should have taken colored branch"
203                 exit 1
204         }
205 '
206
207 test_done