Skip to content

Commit 4cf5d8a

Browse files
committed
Remove some system() calls
1. Don't use system() in os.{Copy,Move,Duplicate} 2. Respect 'shellslash'
1 parent 1e5b67d commit 4cf5d8a

1 file changed

Lines changed: 48 additions & 50 deletions

File tree

autoload/dir/os.vim

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import autoload 'dir/g.vim'
66

77
export def Sep(escape: bool = false): string
88
if escape
9-
return has("win32") ? '\\' : '/'
9+
return has("win32") && !&shellslash ? '\\' : '/'
1010
else
11-
return has("win32") ? '\' : '/'
11+
return has("win32") && !&shellslash ? '\' : '/'
1212
endif
1313
enddef
1414

@@ -150,36 +150,52 @@ export def ListDirTree(name: string): list<dict<any>>
150150
endtry
151151
enddef
152152

153+
def CopyFile(src: string, dst: string)
154+
const content = readfile(resolve(src), "b")
155+
writefile(content, dst, "b")
156+
enddef
157+
158+
def CopyDir(src: string, dst: string)
159+
const src_resolved = resolve(src)
160+
mkdir(dst, "p")
161+
for item in readdirex(src_resolved, '1', {sort: 'none'})
162+
const src_path = src_resolved .. Sep() .. item.name
163+
const dst_path = dst .. Sep() .. item.name
164+
165+
if item.type == "dir"
166+
CopyDir(src_path, dst_path)
167+
else
168+
CopyFile(src_path, dst_path)
169+
endif
170+
endfor
171+
enddef
172+
153173
# XXX: explore jobs here...
154174
export def Copy()
155175
if mark.IsEmpty() | return | endif
156176
if !isdirectory(get(b:, "dir_cwd", "")) | return | endif
157177

158-
var copy_cmd = "cp"
159-
var dest_dir = $"{b:dir_cwd}"
160-
161-
if &shell =~ 'pwsh'
162-
copy_cmd = "Copy-Item -Force"
163-
elseif has("win32")
164-
copy_cmd = "copy /Y"
165-
endif
178+
var dest_dir = b:dir_cwd
166179

167180
var override = false
168181
# 1 - override all files
169182
# -1 - do not override anything
170183
var override_all = 0
171184

185+
const mark_dir = mark.Dir()
172186
var file_list = mark.List()->copy()
173187
var dir_list = mark.List()->copy()->filter((_, v) => v.type =~ 'dir\|linkd\|junction')
174188
for item in dir_list
175-
file_list += ListDirTree($"{mark.Dir()}{Sep()}{item.name}")
189+
file_list += ListDirTree($"{mark_dir}{Sep()}{item.name}")
176190
endfor
177191
for item in file_list
178-
var src = $"{mark.Dir()}{Sep()}{item.name}"
179-
var dst = $"{b:dir_cwd}{Sep()}{item.name}"
192+
var src = $"{mark_dir}{Sep()}{item.name}"
193+
var dst = $"{dest_dir}{Sep()}{item.name}"
180194
try
181-
if item.type =~ 'dir\|linkd\|junction' && !isdirectory(dst)
182-
mkdir(dst, "p")
195+
if item.type =~ 'dir\|linkd\|junction'
196+
if !isdirectory(dst)
197+
mkdir(dst, "p")
198+
endif
183199
else
184200
var file_exists = filereadable(dst)
185201
if file_exists && override_all == 0
@@ -210,15 +226,11 @@ export def Copy()
210226
if !isdirectory(fnamemodify(dst, ":h"))
211227
mkdir(fnamemodify(dst, ":h"), "p")
212228
endif
213-
if &shell =~ 'pwsh'
214-
system($'{copy_cmd} "{resolve(src)}" "{dst}"'->escape('"'))
215-
else
216-
system($'{copy_cmd} "{resolve(src)}" "{dst}"')
217-
endif
229+
CopyFile(src, dst)
218230
endif
219231
endif
220232
catch
221-
echo v:exception
233+
echom v:exception
222234
endtry
223235
endfor
224236
mark.Clear()
@@ -228,23 +240,17 @@ export def Duplicate()
228240
if mark.IsEmpty() | return | endif
229241
if !isdirectory(get(b:, "dir_cwd", "")) | return | endif
230242

