Skip to content

Commit 50972ba

Browse files
committedOct 11, 2024
fix: cp -> split on cpFile and cpDir bc recursive is required for dirs
1 parent 84bba38 commit 50972ba

File tree

5 files changed

+134
-47
lines changed

5 files changed

+134
-47
lines changed
 

Diff for: ‎src/Node/FS/Aff.purs

+20-8
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ module Node.FS.Aff
5353
, fdWriteString
5454
, fdAppend
5555
, fdClose
56-
, cp
57-
, cp'
56+
, cpFile
57+
, cpFile'
58+
, cpDir
59+
, cpDir'
5860
, fchmod
5961
, fchown
6062
, fdatasync
@@ -91,7 +93,7 @@ import Node.Buffer (Buffer)
9193
import Node.Encoding (Encoding)
9294
import Node.FS.Types (BufferLength, BufferOffset, ByteCount, FileDescriptor, FileMode, FilePosition, SymlinkType)
9395
import Node.FS.Internal.AffUtils (toAff1, toAff2, toAff3, toAff4, toAff5)
94-
import Node.FS.Options (AppendFileBufferOptions, CpOptions, FdReadOptions, FdWriteOptions, GlobDirentOptions, GlobFilePathOptions, MkdirOptions, OpendirOptions, ReadFileBufferOptions, ReadFileStringOptions, ReaddirBufferOptions, ReaddirDirentBufferOptions, ReaddirDirentOptions, ReaddirFilePathOptions, RealpathOptions, RmOptions, RmdirOptions, WriteFileBufferOptions, WriteFileStringOptions)
96+
import Node.FS.Options (AppendFileBufferOptions, CpDirOptions, CpFileOptions, FdReadOptions, FdWriteOptions, GlobDirentOptions, GlobFilePathOptions, MkdirOptions, OpendirOptions, ReadFileBufferOptions, ReadFileStringOptions, ReaddirBufferOptions, ReaddirDirentBufferOptions, ReaddirDirentOptions, ReaddirFilePathOptions, RealpathOptions, RmOptions, RmdirOptions, WriteFileBufferOptions, WriteFileStringOptions)
9597
import Node.FS.Constants (AccessMode, CopyMode, FileFlags)
9698
import Node.FS.Async as A
9799
import Node.FS.Dir (Dir)
@@ -406,13 +408,23 @@ fdAppend = toAff2 A.fdAppend
406408
fdClose :: FileDescriptor -> Aff Unit
407409
fdClose = toAff1 A.fdClose
408410

