git p4 test: examine behavior with locked (+l) files

The p4 server can enforce file locking, so that only one user can edit a file at a time. Git p4 is unable to submit changes to locked files. Currently it exits poorly. Ideally it would notice the locked condition and clean up nicely. Add a bunch of tests that describe the problem, hoping that fixes appear in the future. Signed-off-by: Pete Wyckoff <pw@padd.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Pete Wyckoff committed Jan 21, 2014 at 18:16 UTC 3d5388afa856fde3efff023f5b672005834e7ca1
1 file changed +145
t/t9816-git-p4-locked.sh new
+145
@@ -0,0 +1,145 @@
1 +#!/bin/sh
2 +
3 +test_description='git p4 locked file behavior'
4 +
5 +. ./lib-git-p4.sh
6 +
7 +test_expect_success 'start p4d' '
8 + start_p4d
9 +'
10 +
11 +# See
12 +# http://www.perforce.com/perforce/doc.current/manuals/p4sag/03_superuser.html#1088563
13 +# for suggestions on how to configure "sitewide pessimistic locking"
14 +# where only one person can have a file open for edit at a time.
15 +test_expect_success 'init depot' '
16 + (
17 + cd "$cli" &&
18 + echo "TypeMap: +l //depot/..." | p4 typemap -i &&
19 + echo file1 >file1 &&
20 + p4 add file1 &&
21 + p4 submit -d "add file1"
22 + )
23 +'
24 +
25 +test_expect_success 'edit with lock not taken' '
26 + test_when_finished cleanup_git &&
27 + git p4 clone --dest="$git" //depot &&
28 + (
29 + cd "$git" &&
30 + echo line2 >>file1 &&
31 + git add file1 &&
32 + git commit -m "line2 in file1" &&
33 + git config git-p4.skipSubmitEdit true &&
34 + git p4 submit
35 + )
36 +'
37 +
38 +test_expect_failure 'add with lock not taken' '
39 + test_when_finished cleanup_git &&
40 + git p4 clone --dest="$git" //depot &&
41 + (
42 + cd "$git" &&
43 + echo line1 >>add-lock-not-taken &&
44 + git add file2 &&
45 + git commit -m "add add-lock-not-taken" &&
46 + git config git-p4.skipSubmitEdit true &&
47 + git p4 submit --verbose
48 + )
49 +'
50 +
51 +lock_in_another_client() {
52 + # build a different client
53 + cli2="$TRASH_DIRECTORY/cli2" &&
54 + mkdir -p "$cli2" &&
55 + test_when_finished "p4 client -f -d client2 && rm -rf \"$cli2\"" &&
56 + (
57 + cd "$cli2" &&
58 + P4CLIENT=client2 &&
59 + cli="$cli2" &&
60 + client_view "//depot/... //client2/..." &&
61 + p4 sync &&
62 + p4 open file1
63 + )
64 +}
65 +
66 +test_expect_failure 'edit with lock taken' '
67 + lock_in_another_client &&
68 + test_when_finished cleanup_git &&
69 + test_when_finished "cd \"$cli\" && p4 sync -f file1" &&
70 + git p4 clone --dest="$git" //depot &&
71 + (
72 + cd "$git" &&
73 + echo line3 >>file1 &&
74 + git add file1 &&
75 + git commit -m "line3 in file1" &&
76 + git config git-p4.skipSubmitEdit true &&
77 + git p4 submit --verbose
78 + )
79 +'
80 +
81 +test_expect_failure 'delete with lock taken' '
82 + lock_in_another_client &&
83 + test_when_finished cleanup_git &&
84 + test_when_finished "cd \"$cli\" && p4 sync -f file1" &&
85 + git p4 clone --dest="$git" //depot &&
86 + (
87 + cd "$git" &&
88 + git rm file1 &&
89 + git commit -m "delete file1" &&
90 + git config git-p4.skipSubmitEdit true &&
91 + git p4 submit --verbose
92 + )
93 +'
94 +
95 +test_expect_failure 'chmod with lock taken' '
96 + lock_in_another_client &&
97 + test_when_finished cleanup_git &&
98 + test_when_finished "cd \"$cli\" && p4 sync -f file1" &&
99 + git p4 clone --dest="$git" //depot &&
100 + (
101 + cd "$git" &&
102 + chmod +x file1 &&
103 + git add file1 &&
104 + git commit -m "chmod +x file1" &&
105 + git config git-p4.skipSubmitEdit true &&
106 + git p4 submit --verbose
107 + )
108 +'
109 +
110 +test_expect_failure 'copy with lock taken' '
111 + lock_in_another_client &&
112 + test_when_finished cleanup_git &&
113 + test_when_finished "cd \"$cli\" && p4 revert file2 && rm -f file2" &&
114 + git p4 clone --dest="$git" //depot &&
115 + (
116 + cd "$git" &&
117 + cp file1 file2 &&
118 + git add file2 &&
119 + git commit -m "cp file1 to file2" &&
120 + git config git-p4.skipSubmitEdit true &&
121 + git config git-p4.detectCopies true &&
122 + git p4 submit --verbose
123 + )
124 +'
125 +
126 +test_expect_failure 'move with lock taken' '
127 + lock_in_another_client &&
128 + test_when_finished cleanup_git &&
129 + test_when_finished "cd \"$cli\" && p4 sync file1 && rm -f file2" &&
130 + git p4 clone --dest="$git" //depot &&
131 + (
132 + cd "$git" &&
133 + git mv file1 file2 &&
134 + git commit -m "mv file1 to file2" &&
135 + git config git-p4.skipSubmitEdit true &&
136 + git config git-p4.detectRenames true &&
137 + git p4 submit --verbose
138 + )
139 +'
140 +
141 +test_expect_success 'kill p4d' '
142 + kill_p4d
143 +'
144 +
145 +test_done