Skip to content

Commit bc8ee0b

Browse files
committed
Apply code review suggestions from @RyanZim
1 parent d9f8ef9 commit bc8ee0b

File tree

1 file changed

+23
-35
lines changed

1 file changed

+23
-35
lines changed

lib/copy/copy.js

+23-35
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ const { pathExists } = require('../path-exists')
77
const { utimesMillisAsync } = require('../util/utimes')
88
const stat = require('../util/stat')
99

10-
async function copy (src, dest, opts) {
10+
async function copy (src, dest, opts = {}) {
1111
if (typeof opts === 'function') {
1212
opts = { filter: opts }
1313
}
1414

15-
opts = opts || {}
15+
opts = typeof opts === 'function'
16+
? { filter: opts }
17+
: opts
1618

1719
opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
1820
opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
@@ -42,12 +44,9 @@ async function checkParentDir (destStat, src, dest, opts) {
4244

4345
const dirExists = await pathExists(destParent)
4446

45-
if (dirExists) return getStats(destStat, src, dest, opts)
46-
47-
const parentDirExists = await pathExists(destParent)
48-
if (parentDirExists) return getStats(destStat, src, dest, opts)
49-
50-
await mkdirs(destParent)
47+
if (!dirExists) {
48+
await mkdirs(destParent)
49+
}
5150

5251
return getStats(destStat, src, dest, opts)
5352
}
@@ -75,12 +74,9 @@ async function getStats (destStat, src, dest, opts) {
7574
throw new Error(`Unknown file: ${src}`)
7675
}
7776

78-
function onFile (srcStat, destStat, src, dest, opts) {
77+
async function onFile (srcStat, destStat, src, dest, opts) {
7978
if (!destStat) return copyFile(srcStat, src, dest, opts)
80-
return mayCopyFile(srcStat, src, dest, opts)
81-
}
8279

83-
async function mayCopyFile (srcStat, src, dest, opts) {
8480
if (opts.overwrite) {
8581
await fs.unlink(dest)
8682
return copyFile(srcStat, src, dest, opts)
@@ -104,7 +100,6 @@ async function handleTimestampsAndMode (srcMode, src, dest) {
104100
// (through utimes call)
105101
if (fileIsNotWritable(srcMode)) {
106102
await makeFileWritable(dest, srcMode)
107-
return setDestTimestampsAndMode(srcMode, src, dest)
108103
}
109104
return setDestTimestampsAndMode(srcMode, src, dest)
110105
}
@@ -118,33 +113,27 @@ function makeFileWritable (dest, srcMode) {
118113
}
119114

120115
async function setDestTimestampsAndMode (srcMode, src, dest) {
121-
await setDestTimestamps(src, dest)
122-
return setDestMode(dest, srcMode)
123-
}
124-
125-
function setDestMode (dest, srcMode) {
126-
return fs.chmod(dest, srcMode)
127-
}
128-
129-
async function setDestTimestamps (src, dest) {
130116
// The initial srcStat.atime cannot be trusted
131117
// because it is modified by the read(2) system call
132-
// (See https://nodejs.org/api/fs.html#fs$stat_time_values)
118+
// (See https://nodejs.org/api/fs.html#fs_stat_time_values)
133119
const updatedSrcStat = await fs.stat(src)
120+
await utimesMillisAsync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)
134121

135-
return utimesMillisAsync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)
122+
return setDestMode(dest, srcMode)
136123
}
137124

138-
function onDir (srcStat, destStat, src, dest, opts) {
139-
if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts)
140-
return copyDir(src, dest, opts)
125+
function setDestMode (dest, srcMode) {
126+
return fs.chmod(dest, srcMode)
141127
}
142128

143-
async function mkDirAndCopy (srcMode, src, dest, opts) {
144-
await fs.mkdir(dest)
129+
async function onDir (srcStat, destStat, src, dest, opts) {
130+
if (!destStat) {
131+
await fs.mkdir(dest)
132+
}
145133
await copyDir(src, dest, opts)
146-
147-
return setDestMode(dest, srcMode)
134+
if (!destStat) {
135+
await setDestMode(dest, srcStat.mode)
136+
}
148137
}
149138

150139
async function copyDir (src, dest, opts) {
@@ -185,6 +174,9 @@ async function onLink (destStat, src, dest, opts) {
185174
try {
186175
resolvedDest = await fs.readlink(dest)
187176
} catch (e) {
177+
// dest exists and is a regular file or directory,
178+
// Windows may throw UNKNOWN error. If dest already exists,
179+
// fs throws error anyway, so no need to guard against it here.
188180
if (e.code === 'EINVAL' || e.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest)
189181
throw e
190182
}
@@ -202,10 +194,6 @@ async function onLink (destStat, src, dest, opts) {
202194
throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
203195
}
204196

205-
return copyLink(resolvedSrc, dest)
206-
}
207-
208-
async function copyLink (resolvedSrc, dest) {
209197
await fs.unlink(dest)
210198
return fs.symlink(resolvedSrc, dest)
211199
}

0 commit comments

Comments
 (0)