409-
-- | Copy a file asynchronously. See the [Node Documentation](https://nodejs.org/api/fs.html#fs_fspromises_copyfile_src_dest_mode)
411+
-- | Copy a file asynchronously using a `cp` command.
412+
-- | See the [Node Documentation](https://nodejs.org/api/fs.html#fscpsrc-dest-options-callback)
410413
-- | for details.
411-
cp :: FilePath -> FilePath -> Aff Unit
412-
cp = toAff2 A.cp
414+
cpFile :: FilePath -> FilePath -> Aff Unit
415+
cpFile = toAff2 A.cpFile
413416

414-
cp' :: FilePath -> FilePath -> CpOptions -> Aff Unit
415-
cp' = toAff3 A.cp'
417+
cpFile' :: FilePath -> FilePath -> CpFileOptions -> Aff Unit
418+
cpFile' = toAff3 A.cpFile'
419+
420+
-- | Copy a directory asynchronously using a `cp` command with option `recursive = true`.
421+
-- | See the [Node Documentation](https://nodejs.org/api/fs.html#fscpsrc-dest-options-callback)
422+
-- | for details.
423+
cpDir :: FilePath -> FilePath -> Aff Unit
424+
cpDir = toAff2 A.cpDir
425+
426+
cpDir' :: FilePath -> FilePath -> CpDirOptions -> Aff Unit
427+
cpDir' = toAff3 A.cpDir'
416428

417429
-- | Change permissions on a file descriptor. See the [Node Documentation](https://nodejs.org/api/fs.html#fs_fs_fchmod_fd_mode_callback)
418430
-- | for details.

Diff for: ‎src/Node/FS/Async.purs

+20-8
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ module Node.FS.Async
5353
, fdWriteString
5454
, fdAppend
5555
, fdClose
56-
, cp
57-
, cp'
56+
, cpFile
57+
, cpFile'
58+
, cpDir
59+
, cpDir'
5860
, fchmod
5961
, fchown
6062
, fdatasync
@@ -96,7 +98,7 @@ import Node.FS.Constants (AccessMode, CopyMode, FileFlags, defaultAccessMode, de
9698
import Node.FS.Dir (Dir)
9799
import Node.FS.Dirent (Dirent, DirentNameTypeBuffer, DirentNameTypeString)
98100
import Node.FS.Internal.Utils (Callback0, Callback1, JSCallback0, JSCallback1, JSCallback2, datetimeToUnixEpochTimeInSeconds, handleCallback0, handleCallback1, handleCallback1Tuple)
99-
import Node.FS.Options (AppendFileBufferOptions, AppendFileOptionsInternal, AppendFileStringOptions, CpOptions, CpOptionsInternal, FdReadOptions, FdReadOptionsInternal, FdWriteOptions, FdWriteOptionsInternal, GlobDirentOptions, GlobFilePathOptions, GlobOptionsInternal, MkdirOptions, MkdirOptionsInternal, OpendirOptions, OpendirOptionsInternal, ReadFileBufferOptions, ReadFileOptionsInternal, ReadFileStringOptions, ReaddirBufferOptions, ReaddirDirentBufferOptions, ReaddirDirentOptions, ReaddirFilePathOptions, ReaddirOptionsInternal, RealpathOptions, RealpathOptionsInternal, RmOptions, RmdirOptions, WriteFileBufferOptions, WriteFileOptionsInternal, WriteFileStringOptions, appendFileBufferOptionsDefault, appendFileBufferOptionsToInternal, appendFileStringOptionsDefault, appendFileStringOptionsToInternal, cpOptionsDefault, cpOptionsToCpOptionsInternal, fdReadOptionsToInternal, fdWriteOptionsToInternal, globDirentOptionsDefault, globDirentOptionsToInternal, globFilePathOptionsDefault, globFilePathOptionsToInternal, mkdirOptionsDefault, mkdirOptionsToInternal, opendirOptionsDefault, opendirOptionsToInternal, readFileBufferOptionsDefault, readFileBufferOptionsToInternal, readFileStringOptionsDefault, readFileStringOptionsToInternal, readdirBufferOptionsDefault, readdirBufferOptionsToInternal, readdirDirentBufferOptionsDefault, readdirDirentBufferOptionsToInternal, readdirDirentOptionsDefault, readdirDirentOptionsToInternal, readdirFilePathOptionsDefault, readdirFilePathOptionsToInternal, realpathOptionsDefault, realpathOptionsToInternal, rmOptionsDefault, rmdirOptionsDefault, writeFileBufferOptionsDefault, writeFileBufferOptionsToInternal, writeFileStringOptionsDefault, writeFileStringOptionsToInternal)
101+
import Node.FS.Options (AppendFileBufferOptions, AppendFileOptionsInternal, AppendFileStringOptions, CpDirOptions, CpFileOptions, CpOptionsInternal, FdReadOptions, FdReadOptionsInternal, FdWriteOptions, FdWriteOptionsInternal, GlobDirentOptions, GlobFilePathOptions, GlobOptionsInternal, MkdirOptions, MkdirOptionsInternal, OpendirOptions, OpendirOptionsInternal, ReadFileBufferOptions, ReadFileOptionsInternal, ReadFileStringOptions, ReaddirBufferOptions, ReaddirDirentBufferOptions, ReaddirDirentOptions, ReaddirFilePathOptions, ReaddirOptionsInternal, RealpathOptions, RealpathOptionsInternal, RmOptions, RmdirOptions, WriteFileBufferOptions, WriteFileOptionsInternal, WriteFileStringOptions, appendFileBufferOptionsDefault, appendFileBufferOptionsToInternal, appendFileStringOptionsDefault, appendFileStringOptionsToInternal, cpDirOptionsDefault, cpDirOptionsToCpOptionsInternal, cpFileOptionsDefault, cpFileOptionsToCpOptionsInternal, fdReadOptionsToInternal, fdWriteOptionsToInternal, globDirentOptionsDefault, globDirentOptionsToInternal, globFilePathOptionsDefault, globFilePathOptionsToInternal, mkdirOptionsDefault, mkdirOptionsToInternal, opendirOptionsDefault, opendirOptionsToInternal, readFileBufferOptionsDefault, readFileBufferOptionsToInternal, readFileStringOptionsDefault, readFileStringOptionsToInternal, readdirBufferOptionsDefault, readdirBufferOptionsToInternal, readdirDirentBufferOptionsDefault, readdirDirentBufferOptionsToInternal, readdirDirentOptionsDefault, readdirDirentOptionsToInternal, readdirFilePathOptionsDefault, readdirFilePathOptionsToInternal, realpathOptionsDefault, realpathOptionsToInternal, rmOptionsDefault, rmdirOptionsDefault, writeFileBufferOptionsDefault, writeFileBufferOptionsToInternal, writeFileStringOptionsDefault, writeFileStringOptionsToInternal)
100102
import Node.FS.Perms (Perms, permsToString)
101103
import Node.FS.Stats (Stats)
102104
import Node.FS.Types (EncodingString)
@@ -591,13 +593,23 @@ fdClose
591593
-> Effect Unit
592594
fdClose fd cb = runEffectFn2 closeImpl fd (handleCallback0 cb)
593595

594-
-- | Copy a file asynchronously. See the [Node Documentation](https://nodejs.org/api/fs.html#fs_fspromises_copyfile_src_dest_mode)
596+
-- | Copy a file asynchronously using a `cp` command.
597+
-- | See the [Node Documentation](https://nodejs.org/api/fs.html#fscpsrc-dest-options-callback)
595598
-- | for details.
596-
cp :: FilePath -> FilePath -> Callback0 -> Effect Unit
597-
cp src dest = cp' src dest cpOptionsDefault
599+
cpFile :: FilePath -> FilePath -> Callback0 -> Effect Unit
600+
cpFile src dest = cpFile' src dest cpFileOptionsDefault
598601

599-
cp' :: FilePath -> FilePath -> CpOptions -> Callback0 -> Effect Unit
600-
cp' src dest opts cb = runEffectFn4 cpImpl src dest (cpOptionsToCpOptionsInternal opts) (handleCallback0 cb)
602+
cpFile' :: FilePath -> FilePath -> CpFileOptions -> Callback0 -> Effect Unit
603+
cpFile' src dest opts cb = runEffectFn4 cpImpl src dest (cpFileOptionsToCpOptionsInternal opts) (handleCallback0 cb)
604+
605+
-- | Copy a directory asynchronously using a `cp` command with option `recursive = true`.
606+
-- | See the [Node Documentation](https://nodejs.org/api/fs.html#fscpsrc-dest-options-callback)
607+
-- | for details.
608+
cpDir :: FilePath -> FilePath -> Callback0 -> Effect Unit
609+
cpDir src dest = cpDir' src dest cpDirOptionsDefault
610+
611+
cpDir' :: FilePath -> FilePath -> CpDirOptions -> Callback0 -> Effect Unit
612+
cpDir' src dest opts cb = runEffectFn4 cpImpl src dest (cpDirOptionsToCpOptionsInternal opts) (handleCallback0 cb)
601613

602614
-- | Change permissions on a file descriptor. See the [Node Documentation](https://nodejs.org/api/fs.html#fs_fs_fchmod_fd_mode_callback)
603615
-- | for details.

Diff for: ‎src/Node/FS/Options.purs

+48-17
Original file line numberDiff line numberDiff line change
@@ -250,41 +250,56 @@ fdWriteOptionsToInternal { offset, length, position } = { offset, length: Nullab
250250

251251
type CpOptionsInternal =
252252
{ dereference :: Boolean
253-
, errorOnExist :: Boolean
253+
, errorOnExist :: Boolean -- Whether to dereference symlinks
254254
-- if null - will throw "TypeError [ERR_INVALID_ARG_TYPE]: The "options.filter" property must be of type function. Received null"
255255
, filter :: Undefinable (Fn2 FilePath FilePath Boolean)
256256
, force :: Boolean
257-
, mode :: CopyMode
258-
, preserveTimestamps :: Boolean
259-
, recursive :: Boolean
260-
, verbatimSymlinks :: Boolean
257+
, mode :: CopyMode -- Modifiers for copy operation
258+
, preserveTimestamps :: Boolean -- Preserve timestamps from source
259+
, recursive :: Boolean -- Copy directories recursively
260+
, verbatimSymlinks :: Boolean -- Skip path resolution for symlinks
261261
}
262262

263263
data CpForce = CpForce_False | CpForce_TrueWithoutErrorOnExit | CpForce_TrueWithErrorOnExit
264264

265-
type CpOptions =
266-
{ dereference :: Boolean -- Whether to dereference symlinks
265+
type CpDirOptions =
266+
{ dereference :: Boolean
267267
, filter :: Maybe (FilePath -> FilePath -> Boolean)
268268
, force :: CpForce
269-
, mode :: CopyMode -- Modifiers for copy operation
270-
, preserveTimestamps :: Boolean -- Preserve timestamps from source
271-
, recursive :: Boolean -- Copy directories recursively
272-
, verbatimSymlinks :: Boolean -- Skip path resolution for symlinks
269+
, mode :: CopyMode
270+
, preserveTimestamps :: Boolean
271+
, verbatimSymlinks :: Boolean
272+
}
273+
274+
type CpFileOptions =
275+
{ dereference :: Boolean
276+
, force :: CpForce
277+
, mode :: CopyMode
278+
, preserveTimestamps :: Boolean
279+
, verbatimSymlinks :: Boolean
273280
}
274281

275-
cpOptionsDefault :: CpOptions
276-
cpOptionsDefault =
282+
cpDirOptionsDefault :: CpDirOptions
283+
cpDirOptionsDefault =
277284
{ dereference: false
278285
, filter: Nothing
279286
, force: CpForce_TrueWithoutErrorOnExit
280287
, mode: copyFile_NO_FLAGS
281288
, preserveTimestamps: false
282-
, recursive: false
283289
, verbatimSymlinks: false
284290
}
285291

286-
cpOptionsToCpOptionsInternal :: CpOptions -> CpOptionsInternal
287-
cpOptionsToCpOptionsInternal opts =
292+
cpFileOptionsDefault :: CpFileOptions
293+
cpFileOptionsDefault =
294+
{ dereference: false
295+
, force: CpForce_TrueWithoutErrorOnExit
296+
, mode: copyFile_NO_FLAGS
297+
, preserveTimestamps: false
298+
, verbatimSymlinks: false
299+
}
300+
301+
cpDirOptionsToCpOptionsInternal :: CpDirOptions -> CpOptionsInternal
302+
cpDirOptionsToCpOptionsInternal opts =
288303
{ dereference: opts.dereference
289304
, errorOnExist: case opts.force of
290305
CpForce_TrueWithErrorOnExit -> true
@@ -295,7 +310,23 @@ cpOptionsToCpOptionsInternal opts =
295310
_ -> true
296311
, mode: opts.mode
297312
, preserveTimestamps: opts.preserveTimestamps
298-
, recursive: opts.recursive
313+
, recursive: true
314+
, verbatimSymlinks: opts.verbatimSymlinks
315+
}
316+
317+
cpFileOptionsToCpOptionsInternal :: CpFileOptions -> CpOptionsInternal
318+
cpFileOptionsToCpOptionsInternal opts =
319+
{ dereference: opts.dereference
320+
, errorOnExist: case opts.force of
321+
CpForce_TrueWithErrorOnExit -> true
322+
_ -> false
323+
, filter: Undefinable.undefined
324+
, force: case opts.force of
325+
CpForce_False -> false
326+
_ -> true
327+
, mode: opts.mode
328+
, preserveTimestamps: opts.preserveTimestamps
329+
, recursive: false
299330
, verbatimSymlinks: opts.verbatimSymlinks
300331
}
301332

Diff for: ‎src/Node/FS/Sync.purs

+20-8
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ module Node.FS.Sync
5454
, fdWriteString
5555
, fdAppend
5656
, fdClose
57-
, cp
58-
, cp'
57+
, cpFile
58+
, cpFile'
59+
, cpDir
60+
, cpDir'
5961
, fchmod
6062
, fchown
6163
, fdatasync
@@ -96,7 +98,7 @@ import Node.FS.Constants (AccessMode, CopyMode, FileFlags, defaultAccessMode, de
9698
import Node.FS.Dir (Dir)
9799
import Node.FS.Dirent (Dirent, DirentNameTypeBuffer, DirentNameTypeString)
98100
import Node.FS.Internal.Utils (datetimeToUnixEpochTimeInSeconds)
99-
import Node.FS.Options (AppendFileBufferOptions, AppendFileOptionsInternal, AppendFileStringOptions, CpOptions, CpOptionsInternal, FdReadOptions, FdReadOptionsInternal, FdWriteOptions, FdWriteOptionsInternal, GlobDirentOptions, GlobFilePathOptions, GlobOptionsInternal, MkdirOptions, MkdirOptionsInternal, OpendirOptions, OpendirOptionsInternal, ReadFileBufferOptions, ReadFileOptionsInternal, ReadFileStringOptions, ReaddirBufferOptions, ReaddirDirentBufferOptions, ReaddirDirentOptions, ReaddirFilePathOptions, ReaddirOptionsInternal, RealpathOptions, RealpathOptionsInternal, RmOptions, RmdirOptions, WriteFileBufferOptions, WriteFileOptionsInternal, WriteFileStringOptions, appendFileBufferOptionsDefault, appendFileBufferOptionsToInternal, appendFileStringOptionsDefault, appendFileStringOptionsToInternal, cpOptionsDefault, cpOptionsToCpOptionsInternal, fdReadOptionsToInternal, fdWriteOptionsToInternal, globDirentOptionsDefault, globDirentOptionsToInternal, globFilePathOptionsDefault, globFilePathOptionsToInternal, mkdirOptionsDefault, mkdirOptionsToInternal, opendirOptionsDefault, opendirOptionsToInternal, readFileBufferOptionsDefault, readFileBufferOptionsToInternal, readFileStringOptionsDefault, readFileStringOptionsToInternal, readdirBufferOptionsDefault, readdirBufferOptionsToInternal, readdirDirentBufferOptionsDefault, readdirDirentBufferOptionsToInternal, readdirDirentOptionsDefault, readdirDirentOptionsToInternal, readdirFilePathOptionsDefault, readdirFilePathOptionsToInternal, realpathOptionsDefault, realpathOptionsToInternal, rmOptionsDefault, rmdirOptionsDefault, writeFileBufferOptionsDefault, writeFileBufferOptionsToInternal, writeFileStringOptionsDefault, writeFileStringOptionsToInternal)
101+
import Node.FS.Options (AppendFileBufferOptions, AppendFileOptionsInternal, AppendFileStringOptions, CpDirOptions, CpFileOptions, CpOptionsInternal, FdReadOptions, FdReadOptionsInternal, FdWriteOptions, FdWriteOptionsInternal, GlobDirentOptions, GlobFilePathOptions, GlobOptionsInternal, MkdirOptions, MkdirOptionsInternal, OpendirOptions, OpendirOptionsInternal, ReadFileBufferOptions, ReadFileOptionsInternal, ReadFileStringOptions, ReaddirBufferOptions, ReaddirDirentBufferOptions, ReaddirDirentOptions, ReaddirFilePathOptions, ReaddirOptionsInternal, RealpathOptions, RealpathOptionsInternal, RmOptions, RmdirOptions, WriteFileBufferOptions, WriteFileOptionsInternal, WriteFileStringOptions, appendFileBufferOptionsDefault, appendFileBufferOptionsToInternal, appendFileStringOptionsDefault, appendFileStringOptionsToInternal, cpDirOptionsDefault, cpDirOptionsToCpOptionsInternal, cpFileOptionsDefault, cpFileOptionsToCpOptionsInternal, fdReadOptionsToInternal, fdWriteOptionsToInternal, globDirentOptionsDefault, globDirentOptionsToInternal, globFilePathOptionsDefault, globFilePathOptionsToInternal, mkdirOptionsDefault, mkdirOptionsToInternal, opendirOptionsDefault, opendirOptionsToInternal, readFileBufferOptionsDefault, readFileBufferOptionsToInternal, readFileStringOptionsDefault, readFileStringOptionsToInternal, readdirBufferOptionsDefault, readdirBufferOptionsToInternal, readdirDirentBufferOptionsDefault, readdirDirentBufferOptionsToInternal, readdirDirentOptionsDefault, readdirDirentOptionsToInternal, readdirFilePathOptionsDefault, readdirFilePathOptionsToInternal, realpathOptionsDefault, realpathOptionsToInternal, rmOptionsDefault, rmdirOptionsDefault, writeFileBufferOptionsDefault, writeFileBufferOptionsToInternal, writeFileStringOptionsDefault, writeFileStringOptionsToInternal)
100102
import Node.FS.Perms (Perms, permsToString)
101103
import Node.FS.Stats (Stats)
102104
import Node.FS.Types (BufferLength, BufferOffset, ByteCount, FileDescriptor, FileMode, FilePosition, SymlinkType, EncodingString, symlinkTypeToNode)
@@ -537,13 +539,23 @@ fdAppend fd buff = do
537539
fdClose :: FileDescriptor -> Effect Unit
538540
fdClose fd = runEffectFn1 closeSyncImpl fd
539541

540-
-- | Copy a file synchronously. See the [Node Documentation](https://nodejs.org/api/fs.html#fs_fspromises_copyfile_src_dest_mode)
542+
-- | Copy a file synchronously using a `cp` command.
543+
-- | See the [Node Documentation](https://nodejs.org/api/fs.html#fscpsyncsrc-dest-options)
541544
-- | for details.
542-
cp :: FilePath -> FilePath -> Effect Unit
543-
cp src dest = cp' src dest cpOptionsDefault
545+
cpFile :: FilePath -> FilePath -> Effect Unit
546+
cpFile src dest = cpFile' src dest cpFileOptionsDefault
544547

545-
cp' :: FilePath -> FilePath -> CpOptions -> Effect Unit
546-
cp' src dest opts = runEffectFn3 cpSyncImpl src dest (cpOptionsToCpOptionsInternal opts)
548+
cpFile' :: FilePath -> FilePath -> CpFileOptions -> Effect Unit
549+
cpFile' src dest opts = runEffectFn3 cpSyncImpl src dest (cpFileOptionsToCpOptionsInternal opts)
550+
551+
-- | Copy a directory synchronously using a `cp` command with option `recursive = true`.
552+
-- | See the [Node Documentation](https://nodejs.org/api/fs.html#fscpsyncsrc-dest-options)
553+
-- | for details.
554+
cpDir :: FilePath -> FilePath -> Effect Unit
555+
cpDir src dest = cpDir' src dest cpDirOptionsDefault
556+
557+
cpDir' :: FilePath -> FilePath -> CpDirOptions -> Effect Unit
558+
cpDir' src dest opts = runEffectFn3 cpSyncImpl src dest (cpDirOptionsToCpOptionsInternal opts)
547559

548560
-- | Change permissions on a file descriptor. See the [Node Documentation](https://nodejs.org/api/fs.html#fs_fs_fchmod_fd_mode_callback)
549561
-- | for details.

Diff for: ‎test/Test/Node/FS/Sync.purs

+26-6
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,20 @@ import Data.Traversable (for_, traverse)
88
import Effect (Effect)
99
import Effect.Console (log)
1010
import Effect.Exception (Error, catchException, error, message, throw, throwException, try)
11+
import Effect.Exception as Error
1112
import Node.Buffer as Buffer
1213
import Node.Encoding (Encoding(..))
1314
import Node.FS (FileFlags(..), SymlinkType(..))
1415
import Node.FS.Async as A
1516
import Node.FS.Constants (copyFile_EXCL, r_OK, w_OK)
17+
import Node.FS.Options (rmOptionsDefault)
1618
import Node.FS.Perms (mkPerms, permsAll)
1719
import Node.FS.Perms as Perms
1820
import Node.FS.Stats (statusChangedTime, accessedTime, modifiedTime, isSymbolicLink, isSocket, isFIFO, isCharacterDevice, isBlockDevice, isDirectory, isFile)
19-
import Node.FS.Options (rmOptionsDefault)
2021
import Node.FS.Sync (chmod)
2122
import Node.FS.Sync as S
2223
import Node.Path as Path
24+
import Test.Assert (assertEqual')
2325
import Unsafe.Coerce (unsafeCoerce)
2426

2527
-- Cheat to allow `main` to type check. See also issue #5 in
@@ -192,12 +194,30 @@ main = do
192194
S.copyFile readableFixturePath destReadPath
193195
unlessM (S.exists destReadPath) do
194196
throw $ destReadPath <> " does not exist after copy"
195-
let destReadPath2 = Path.concat [ tempDir, "readable2.txt" ]
196-
S.cp readableFixturePath destReadPath2
197-
unlessM (S.exists destReadPath2) do
198-
throw $ destReadPath2 <> " does not exist after copy"
199-
200197
copyErr <- try $ S.copyFile' readableFixturePath destReadPath copyFile_EXCL
201198
case copyErr of
202199
Left _ -> pure unit
203200
Right _ -> throw $ destReadPath <> " already exists, but copying a file to there did not throw an error with COPYFILE_EXCL option"
201+
202+
log "copy file using cp: ok"
203+
let destReadPath2 = Path.concat [ tempDir, "readable2.txt" ]
204+
S.cpFile readableFixturePath destReadPath2
205+
unlessM (S.exists destReadPath2) do
206+
throw $ destReadPath2 <> " does not exist after copy"
207+
208+
log "copy dir using cp: if copy using cpDir - ok"
209+
S.cpDir (tempDir <> "/") (tempDir <> "2")
210+
211+
log "copy dir using cp: if copy using cpDir - error - ERR_FS_EISDIR \"Recursive option not enabled\""
212+
let
213+
cpFileShouldThrow_from = tempDir <> "/"
214+
cpFileShouldThrow_to = tempDir <> "3"
215+
cpDirError <- try $ S.cpFile cpFileShouldThrow_from cpFileShouldThrow_to
216+
case cpDirError of
217+
Left cpDirError' -> do
218+
let
219+
cpDirError'_message = Error.message cpDirError'
220+
cpDirError'_code = (unsafeCoerce cpDirError' :: { code :: String }).code
221+
assertEqual' "cpDirError'_message" { actual: cpDirError'_message, expected: "Recursive option not enabled, cannot copy a directory: " <> cpFileShouldThrow_from }
222+
assertEqual' "cpDirError'_code" { actual: cpDirError'_code, expected: "ERR_FS_EISDIR" }
223+
Right _ -> throw $ "cpFileShouldThrow: should have failed " <> show { cpFileShouldThrow_from, cpFileShouldThrow_to }

0 commit comments

Comments
 (0)