Merge branch 'mg/rebase-i-onto-reflog-in-full' into maint-1.7.11
[git.git] / t / t9809-git-p4-client-view.sh
1 #!/bin/sh
2
3 test_description='git p4 client view'
4
5 . ./lib-git-p4.sh
6
7 test_expect_success 'start p4d' '
8         start_p4d
9 '
10
11 #
12 # Construct a client with this list of View lines
13 #
14 client_view() {
15         (
16                 cat <<-EOF &&
17                 Client: client
18                 Description: client
19                 Root: $cli
20                 View:
21                 EOF
22                 for arg ; do
23                         printf "\t$arg\n"
24                 done
25         ) | p4 client -i
26 }
27
28 #
29 # Verify these files exist, exactly.  Caller creates
30 # a list of files in file "files".
31 #
32 check_files_exist() {
33         ok=0 &&
34         num=$# &&
35         for arg ; do
36                 test_path_is_file "$arg" &&
37                 ok=$(($ok + 1))
38         done &&
39         test $ok -eq $num &&
40         test_line_count = $num files
41 }
42
43 #
44 # Sync up the p4 client, make sure the given files (and only
45 # those) exist.
46 #
47 client_verify() {
48         (
49                 cd "$cli" &&
50                 p4 sync &&
51                 find . -type f ! -name files >files &&
52                 check_files_exist "$@"
53         )
54 }
55
56 #
57 # Make sure the named files, exactly, exist.
58 #
59 git_verify() {
60         (
61                 cd "$git" &&
62                 git ls-files >files &&
63                 check_files_exist "$@"
64         )
65 }
66
67 # //depot
68 #   - dir1
69 #     - file11
70 #     - file12
71 #   - dir2
72 #     - file21
73 #     - file22
74 init_depot() {
75         for d in 1 2 ; do
76                 mkdir -p dir$d &&
77                 for f in 1 2 ; do
78                         echo dir$d/file$d$f >dir$d/file$d$f &&
79                         p4 add dir$d/file$d$f &&
80                         p4 submit -d "dir$d/file$d$f"
81                 done
82         done &&
83         find . -type f ! -name files >files &&
84         check_files_exist dir1/file11 dir1/file12 \
85                           dir2/file21 dir2/file22
86 }
87
88 test_expect_success 'init depot' '
89         (
90                 cd "$cli" &&
91                 init_depot
92         )
93 '
94
95 # double % for printf
96 test_expect_success 'unsupported view wildcard %%n' '
97         client_view "//depot/%%%%1/sub/... //client/sub/%%%%1/..." &&
98         test_when_finished cleanup_git &&
99         test_must_fail git p4 clone --use-client-spec --dest="$git" //depot
100 '
101
102 test_expect_success 'unsupported view wildcard *' '
103         client_view "//depot/*/bar/... //client/*/bar/..." &&
104         test_when_finished cleanup_git &&
105         test_must_fail git p4 clone --use-client-spec --dest="$git" //depot
106 '
107
108 test_expect_success 'wildcard ... only supported at end of spec 1' '
109         client_view "//depot/.../file11 //client/.../file11" &&
110         test_when_finished cleanup_git &&
111         test_must_fail git p4 clone --use-client-spec --dest="$git" //depot
112 '
113
114 test_expect_success 'wildcard ... only supported at end of spec 2' '
115         client_view "//depot/.../a/... //client/.../a/..." &&
116         test_when_finished cleanup_git &&
117         test_must_fail git p4 clone --use-client-spec --dest="$git" //depot
118 '
119
120 test_expect_success 'basic map' '
121         client_view "//depot/dir1/... //client/cli1/..." &&
122         files="cli1/file11 cli1/file12" &&
123         client_verify $files &&
124         test_when_finished cleanup_git &&
125         git p4 clone --use-client-spec --dest="$git" //depot &&
126         git_verify $files
127 '
128
129 test_expect_success 'client view with no mappings' '
130         client_view &&
131         client_verify &&
132         test_when_finished cleanup_git &&
133         git p4 clone --use-client-spec --dest="$git" //depot &&
134         git_verify
135 '
136
137 test_expect_success 'single file map' '
138         client_view "//depot/dir1/file11 //client/file11" &&
139         files="file11" &&
140         client_verify $files &&
141         test_when_finished cleanup_git &&
142         git p4 clone --use-client-spec --dest="$git" //depot &&
143         git_verify $files
144 '
145
146 test_expect_success 'later mapping takes precedence (entire repo)' '
147         client_view "//depot/dir1/... //client/cli1/..." \
148                     "//depot/... //client/cli2/..." &&
149         files="cli2/dir1/file11 cli2/dir1/file12
150                cli2/dir2/file21 cli2/dir2/file22" &&
151         client_verify $files &&
152         test_when_finished cleanup_git &&
153         git p4 clone --use-client-spec --dest="$git" //depot &&
154         git_verify $files
155 '
156
157 test_expect_success 'later mapping takes precedence (partial repo)' '
158         client_view "//depot/dir1/... //client/..." \
159                     "//depot/dir2/... //client/..." &&
160         files="file21 file22" &&
161         client_verify $files &&
162         test_when_finished cleanup_git &&
163         git p4 clone --use-client-spec --dest="$git" //depot &&
164         git_verify $files
165 '
166
167 # Reading the view backwards,
168 #   dir2 goes to cli12
169 #   dir1 cannot go to cli12 since it was filled by dir2
170 #   dir1 also does not go to cli3, since the second rule
171 #     noticed that it matched, but was already filled
172 test_expect_success 'depot path matching rejected client path' '
173         client_view "//depot/dir1/... //client/cli3/..." \
174                     "//depot/dir1/... //client/cli12/..." \
175                     "//depot/dir2/... //client/cli12/..." &&
176         files="cli12/file21 cli12/file22" &&
177         client_verify $files &&
178         test_when_finished cleanup_git &&
179         git p4 clone --use-client-spec --dest="$git" //depot &&
180         git_verify $files
181 '
182
183 # since both have the same //client/..., the exclusion
184 # rule keeps everything out
185 test_expect_success 'exclusion wildcard, client rhs same (odd)' '
186         client_view "//depot/... //client/..." \
187                     "-//depot/dir2/... //client/..." &&
188         client_verify &&
189         test_when_finished cleanup_git &&
190         git p4 clone --use-client-spec --dest="$git" //depot &&
191         git_verify
192 '
193
194 test_expect_success 'exclusion wildcard, client rhs different (normal)' '
195         client_view "//depot/... //client/..." \
196                     "-//depot/dir2/... //client/dir2/..." &&
197         files="dir1/file11 dir1/file12" &&
198         client_verify $files &&
199         test_when_finished cleanup_git &&
200         git p4 clone --use-client-spec --dest="$git" //depot &&
201         git_verify $files
202 '
203
204 test_expect_success 'exclusion single file' '
205         client_view "//depot/... //client/..." \
206                     "-//depot/dir2/file22 //client/file22" &&
207         files="dir1/file11 dir1/file12 dir2/file21" &&
208         client_verify $files &&
209         test_when_finished cleanup_git &&
210         git p4 clone --use-client-spec --dest="$git" //depot &&
211         git_verify $files
212 '
213
214 test_expect_success 'overlay wildcard' '
215         client_view "//depot/dir1/... //client/cli/..." \
216                     "+//depot/dir2/... //client/cli/...\n" &&
217         files="cli/file11 cli/file12 cli/file21 cli/file22" &&
218         client_verify $files &&
219         test_when_finished cleanup_git &&
220         git p4 clone --use-client-spec --dest="$git" //depot &&
221         git_verify $files
222 '
223
224 test_expect_success 'overlay single file' '
225         client_view "//depot/dir1/... //client/cli/..." \
226                     "+//depot/dir2/file21 //client/cli/file21" &&
227         files="cli/file11 cli/file12 cli/file21" &&
228         client_verify $files &&
229         test_when_finished cleanup_git &&
230         git p4 clone --use-client-spec --dest="$git" //depot &&
231         git_verify $files
232 '
233
234 test_expect_success 'exclusion with later inclusion' '
235         client_view "//depot/... //client/..." \
236                     "-//depot/dir2/... //client/dir2/..." \
237                     "//depot/dir2/... //client/dir2incl/..." &&
238         files="dir1/file11 dir1/file12 dir2incl/file21 dir2incl/file22" &&
239         client_verify $files &&
240         test_when_finished cleanup_git &&
241         git p4 clone --use-client-spec --dest="$git" //depot &&
242         git_verify $files
243 '
244
245 test_expect_success 'quotes on rhs only' '
246         client_view "//depot/dir1/... \"//client/cdir 1/...\"" &&
247         client_verify "cdir 1/file11" "cdir 1/file12" &&
248         test_when_finished cleanup_git &&
249         git p4 clone --use-client-spec --dest="$git" //depot &&
250         git_verify "cdir 1/file11" "cdir 1/file12"
251 '
252
253 #
254 # Submit tests
255 #
256
257 # clone sets variable
258 test_expect_success 'clone --use-client-spec sets useClientSpec' '
259         client_view "//depot/... //client/..." &&
260         test_when_finished cleanup_git &&
261         git p4 clone --use-client-spec --dest="$git" //depot &&
262         (
263                 cd "$git" &&
264                 git config --bool git-p4.useClientSpec >actual &&
265                 echo true >true &&
266                 test_cmp actual true
267         )
268 '
269
270 # clone just a subdir of the client spec
271 test_expect_success 'subdir clone' '
272         client_view "//depot/... //client/..." &&
273         files="dir1/file11 dir1/file12 dir2/file21 dir2/file22" &&
274         client_verify $files &&
275         test_when_finished cleanup_git &&
276         git p4 clone --use-client-spec --dest="$git" //depot/dir1 &&
277         git_verify dir1/file11 dir1/file12
278 '
279
280 #
281 # submit back, see what happens:  five cases
282 #
283 test_expect_success 'subdir clone, submit modify' '
284         client_view "//depot/... //client/..." &&
285         test_when_finished cleanup_git &&
286         git p4 clone --use-client-spec --dest="$git" //depot/dir1 &&
287         (
288                 cd "$git" &&
289                 git config git-p4.skipSubmitEdit true &&
290                 echo line >>dir1/file12 &&
291                 git add dir1/file12 &&
292                 git commit -m dir1/file12 &&
293                 git p4 submit
294         ) &&
295         (
296                 cd "$cli" &&
297                 test_path_is_file dir1/file12 &&
298                 test_line_count = 2 dir1/file12
299         )
300 '
301
302 test_expect_success 'subdir clone, submit add' '
303         client_view "//depot/... //client/..." &&
304         test_when_finished cleanup_git &&
305         git p4 clone --use-client-spec --dest="$git" //depot/dir1 &&
306         (
307                 cd "$git" &&
308                 git config git-p4.skipSubmitEdit true &&
309                 echo file13 >dir1/file13 &&
310                 git add dir1/file13 &&
311                 git commit -m dir1/file13 &&
312                 git p4 submit
313         ) &&
314         (
315                 cd "$cli" &&
316                 test_path_is_file dir1/file13
317         )
318 '
319
320 test_expect_success 'subdir clone, submit delete' '
321         client_view "//depot/... //client/..." &&
322         test_when_finished cleanup_git &&
323         git p4 clone --use-client-spec --dest="$git" //depot/dir1 &&
324         (
325                 cd "$git" &&
326                 git config git-p4.skipSubmitEdit true &&
327                 git rm dir1/file12 &&
328                 git commit -m "delete dir1/file12" &&
329                 git p4 submit
330         ) &&
331         (
332                 cd "$cli" &&
333                 test_path_is_missing dir1/file12
334         )
335 '
336
337 test_expect_success 'subdir clone, submit copy' '
338         client_view "//depot/... //client/..." &&
339         test_when_finished cleanup_git &&
340         git p4 clone --use-client-spec --dest="$git" //depot/dir1 &&
341         (
342                 cd "$git" &&
343                 git config git-p4.skipSubmitEdit true &&
344                 git config git-p4.detectCopies true &&
345                 cp dir1/file11 dir1/file11a &&
346                 git add dir1/file11a &&
347                 git commit -m "copy to dir1/file11a" &&
348                 git p4 submit
349         ) &&
350         (
351                 cd "$cli" &&
352                 test_path_is_file dir1/file11a &&
353                 test ! -w dir1/file11a
354         )
355 '
356
357 test_expect_success 'subdir clone, submit rename' '
358         client_view "//depot/... //client/..." &&
359         test_when_finished cleanup_git &&
360         git p4 clone --use-client-spec --dest="$git" //depot/dir1 &&
361         (
362                 cd "$git" &&
363                 git config git-p4.skipSubmitEdit true &&
364                 git config git-p4.detectRenames true &&
365                 git mv dir1/file13 dir1/file13a &&
366                 git commit -m "rename dir1/file13 to dir1/file13a" &&
367                 git p4 submit
368         ) &&
369         (
370                 cd "$cli" &&
371                 test_path_is_missing dir1/file13 &&
372                 test_path_is_file dir1/file13a &&
373                 test ! -w dir1/file13a
374         )
375 '
376
377 # see t9800 for the non-client-spec case, and the rest of the wildcard tests
378 test_expect_success 'wildcard files submit back to p4, client-spec case' '
379         client_view "//depot/... //client/..." &&
380         test_when_finished cleanup_git &&
381         git p4 clone --use-client-spec --dest="$git" //depot/dir1 &&
382         (
383                 cd "$git" &&
384                 echo git-wild-hash >dir1/git-wild#hash &&
385                 echo git-wild-star >dir1/git-wild\*star &&
386                 echo git-wild-at >dir1/git-wild@at &&
387                 echo git-wild-percent >dir1/git-wild%percent &&
388                 git add dir1/git-wild* &&
389                 git commit -m "add some wildcard filenames" &&
390                 git config git-p4.skipSubmitEditCheck true &&
391                 git p4 submit
392         ) &&
393         (
394                 cd "$cli" &&
395                 test_path_is_file dir1/git-wild#hash &&
396                 test_path_is_file dir1/git-wild\*star &&
397                 test_path_is_file dir1/git-wild@at &&
398                 test_path_is_file dir1/git-wild%percent
399         ) &&
400         (
401                 # delete these carefully, cannot just do "p4 delete"
402                 # on files with wildcards; but git-p4 knows how
403                 cd "$git" &&
404                 git rm dir1/git-wild* &&
405                 git commit -m "clean up the wildcards" &&
406                 git p4 submit
407         )
408 '
409
410 test_expect_success 'reinit depot' '
411         (
412                 cd "$cli" &&
413                 rm files &&
414                 p4 delete */* &&
415                 p4 submit -d "delete all files" &&
416                 init_depot
417         )
418 '
419
420 #
421 # What happens when two files of the same name are overlayed together?
422 # The last-listed file should take preference.
423 #
424 # //depot
425 #   - dir1
426 #     - file11
427 #     - file12
428 #     - filecollide
429 #   - dir2
430 #     - file21
431 #     - file22
432 #     - filecollide
433 #
434 test_expect_success 'overlay collision setup' '
435         client_view "//depot/... //client/..." &&
436         (
437                 cd "$cli" &&
438                 p4 sync &&
439                 echo dir1/filecollide >dir1/filecollide &&
440                 p4 add dir1/filecollide &&
441                 p4 submit -d dir1/filecollide &&
442                 echo dir2/filecollide >dir2/filecollide &&
443                 p4 add dir2/filecollide &&
444                 p4 submit -d dir2/filecollide
445         )
446 '
447
448 test_expect_success 'overlay collision 1 to 2' '
449         client_view "//depot/dir1/... //client/..." \
450                     "+//depot/dir2/... //client/..." &&
451         files="file11 file12 file21 file22 filecollide" &&
452         echo dir2/filecollide >actual &&
453         client_verify $files &&
454         test_cmp actual "$cli"/filecollide &&
455         test_when_finished cleanup_git &&
456         git p4 clone --use-client-spec --dest="$git" //depot &&
457         git_verify $files &&
458         test_cmp actual "$git"/filecollide
459 '
460
461 test_expect_failure 'overlay collision 2 to 1' '
462         client_view "//depot/dir2/... //client/..." \
463                     "+//depot/dir1/... //client/..." &&
464         files="file11 file12 file21 file22 filecollide" &&
465         echo dir1/filecollide >actual &&
466         client_verify $files &&
467         test_cmp actual "$cli"/filecollide &&
468         test_when_finished cleanup_git &&
469         git p4 clone --use-client-spec --dest="$git" //depot &&
470         git_verify $files &&
471         test_cmp actual "$git"/filecollide
472 '
473
474 test_expect_success 'overlay collision delete 2' '
475         client_view "//depot/... //client/..." &&
476         (
477                 cd "$cli" &&
478                 p4 sync &&
479                 p4 delete dir2/filecollide &&
480                 p4 submit -d "remove dir2/filecollide"
481         )
482 '
483
484 # no filecollide, got deleted with dir2
485 test_expect_failure 'overlay collision 1 to 2, but 2 deleted' '
486         client_view "//depot/dir1/... //client/..." \
487                     "+//depot/dir2/... //client/..." &&
488         files="file11 file12 file21 file22" &&
489         client_verify $files &&
490         test_when_finished cleanup_git &&
491         git p4 clone --use-client-spec --dest="$git" //depot &&
492         git_verify $files
493 '
494
495 test_expect_success 'overlay collision update 1' '
496         client_view "//depot/dir1/... //client/dir1/..." &&
497         (
498                 cd "$cli" &&
499                 p4 sync &&
500                 p4 open dir1/filecollide &&
501                 echo dir1/filecollide update >dir1/filecollide &&
502                 p4 submit -d "update dir1/filecollide"
503         )
504 '
505
506 # still no filecollide, dir2 still wins with the deletion even though the
507 # change to dir1 is more recent
508 test_expect_failure 'overlay collision 1 to 2, but 2 deleted, then 1 updated' '
509         client_view "//depot/dir1/... //client/..." \
510                     "+//depot/dir2/... //client/..." &&
511         files="file11 file12 file21 file22" &&
512         client_verify $files &&
513         test_when_finished cleanup_git &&
514         git p4 clone --use-client-spec --dest="$git" //depot &&
515         git_verify $files
516 '
517
518 test_expect_success 'overlay collision delete filecollides' '
519         client_view "//depot/... //client/..." &&
520         (
521                 cd "$cli" &&
522                 p4 sync &&
523                 p4 delete dir1/filecollide dir2/filecollide &&
524                 p4 submit -d "remove filecollides"
525         )
526 '
527
528 #
529 # Overlays as part of sync, rather than initial checkout:
530 #   1.  add a file in dir1
531 #   2.  sync to include it
532 #   3.  add same file in dir2
533 #   4.  sync, make sure content switches as dir2 has priority
534 #   5.  add another file in dir1
535 #   6.  sync
536 #   7.  add/delete same file in dir2
537 #   8.  sync, make sure it disappears, again dir2 wins
538 #   9.  cleanup
539 #
540 # //depot
541 #   - dir1
542 #     - file11
543 #     - file12
544 #     - colA
545 #     - colB
546 #   - dir2
547 #     - file21
548 #     - file22
549 #     - colA
550 #     - colB
551 #
552 test_expect_success 'overlay sync: add colA in dir1' '
553         client_view "//depot/dir1/... //client/dir1/..." &&
554         (
555                 cd "$cli" &&
556                 p4 sync &&
557                 echo dir1/colA >dir1/colA &&
558                 p4 add dir1/colA &&
559                 p4 submit -d dir1/colA
560         )
561 '
562
563 test_expect_success 'overlay sync: initial git checkout' '
564         client_view "//depot/dir1/... //client/..." \
565                     "+//depot/dir2/... //client/..." &&
566         files="file11 file12 file21 file22 colA" &&
567         echo dir1/colA >actual &&
568         client_verify $files &&
569         test_cmp actual "$cli"/colA &&
570         git p4 clone --use-client-spec --dest="$git" //depot &&
571         git_verify $files &&
572         test_cmp actual "$git"/colA
573 '
574
575 test_expect_success 'overlay sync: add colA in dir2' '
576         client_view "//depot/dir2/... //client/dir2/..." &&
577         (
578                 cd "$cli" &&
579                 p4 sync &&
580                 echo dir2/colA >dir2/colA &&
581                 p4 add dir2/colA &&
582                 p4 submit -d dir2/colA
583         )
584 '
585
586 test_expect_success 'overlay sync: colA content switch' '
587         client_view "//depot/dir1/... //client/..." \
588                     "+//depot/dir2/... //client/..." &&
589         files="file11 file12 file21 file22 colA" &&
590         echo dir2/colA >actual &&
591         client_verify $files &&
592         test_cmp actual "$cli"/colA &&
593         (
594                 cd "$git" &&
595                 git p4 sync --use-client-spec &&
596                 git merge --ff-only p4/master
597         ) &&
598         git_verify $files &&
599         test_cmp actual "$git"/colA
600 '
601
602 test_expect_success 'overlay sync: add colB in dir1' '
603         client_view "//depot/dir1/... //client/dir1/..." &&
604         (
605                 cd "$cli" &&
606                 p4 sync &&
607                 echo dir1/colB >dir1/colB &&
608                 p4 add dir1/colB &&
609                 p4 submit -d dir1/colB
610         )
611 '
612
613 test_expect_success 'overlay sync: colB appears' '
614         client_view "//depot/dir1/... //client/..." \
615                     "+//depot/dir2/... //client/..." &&
616         files="file11 file12 file21 file22 colA colB" &&
617         echo dir1/colB >actual &&
618         client_verify $files &&
619         test_cmp actual "$cli"/colB &&
620         (
621                 cd "$git" &&
622                 git p4 sync --use-client-spec &&
623                 git merge --ff-only p4/master
624         ) &&
625         git_verify $files &&
626         test_cmp actual "$git"/colB
627 '
628
629 test_expect_success 'overlay sync: add/delete colB in dir2' '
630         client_view "//depot/dir2/... //client/dir2/..." &&
631         (
632                 cd "$cli" &&
633                 p4 sync &&
634                 echo dir2/colB >dir2/colB &&
635                 p4 add dir2/colB &&
636                 p4 submit -d dir2/colB &&
637                 p4 delete dir2/colB &&
638                 p4 submit -d "delete dir2/colB"
639         )
640 '
641
642 test_expect_success 'overlay sync: colB disappears' '
643         client_view "//depot/dir1/... //client/..." \
644                     "+//depot/dir2/... //client/..." &&
645         files="file11 file12 file21 file22 colA" &&
646         client_verify $files &&
647         test_when_finished cleanup_git &&
648         (
649                 cd "$git" &&
650                 git p4 sync --use-client-spec &&
651                 git merge --ff-only p4/master
652         ) &&
653         git_verify $files
654 '
655
656 test_expect_success 'overlay sync: cleanup' '
657         client_view "//depot/... //client/..." &&
658         (
659                 cd "$cli" &&
660                 p4 sync &&
661                 p4 delete dir1/colA dir2/colA dir1/colB &&
662                 p4 submit -d "remove overlay sync files"
663         )
664 '
665
666 #
667 # Overlay tests again, but swapped so dir1 has priority.
668 #   1.  add a file in dir1
669 #   2.  sync to include it
670 #   3.  add same file in dir2
671 #   4.  sync, make sure content does not switch
672 #   5.  add another file in dir1
673 #   6.  sync
674 #   7.  add/delete same file in dir2
675 #   8.  sync, make sure it is still there
676 #   9.  cleanup
677 #
678 # //depot
679 #   - dir1
680 #     - file11
681 #     - file12
682 #     - colA
683 #     - colB
684 #   - dir2
685 #     - file21
686 #     - file22
687 #     - colA
688 #     - colB
689 #
690 test_expect_success 'overlay sync swap: add colA in dir1' '
691         client_view "//depot/dir1/... //client/dir1/..." &&
692         (
693                 cd "$cli" &&
694                 p4 sync &&
695                 echo dir1/colA >dir1/colA &&
696                 p4 add dir1/colA &&
697                 p4 submit -d dir1/colA
698         )
699 '
700
701 test_expect_success 'overlay sync swap: initial git checkout' '
702         client_view "//depot/dir2/... //client/..." \
703                     "+//depot/dir1/... //client/..." &&
704         files="file11 file12 file21 file22 colA" &&
705         echo dir1/colA >actual &&
706         client_verify $files &&
707         test_cmp actual "$cli"/colA &&
708         git p4 clone --use-client-spec --dest="$git" //depot &&
709         git_verify $files &&
710         test_cmp actual "$git"/colA
711 '
712
713 test_expect_success 'overlay sync swap: add colA in dir2' '
714         client_view "//depot/dir2/... //client/dir2/..." &&
715         (
716                 cd "$cli" &&
717                 p4 sync &&
718                 echo dir2/colA >dir2/colA &&
719                 p4 add dir2/colA &&
720                 p4 submit -d dir2/colA
721         )
722 '
723
724 test_expect_failure 'overlay sync swap: colA no content switch' '
725         client_view "//depot/dir2/... //client/..." \
726                     "+//depot/dir1/... //client/..." &&
727         files="file11 file12 file21 file22 colA" &&
728         echo dir1/colA >actual &&
729         client_verify $files &&
730         test_cmp actual "$cli"/colA &&
731         (
732                 cd "$git" &&
733                 git p4 sync --use-client-spec &&
734                 git merge --ff-only p4/master
735         ) &&
736         git_verify $files &&
737         test_cmp actual "$git"/colA
738 '
739
740 test_expect_success 'overlay sync swap: add colB in dir1' '
741         client_view "//depot/dir1/... //client/dir1/..." &&
742         (
743                 cd "$cli" &&
744                 p4 sync &&
745                 echo dir1/colB >dir1/colB &&
746                 p4 add dir1/colB &&
747                 p4 submit -d dir1/colB
748         )
749 '
750
751 test_expect_success 'overlay sync swap: colB appears' '
752         client_view "//depot/dir2/... //client/..." \
753                     "+//depot/dir1/... //client/..." &&
754         files="file11 file12 file21 file22 colA colB" &&
755         echo dir1/colB >actual &&
756         client_verify $files &&
757         test_cmp actual "$cli"/colB &&
758         (
759                 cd "$git" &&
760                 git p4 sync --use-client-spec &&
761                 git merge --ff-only p4/master
762         ) &&
763         git_verify $files &&
764         test_cmp actual "$git"/colB
765 '
766
767 test_expect_success 'overlay sync swap: add/delete colB in dir2' '
768         client_view "//depot/dir2/... //client/dir2/..." &&
769         (
770                 cd "$cli" &&
771                 p4 sync &&
772                 echo dir2/colB >dir2/colB &&
773                 p4 add dir2/colB &&
774                 p4 submit -d dir2/colB &&
775                 p4 delete dir2/colB &&
776                 p4 submit -d "delete dir2/colB"
777         )
778 '
779
780 test_expect_failure 'overlay sync swap: colB no change' '
781         client_view "//depot/dir2/... //client/..." \
782                     "+//depot/dir1/... //client/..." &&
783         files="file11 file12 file21 file22 colA colB" &&
784         echo dir1/colB >actual &&
785         client_verify $files &&
786         test_cmp actual "$cli"/colB &&
787         test_when_finished cleanup_git &&
788         (
789                 cd "$git" &&
790                 git p4 sync --use-client-spec &&
791                 git merge --ff-only p4/master
792         ) &&
793         git_verify $files &&
794         test_cmp actual "$cli"/colB
795 '
796
797 test_expect_success 'overlay sync swap: cleanup' '
798         client_view "//depot/... //client/..." &&
799         (
800                 cd "$cli" &&
801                 p4 sync &&
802                 p4 delete dir1/colA dir2/colA dir1/colB &&
803                 p4 submit -d "remove overlay sync files"
804         )
805 '
806
807 #
808 # Rename directories to test quoting in depot-side mappings
809 # //depot
810 #    - "dir 1"
811 #       - file11
812 #       - file12
813 #    - "dir 2"
814 #       - file21
815 #       - file22
816 #
817 test_expect_success 'rename files to introduce spaces' '
818         client_view "//depot/... //client/..." &&
819         client_verify dir1/file11 dir1/file12 \
820                       dir2/file21 dir2/file22 &&
821         (
822                 cd "$cli" &&
823                 p4 open dir1/... &&
824                 p4 move dir1/... "dir 1"/... &&
825                 p4 open dir2/... &&
826                 p4 move dir2/... "dir 2"/... &&
827                 p4 submit -d "rename with spaces"
828         ) &&
829         client_verify "dir 1/file11" "dir 1/file12" \
830                       "dir 2/file21" "dir 2/file22"
831 '
832
833 test_expect_success 'quotes on lhs only' '
834         client_view "\"//depot/dir 1/...\" //client/cdir1/..." &&
835         files="cdir1/file11 cdir1/file12" &&
836         client_verify $files &&
837         test_when_finished cleanup_git &&
838         git p4 clone --use-client-spec --dest="$git" //depot &&
839         client_verify $files
840 '
841
842 test_expect_success 'quotes on both sides' '
843         client_view "\"//depot/dir 1/...\" \"//client/cdir 1/...\"" &&
844         client_verify "cdir 1/file11" "cdir 1/file12" &&
845         test_when_finished cleanup_git &&
846         git p4 clone --use-client-spec --dest="$git" //depot &&
847         git_verify "cdir 1/file11" "cdir 1/file12"
848 '
849
850 test_expect_success 'kill p4d' '
851         kill_p4d
852 '
853
854 test_done