Adds os.copyDirWithPermissions().
This commit is contained in:
parent
f59d76a59e
commit
f345b0278b
1 changed files with 38 additions and 1 deletions
|
|
@ -1363,7 +1363,13 @@ proc createDir*(dir: string) {.rtl, extern: "nos$1", tags: [FWriteDir].} =
|
||||||
|
|
||||||
proc copyDir*(source, dest: string) {.rtl, extern: "nos$1",
|
proc copyDir*(source, dest: string) {.rtl, extern: "nos$1",
|
||||||
tags: [FWriteIO, FReadIO].} =
|
tags: [FWriteIO, FReadIO].} =
|
||||||
## Copies a directory from `source` to `dest`. If this fails, `EOS` is raised.
|
## Copies a directory from `source` to `dest`.
|
||||||
|
##
|
||||||
|
## If this fails, `EOS` is raised. On the Windows platform this proc will
|
||||||
|
## copy the attributes from `source` into `dest`. On other platforms created
|
||||||
|
## files and directories will inherit the default permissions of a newly
|
||||||
|
## created file/directory for the user. To preserve attributes recursively on
|
||||||
|
## these platforms use `copyDirWithPermissions() <#copyDirWithPermissions>`_.
|
||||||
createDir(dest)
|
createDir(dest)
|
||||||
for kind, path in walkDir(source):
|
for kind, path in walkDir(source):
|
||||||
var noSource = path.substr(source.len()+1)
|
var noSource = path.substr(source.len()+1)
|
||||||
|
|
@ -1523,6 +1529,37 @@ proc copyFileWithPermissions*(source, dest: string,
|
||||||
if not ignorePermissionErrors:
|
if not ignorePermissionErrors:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
proc copyDirWithPermissions*(source, dest: string,
|
||||||
|
ignorePermissionErrors = true) {.rtl, extern: "nos$1",
|
||||||
|
tags: [FWriteIO, FReadIO].} =
|
||||||
|
## Copies a directory from `source` to `dest` preserving file permissions.
|
||||||
|
##
|
||||||
|
## If this fails, `EOS` is raised. This is a wrapper proc around `copyDir()
|
||||||
|
## <#copyDir>`_ and `copyFileWithPermissions() <#copyFileWithPermissions>`_
|
||||||
|
## on non Windows platforms. On Windows this proc is just a wrapper for
|
||||||
|
## `copyDir() <#copyDir>`_ since that proc already copies attributes.
|
||||||
|
##
|
||||||
|
## On non Windows systems permissions are copied after the file or directory
|
||||||
|
## itself has been copied, which won't happen atomically and could lead to a
|
||||||
|
## race condition. If `ignorePermissionErrors` is true, errors while
|
||||||
|
## reading/setting file attributes will be ignored, otherwise will raise
|
||||||
|
## `OSError`.
|
||||||
|
createDir(dest)
|
||||||
|
when not defined(Windows):
|
||||||
|
try:
|
||||||
|
setFilePermissions(dest, getFilePermissions(source))
|
||||||
|
except:
|
||||||
|
if not ignorePermissionErrors:
|
||||||
|
raise
|
||||||
|
for kind, path in walkDir(source):
|
||||||
|
var noSource = path.substr(source.len()+1)
|
||||||
|
case kind
|
||||||
|
of pcFile:
|
||||||
|
copyFileWithPermissions(path, dest / noSource, ignorePermissionErrors)
|
||||||
|
of pcDir:
|
||||||
|
copyDirWithPermissions(path, dest / noSource, ignorePermissionErrors)
|
||||||
|
else: discard
|
||||||
|
|
||||||
proc inclFilePermissions*(filename: string,
|
proc inclFilePermissions*(filename: string,
|
||||||
permissions: set[TFilePermission]) {.
|
permissions: set[TFilePermission]) {.
|
||||||
rtl, extern: "nos$1", tags: [FReadDir, FWriteDir].} =
|
rtl, extern: "nos$1", tags: [FReadDir, FWriteDir].} =
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue