Merge branch 'js/icase-wt-detection'
[git] / t / t9814-git-p4-rename.sh
1 #!/bin/sh
2
3 test_description='git p4 rename'
4
5 . ./lib-git-p4.sh
6
7 test_expect_success 'start p4d' '
8         start_p4d
9 '
10
11 # We rely on this behavior to detect for p4 move availability.
12 test_expect_success 'p4 help unknown returns 1' '
13         (
14                 cd "$cli" &&
15                 (
16                         p4 help client >errs 2>&1
17                         echo $? >retval
18                 )
19                 echo 0 >expected &&
20                 test_cmp expected retval &&
21                 rm retval &&
22                 (
23                         p4 help nosuchcommand >errs 2>&1
24                         echo $? >retval
25                 )
26                 echo 1 >expected &&
27                 test_cmp expected retval &&
28                 rm retval
29         )
30 '
31
32 test_expect_success 'create files' '
33         (
34                 cd "$cli" &&
35                 p4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i &&
36                 cat >file1 <<-EOF &&
37                 A large block of text
38                 in file1 that will generate
39                 enough context so that rename
40                 and copy detection will find
41                 something interesting to do.
42                 EOF
43                 cat >file2 <<-EOF &&
44                 /*
45                  * This blob looks a bit
46                  * different.
47                  */
48                 int main(int argc, char **argv)
49                 {
50                         char text[200];
51
52                         strcpy(text, "copy/rename this");
53                         printf("text is %s\n", text);
54                         return 0;
55                 }
56                 EOF
57                 p4 add file1 file2 &&
58                 p4 submit -d "add files"
59         )
60 '
61
62 # Rename a file and confirm that rename is not detected in P4.
63 # Rename the new file again with detectRenames option enabled and confirm that
64 # this is detected in P4.
65 # Rename the new file again adding an extra line, configure a big threshold in
66 # detectRenames and confirm that rename is not detected in P4.
67 # Repeat, this time with a smaller threshold and confirm that the rename is
68 # detected in P4.
69 test_expect_success 'detect renames' '
70         git p4 clone --dest="$git" //depot@all &&
71         test_when_finished cleanup_git &&
72         (
73                 cd "$git" &&
74                 git config git-p4.skipSubmitEdit true &&
75
76                 git mv file1 file4 &&
77                 git commit -a -m "Rename file1 to file4" &&
78                 git diff-tree -r -M HEAD &&
79                 git p4 submit &&
80                 p4 filelog //depot/file4 >filelog &&
81                 ! grep " from //depot" filelog &&
82
83                 git mv file4 file5 &&
84                 git commit -a -m "Rename file4 to file5" &&
85                 git diff-tree -r -M HEAD &&
86                 git config git-p4.detectRenames true &&
87                 git p4 submit &&
88                 p4 filelog //depot/file5 >filelog &&
89                 grep " from //depot/file4" filelog &&
90
91                 git mv file5 file6 &&
92                 echo update >>file6 &&
93                 git add file6 &&
94                 git commit -a -m "Rename file5 to file6 with changes" &&
95                 git diff-tree -r -M HEAD &&
96                 level=$(git diff-tree -r -M HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/R0*//") &&
97                 test -n "$level" && test "$level" -gt 0 && test "$level" -lt 98 &&
98                 git config git-p4.detectRenames $(($level + 2)) &&
99                 git p4 submit &&
100                 p4 filelog //depot/file6 >filelog &&
101                 ! grep " from //depot" filelog &&
102
103                 git mv file6 file7 &&
104                 echo update >>file7 &&
105                 git add file7 &&
106                 git commit -a -m "Rename file6 to file7 with changes" &&
107                 git diff-tree -r -M HEAD &&
108                 level=$(git diff-tree -r -M HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/R0*//") &&
109                 test -n "$level" && test "$level" -gt 2 && test "$level" -lt 100 &&
110                 git config git-p4.detectRenames $(($level - 2)) &&
111                 git p4 submit &&
112                 p4 filelog //depot/file7 >filelog &&
113                 grep " from //depot/file6" filelog
114         )
115 '
116
117 # Copy a file and confirm that copy is not detected in P4.
118 # Copy a file with detectCopies option enabled and confirm that copy is not
119 # detected in P4.
120 # Modify and copy a file with detectCopies option enabled and confirm that copy
121 # is detected in P4.
122 # Copy a file with detectCopies and detectCopiesHarder options enabled and
123 # confirm that copy is detected in P4.
124 # Modify and copy a file, configure a bigger threshold in detectCopies and
125 # confirm that copy is not detected in P4.
126 # Modify and copy a file, configure a smaller threshold in detectCopies and
127 # confirm that copy is detected in P4.
128 test_expect_success 'detect copies' '
129         git p4 clone --dest="$git" //depot@all &&
130         test_when_finished cleanup_git &&
131         (
132                 cd "$git" &&
133                 git config git-p4.skipSubmitEdit true &&
134
135                 echo "file8" >>file2 &&
136                 git commit -a -m "Differentiate file2" &&
137                 git p4 submit &&
138                 cp file2 file8 &&
139                 git add file8 &&
140                 git commit -a -m "Copy file2 to file8" &&
141                 git diff-tree -r -C HEAD &&
142                 git p4 submit &&
143                 p4 filelog //depot/file8 &&
144                 p4 filelog //depot/file8 | test_must_fail grep -q "branch from" &&
145
146                 echo "file9" >>file2 &&
147                 git commit -a -m "Differentiate file2" &&
148                 git p4 submit &&
149
150                 cp file2 file9 &&
151                 git add file9 &&
152                 git commit -a -m "Copy file2 to file9" &&
153                 git diff-tree -r -C HEAD &&
154                 git config git-p4.detectCopies true &&
155                 git p4 submit &&
156                 p4 filelog //depot/file9 &&
157                 p4 filelog //depot/file9 | test_must_fail grep -q "branch from" &&
158
159                 echo "file10" >>file2 &&
160                 git commit -a -m "Differentiate file2" &&
161                 git p4 submit &&
162
163                 echo "file2" >>file2 &&
164                 cp file2 file10 &&
165                 git add file2 file10 &&
166                 git commit -a -m "Modify and copy file2 to file10" &&
167                 git diff-tree -r -C HEAD &&
168                 src=$(git diff-tree -r -C HEAD | sed 1d | sed 2d | cut -f2) &&
169                 test "$src" = file2 &&
170                 git p4 submit &&
171                 p4 filelog //depot/file10 &&
172                 p4 filelog //depot/file10 | grep -q "branch from //depot/file2" &&
173
174                 echo "file11" >>file2 &&
175                 git commit -a -m "Differentiate file2" &&
176                 git p4 submit &&
177
178                 cp file2 file11 &&
179                 git add file11 &&
180                 git commit -a -m "Copy file2 to file11" &&
181                 git diff-tree -r -C --find-copies-harder HEAD &&
182                 src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
183                 test "$src" = file2 &&
184                 git config git-p4.detectCopiesHarder true &&
185                 git p4 submit &&
186                 p4 filelog //depot/file11 &&
187                 p4 filelog //depot/file11 | grep -q "branch from //depot/file2" &&
188
189                 echo "file12" >>file2 &&
190                 git commit -a -m "Differentiate file2" &&
191                 git p4 submit &&
192
193                 cp file2 file12 &&
194                 echo "some text" >>file12 &&
195                 git add file12 &&
196                 git commit -a -m "Copy file2 to file12 with changes" &&
197                 git diff-tree -r -C --find-copies-harder HEAD &&
198                 level=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/C0*//") &&
199                 test -n "$level" && test "$level" -gt 0 && test "$level" -lt 98 &&
200                 src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
201                 test "$src" = file2 &&
202                 git config git-p4.detectCopies $(($level + 2)) &&
203                 git p4 submit &&
204                 p4 filelog //depot/file12 &&
205                 p4 filelog //depot/file12 | test_must_fail grep -q "branch from" &&
206
207                 echo "file13" >>file2 &&
208                 git commit -a -m "Differentiate file2" &&
209                 git p4 submit &&
210
211                 cp file2 file13 &&
212                 echo "different text" >>file13 &&
213                 git add file13 &&
214                 git commit -a -m "Copy file2 to file13 with changes" &&
215                 git diff-tree -r -C --find-copies-harder HEAD &&
216                 level=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/C0*//") &&
217                 test -n "$level" && test "$level" -gt 2 && test "$level" -lt 100 &&
218                 src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
219                 test "$src" = file2 &&
220                 git config git-p4.detectCopies $(($level - 2)) &&
221                 git p4 submit &&
222                 p4 filelog //depot/file13 &&
223                 p4 filelog //depot/file13 | grep -q "branch from //depot/file2"
224         )
225 '
226
227 # See if configurables can be set, and in particular if the run.move.allow
228 # variable exists, which allows admins to disable the "p4 move" command.
229 test_lazy_prereq P4D_HAVE_CONFIGURABLE_RUN_MOVE_ALLOW '
230         p4 configure show run.move.allow >out &&
231         egrep ^run.move.allow: out
232 '
233
234 # If move can be disabled, turn it off and test p4 move handling
235 test_expect_success P4D_HAVE_CONFIGURABLE_RUN_MOVE_ALLOW \
236                     'do not use p4 move when administratively disabled' '
237         test_when_finished "p4 configure set run.move.allow=1" &&
238         p4 configure set run.move.allow=0 &&
239         (
240                 cd "$cli" &&
241                 echo move-disallow-file >move-disallow-file &&
242                 p4 add move-disallow-file &&
243                 p4 submit -d "add move-disallow-file"
244         ) &&
245         test_when_finished cleanup_git &&
246         git p4 clone --dest="$git" //depot &&
247         (
248                 cd "$git" &&
249                 git config git-p4.skipSubmitEdit true &&
250                 git config git-p4.detectRenames true &&
251                 git mv move-disallow-file move-disallow-file-moved &&
252                 git commit -m "move move-disallow-file" &&
253                 git p4 submit
254         )
255 '
256
257 test_expect_success 'kill p4d' '
258         kill_p4d
259 '
260
261 test_done