Imported Upstream version 2.5.0
[scm/test.git] / t / t-unlock.sh
1 #!/usr/bin/env bash
2
3 . "$(dirname "$0")/testlib.sh"
4
5 begin_test "unlocking a lock by path with good ref"
6 (
7   set -e
8
9   reponame="unlock-by-path-master-branch-required"
10   setup_remote_repo_with_file "$reponame" "c.dat"
11
12   git lfs lock --json "c.dat" | tee lock.log
13
14   id=$(assert_lock lock.log c.dat)
15   assert_server_lock "$reponame" "$id" "refs/heads/master"
16
17   git lfs unlock --id="$id"
18   refute_server_lock "$reponame" "$id" "refs/heads/master"
19 )
20 end_test
21
22 begin_test "unlocking a lock by path with tracked ref"
23 (
24   set -e
25
26   reponame="unlock-by-path-tracked-branch-required"
27   setup_remote_repo "$reponame"
28   clone_repo "$reponame" "$reponame"
29
30   git lfs track "*.dat"
31   echo "c" > c.dat
32   git add .gitattributes c.dat
33   git commit -m "add c.dat"
34
35   git config push.default upstream
36   git config branch.master.merge refs/heads/tracked
37   git push origin master
38
39   git lfs lock --json "c.dat" | tee lock.log
40
41   id=$(assert_lock lock.log c.dat)
42   assert_server_lock "$reponame" "$id" "refs/heads/tracked"
43
44   git lfs unlock --id="$id"
45   refute_server_lock "$reponame" "$id" "refs/heads/tracked"
46 )
47 end_test
48
49 begin_test "unlocking a lock by path with bad ref"
50 (
51   set -e
52
53   reponame="unlock-by-path-other-branch-required"
54   setup_remote_repo "$reponame"
55   clone_repo "$reponame" "$reponame"
56
57   git lfs track "*.dat"
58   echo "c" > c.dat
59   git add .gitattributes c.dat
60   git commit -m "add c.dat"
61   git push origin master:other
62
63   git checkout -b other
64   git lfs lock --json "c.dat" | tee lock.log
65
66   id=$(assert_lock lock.log c.dat)
67   assert_server_lock "$reponame" "$id" "refs/heads/other"
68
69   git checkout master
70   git lfs unlock --id="$id" 2>&1 | tee unlock.log
71   if [ "0" -eq "${PIPESTATUS[0]}" ]; then
72     echo >&2 "fatal: expected 'git lfs lock \'a.dat\'' to fail"
73     exit 1
74   fi
75
76   assert_server_lock "$reponame" "$id" "refs/heads/other"
77   grep 'Expected ref "refs/heads/other", got "refs/heads/master"' unlock.log
78 )
79 end_test
80
81 begin_test "unlocking a lock by id with bad ref"
82 (
83   set -e
84
85   reponame="unlock-by-id-other-branch-required"
86   setup_remote_repo "$reponame"
87   clone_repo "$reponame" "$reponame"
88
89   git lfs track "*.dat"
90   echo "c" > c.dat
91   git add .gitattributes c.dat
92   git commit -m "add c.dat"
93   git push origin master:other
94
95   git checkout -b other
96   git lfs lock --json "c.dat" | tee lock.log
97
98   id=$(assert_lock lock.log c.dat)
99   assert_server_lock "$reponame" "$id" "refs/heads/other"
100
101   git checkout master
102   git lfs unlock --id="$id" 2>&1 | tee unlock.log
103   if [ "0" -eq "${PIPESTATUS[0]}" ]; then
104     echo >&2 "fatal: expected 'git lfs lock \'a.dat\'' to fail"
105     exit 1
106   fi
107
108   assert_server_lock "$reponame" "$id" "refs/heads/other"
109   grep 'Expected ref "refs/heads/other", got "refs/heads/master"' unlock.log
110 )
111 end_test
112
113 begin_test "unlocking a file makes it readonly"
114 (
115   set -e
116
117   reponame="unlock_set_readonly"
118   setup_remote_repo_with_file "$reponame" "c.dat"
119
120   git lfs lock --json "c.dat"
121   assert_file_writeable c.dat
122
123   git lfs unlock "c.dat"
124   refute_file_writeable c.dat
125 )
126 end_test
127
128 begin_test "unlocking a file ignores readonly"
129 (
130   set -e
131
132   reponame="unlock_set_readonly_ignore"
133   setup_remote_repo_with_file "$reponame" "c.dat"
134
135   git lfs lock --json "c.dat"
136   assert_file_writeable c.dat
137
138   git -c lfs.setlockablereadonly=false lfs unlock "c.dat"
139   assert_file_writeable c.dat
140 )
141 end_test
142
143 begin_test "force unlocking lock with missing file"
144 (
145   set -e
146
147   reponame="force-unlock-missing-file"
148   setup_remote_repo_with_file "$reponame" "a.dat"
149
150   git lfs lock --json "a.dat" | tee lock.log
151   id=$(assert_lock lock.log a.dat)
152   assert_server_lock "$reponame" "$id"
153
154   git rm a.dat
155   git commit -m "a.dat"
156   rm *.log *.json # ensure clean git status
157   git status
158
159   git lfs unlock "a.dat" 2>&1 | tee unlock.log
160   grep "Unable to determine path" unlock.log
161   assert_server_lock "$reponame" "$id"
162
163   rm unlock.log
164   git lfs unlock --force "a.dat" 2>&1 | tee unlock.log
165   refute_server_lock "$reponame" "$id"
166 )
167 end_test
168
169 begin_test "unlocking a lock (--json)"
170 (
171   set -e
172
173   reponame="unlock_by_path_json"
174   setup_remote_repo_with_file "$reponame" "c_json.dat"
175
176   git lfs lock --json "c_json.dat" | tee lock.log
177
178   id=$(assert_lock lock.log c_json.dat)
179   assert_server_lock "$reponame" "$id"
180
181   git lfs unlock --json "c_json.dat" 2>&1 | tee unlock.log
182   grep "\"unlocked\":true" unlock.log
183
184   refute_server_lock "$reponame" "$id"
185 )
186 end_test
187
188 begin_test "unlocking a lock by id"
189 (
190   set -e
191
192   reponame="unlock_by_id"
193   setup_remote_repo_with_file "$reponame" "d.dat"
194
195   git lfs lock --json "d.dat" | tee lock.log
196   assert_file_writeable d.dat
197
198   id=$(assert_lock lock.log d.dat)
199   assert_server_lock "$reponame" "$id"
200
201   git lfs unlock --id="$id"
202   refute_file_writeable d.dat
203 )
204 end_test
205
206 begin_test "unlocking a lock without sufficient info"
207 (
208   set -e
209
210   reponame="unlock_ambiguous"
211   setup_remote_repo_with_file "$reponame" "e.dat"
212
213   git lfs lock --json "e.dat" | tee lock.log
214
215   id=$(assert_lock lock.log e.dat)
216   assert_server_lock "$reponame" "$id"
217
218   git lfs unlock 2>&1 | tee unlock.log
219   grep "Usage: git lfs unlock" unlock.log
220   assert_server_lock "$reponame" "$id"
221 )
222 end_test
223
224 begin_test "unlocking a lock while uncommitted"
225 (
226   set -e
227
228   reponame="unlock_modified"
229   setup_remote_repo_with_file "$reponame" "mod.dat"
230
231   git lfs lock --json "mod.dat" | tee lock.log
232
233   id=$(assert_lock lock.log mod.dat)
234   assert_server_lock "$reponame" "$id"
235
236   echo "\nSomething" >> mod.dat
237
238   git lfs unlock "mod.dat" 2>&1 | tee unlock.log
239   [ ${PIPESTATUS[0]} -ne "0" ]
240
241   grep "Cannot unlock file with uncommitted changes" unlock.log
242
243   assert_server_lock "$reponame" "$id"
244
245   # should allow after discard
246   git checkout mod.dat
247   git lfs unlock "mod.dat" 2>&1 | tee unlock.log
248   refute_server_lock "$reponame" "$id"
249 )
250 end_test
251
252 begin_test "unlocking a lock with ambiguious arguments"
253 (
254   set -e
255
256   reponame="unlock_ambiguious_args"
257   setup_remote_repo_with_file "$reponame" "a.dat"
258
259   git lfs lock --json "a.dat" | tee lock.log
260
261   id=$(assert_lock lock.log a.dat)
262   assert_server_lock "$reponame" "$id"
263
264   git lfs unlock --id "$id" a.dat 2>&1 | tee unlock.log
265   if [ "0" -eq "${PIPESTATUS[0]}" ]; then
266     echo >&2 "expected ambiguous \`git lfs unlock\` command to exit, didn't"
267     exit 1
268   fi
269
270   grep "Usage:" unlock.log
271   assert_server_lock "$reponame" "$id"
272 )
273 end_test
274
275 begin_test "unlocking a lock while uncommitted with --force"
276 (
277   set -e
278
279   reponame="unlock_modified_force"
280   setup_remote_repo_with_file "$reponame" "modforce.dat"
281
282   git lfs lock --json "modforce.dat" | tee lock.log
283
284   id=$(assert_lock lock.log modforce.dat)
285   assert_server_lock "$reponame" "$id"
286
287   echo "\nSomething" >> modforce.dat
288
289   # should allow with --force
290   git lfs unlock --force "modforce.dat" 2>&1 | tee unlock.log
291   grep "Warning: unlocking with uncommitted changes" unlock.log
292   refute_server_lock "$reponame" "$id"
293 )
294 end_test
295
296 begin_test "unlocking a lock while untracked"
297 (
298   set -e
299
300   reponame="unlock_untracked"
301   setup_remote_repo_with_file "$reponame" "notrelevant.dat"
302
303   git lfs track "*.dat"
304   # Create file but don't add it to git
305   # Shouldn't be able to unlock it
306   echo "something" > untracked.dat
307   git lfs lock --json "untracked.dat" | tee lock.log
308
309   id=$(assert_lock lock.log untracked.dat)
310   assert_server_lock "$reponame" "$id"
311
312   git lfs unlock "untracked.dat" 2>&1 | tee unlock.log
313   [ ${PIPESTATUS[0]} -ne "0" ]
314
315   grep "Cannot unlock file with uncommitted changes" unlock.log
316
317   assert_server_lock "$reponame" "$id"
318
319   # should allow after add/commit
320   git add untracked.dat
321   git commit -m "Added untracked"
322   git lfs unlock "untracked.dat" 2>&1 | tee unlock.log
323   refute_server_lock "$reponame" "$id"
324 )
325 end_test