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