231-
var copy_cmd = "cp -R"
232-
var copy_dir_cmd = "cp -R"
233-
var dest_dir = $"{b:dir_cwd}"
234-
235-
if has("win32")
236-
copy_cmd = "copy /Y"
237-
copy_dir_cmd = "xcopy /EIH"
238-
endif
243+
const mark_dir = mark.Dir()
244+
var dest_dir = b:dir_cwd
239245

240246
for item in mark.List()
241-
var src = $"{mark.Dir()}{Sep()}{item.name}"
242-
var dst = $"{b:dir_cwd}{Sep()}{GetDuplicateName(item.name)}"
247+
var src = $"{mark_dir}{Sep()}{item.name}"
248+
var dst = $"{dest_dir}{Sep()}{GetDuplicateName(item.name)}"
243249
try
244250
if item.type == 'dir'
245-
system($'{copy_dir_cmd} "{resolve(src)}" "{dst}"')
251+
CopyDir(src, dst)
246252
else
247-
system($'{copy_cmd} "{resolve(src)}" "{dst}"')
253+
CopyFile(src, dst)
248254
endif
249255
catch
250256
echo v:exception
@@ -258,28 +264,23 @@ export def Move()
258264
if mark.IsEmpty() | return | endif
259265
if !isdirectory(get(b:, "dir_cwd", "")) | return | endif
260266

261-
var move_cmd = "mv"
262-
var dest_dir = $"{b:dir_cwd}"
263-
264-
if &shell =~ 'pwsh'
265-
move_cmd = "Move-Item -Force"
266-
elseif has("win32")
267-
move_cmd = "move /Y"
268-
endif
269267

270268
var override = false
271269
# 1 - override all files
272270
# -1 - do not override anything
273271
var override_all = 0
274272

273+
var dest_dir = b:dir_cwd
274+
const mark_dir = mark.Dir()
275275
var file_list = mark.List()->copy()
276276
var dir_list = mark.List()->copy()->filter((_, v) => v.type =~ 'dir\|linkd\|junction')
277277
for item in dir_list
278-
file_list += ListDirTree($"{mark.Dir()}{Sep()}{item.name}")
278+
file_list += ListDirTree($"{mark_dir}{Sep()}{item.name}")
279279
endfor
280280
for item in file_list
281-
var src = $"{mark.Dir()}{Sep()}{item.name}"
282-
var dst = $"{b:dir_cwd}{Sep()}{item.name}"
281+
var src = $"{mark_dir}{Sep()}{item.name}"
282+
var dst = $"{dest_dir}{Sep()}{item.name}"
283+
283284
try
284285
if item.type =~ 'dir\|linkd\|junction' && !isdirectory(dst)
285286
mkdir(dst, "p")
@@ -313,19 +314,16 @@ export def Move()
313314
if !isdirectory(fnamemodify(dst, ":h"))
314315
mkdir(fnamemodify(dst, ":h"), "p")
315316
endif
316-
if &shell =~ 'pwsh'
317-
system($'{move_cmd} "{resolve(src)}" "{dst}"'->escape('"'))
318-
else
319-
system($'{move_cmd} "{resolve(src)}" "{dst}"')
320-
endif
317+
CopyFile(src, dst)
318+
delete(src)
321319
endif
322320
endif
323321
catch
324322
echo v:exception
325323
endtry
326324
endfor
327325
for item_dir in dir_list
328-
Delete($"{mark.Dir()}{Sep()}{item_dir.name}")
326+
delete($"{mark_dir}{Sep()}{item_dir.name}", 'rf')
329327
endfor
330328
for buf_info in g.OtherDirBuffers()
331329
setbufvar(buf_info.bufnr, "dir_invalidate", true)

0 commit comments

Comments
 (0)