@@ -1725,8 +1725,9 @@ proc copyFile*(source, dest: string, options = {cfSymlinkFollow}) {.rtl,
17251725 noWeirdTarget .} =
17261726 # # Copies a file from `source` to `dest`, where `dest.parentDir` must exist.
17271727 # #
1728- # # `options` specify the way file is copied; by default, if `source` is a
1729- # # symlink, copies the file symlink points to.
1728+ # # On non-Windows OSes, `options` specify the way file is copied; by default,
1729+ # # if `source` is a symlink, copies the file symlink points to. `options` is
1730+ # # ignored on Windows: symlinks are skipped.
17301731 # #
17311732 # # If this fails, `OSError` is raised.
17321733 # #
@@ -1759,30 +1760,17 @@ proc copyFile*(source, dest: string, options = {cfSymlinkFollow}) {.rtl,
17591760 doAssert card (copyFlagSymlink * options) == 1 , " There should be exactly " &
17601761 " one cfSymlink* in options"
17611762 let isSymlink = source.symlinkExists
1762- if isSymlink and cfSymlinkIgnore in options:
1763+ if isSymlink and ( cfSymlinkIgnore in options or defined (windows)) :
17631764 return
17641765 when defined (Windows ):
1765- proc handleOSError =
1766- const ERROR_PRIVILEGE_NOT_HELD = 1314
1767- let errCode = osLastError ()
1768- let context = $ (source, dest, options)
1769- if isSymlink and errCode.int32 == ERROR_PRIVILEGE_NOT_HELD :
1770- stderr.write (" Failed copy the symlink: error " & $ errCode & " : " &
1771- osErrorMsg (errCode) & " Additional info: " & context &
1772- " \n " )
1773- else :
1774- raiseOSError (errCode, context)
1775-
1776- let dwCopyFlags = if cfSymlinkAsIs in options: COPY_FILE_COPY_SYMLINK else : 0 'i32
1777- var pbCancel = 0 'i32
17781766 when useWinUnicode:
17791767 let s = newWideCString (source)
17801768 let d = newWideCString (dest)
1781- if copyFileExW (s, d, nil , nil , addr pbCancel, dwCopyFlags ) == 0 'i32 :
1782- handleOSError ( )
1769+ if copyFileW (s, d, 0 'i32 ) == 0 'i32 :
1770+ raiseOSError ( osLastError (), $ (source, dest) )
17831771 else :
1784- if copyFileExA (source, dest, nil , nil , addr pbCancel, dwCopyFlags ) == 0 'i32 :
1785- handleOSError ( )
1772+ if copyFileA (source, dest, 0 'i32 ) == 0 'i32 :
1773+ raiseOSError ( osLastError (), $ (source, dest) )
17861774 elif hasCCopyfile:
17871775 let state = copyfile_state_alloc ()
17881776 # xxx `COPYFILE_STAT` could be used for one-shot `copyFileWithPermissions`.
@@ -1824,8 +1812,9 @@ proc copyFileToDir*(source, dir: string, options = {cfSymlinkFollow})
18241812 {.noWeirdTarget , since : (1 ,3 ,7 ).} =
18251813 # # Copies a file `source` into directory `dir`, which must exist.
18261814 # #
1827- # # `options` specify the way file is copied; by default, if `source` is a
1828- # # symlink, copies the file symlink points to.
1815+ # # On non-Windows OSes, `options` specify the way file is copied; by default,
1816+ # # if `source` is a symlink, copies the file symlink points to. `options` is
1817+ # # ignored on Windows: symlinks are skipped.
18291818 # #
18301819 # # See also:
18311820 # # * `CopyFlag enum <#CopyFlag>`_
@@ -2460,7 +2449,8 @@ proc copyDir*(source, dest: string) {.rtl, extern: "nos$1",
24602449 tags : [ReadDirEffect , WriteIOEffect , ReadIOEffect ], benign , noWeirdTarget .} =
24612450 # # Copies a directory from `source` to `dest`.
24622451 # #
2463- # # Symlinks are copied as symlinks.
2452+ # # On non-Windows OSes, symlinks are copied as symlinks. On Windows, symlinks
2453+ # # are skipped.
24642454 # #
24652455 # # If this fails, `OSError` is raised.
24662456 # #
@@ -2491,8 +2481,8 @@ proc copyDir*(source, dest: string) {.rtl, extern: "nos$1",
24912481proc moveDir * (source, dest: string ) {.tags : [ReadIOEffect , WriteIOEffect ], noWeirdTarget .} =
24922482 # # Moves a directory from `source` to `dest`.
24932483 # #
2494- # # Symlinks are not followed: if `source` contains symlinks, they itself are
2495- # # moved, not theirs target.
2484+ # # Symlinks are not followed: if `source` contains symlinks, they themself are
2485+ # # moved, not their target.
24962486 # #
24972487 # # If this fails, `OSError` is raised.
24982488 # #
@@ -2536,8 +2526,9 @@ proc copyFileWithPermissions*(source, dest: string,
25362526 options = {cfSymlinkFollow}) {.noWeirdTarget .} =
25372527 # # Copies a file from `source` to `dest` preserving file permissions.
25382528 # #
2539- # # `options` specify the way file is copied; by default, if `source` is a
2540- # # symlink, copies the file symlink points to.
2529+ # # On non-Windows OSes, `options` specify the way file is copied; by default,
2530+ # # if `source` is a symlink, copies the file symlink points to. `options` is
2531+ # # ignored on Windows: symlinks are skipped.
25412532 # #
25422533 # # This is a wrapper proc around `copyFile <#copyFile,string,string>`_,
25432534 # # `getFilePermissions <#getFilePermissions,string>`_ and
@@ -2576,7 +2567,8 @@ proc copyDirWithPermissions*(source, dest: string,
25762567 benign , noWeirdTarget .} =
25772568 # # Copies a directory from `source` to `dest` preserving file permissions.
25782569 # #
2579- # # Symlinks are copied as symlinks.
2570+ # # On non-Windows OSes, symlinks are copied as symlinks. On Windows, symlinks
2571+ # # are skipped.
25802572 # #
25812573 # # If this fails, `OSError` is raised. This is a wrapper proc around `copyDir
25822574 # # <#copyDir,string,string>`_ and `copyFileWithPermissions
0 commit comments