Merge pull request #333 from jprichardson/overwrite

Rename clobber to overwrite
This commit is contained in:
JP Richardson 2016-12-29 22:03:07 -06:00 committed by GitHub
commit f6e2109a95
9 changed files with 129 additions and 48 deletions

View File

@ -127,8 +127,8 @@ Methods
Copy a file or directory. The directory can have contents. Like `cp -r`.
Options:
- clobber (boolean): overwrite existing file or directory, default is `true`. _Note that the copy operation will silently fail if you set this to `false` and the destination exists._ Use the `errorOnExist` option to change this behavior.
- errorOnExist (boolean): when `clobber` is `false` and the destination exists, throw an error. Default is `false`.
- overwrite (boolean): overwrite existing file or directory, default is `true`. _Note that the copy operation will silently fail if you set this to `false` and the destination exists._ Use the `errorOnExist` option to change this behavior.
- errorOnExist (boolean): when `overwrite` is `false` and the destination exists, throw an error. Default is `false`.
- dereference (boolean): dereference symlinks, default is `false`.
- preserveTimestamps (boolean): will set last modification and access times to the ones of the original source files, default is `false`.
- filter: Function to filter copied files. Return `true` to include, `false` to exclude. This can also be a RegExp, however this is deprecated (See [issue #239](https://github.com/jprichardson/node-fs-extra/issues/239) for background). _Warning: `copySync` currently applies the filter only to files (see [#180](https://github.com/jprichardson/node-fs-extra/issues/180)). This will be fixed in a future release._
@ -284,7 +284,7 @@ fs.mkdirsSync('/tmp/another/path')
Moves a file or directory, even across devices.
Options:
- clobber (boolean): overwrite existing file or directory
- overwrite (boolean): overwrite existing file or directory, default is `false`
Example:

View File

@ -121,7 +121,7 @@ describe('+ copySync()', function () {
})
})
describe('> when clobber option is passed', function () {
describe('> when overwrite option is passed', function () {
var src, dest
var srcData = 'some src data'
@ -134,17 +134,17 @@ describe('+ copySync()', function () {
})
describe('> when destination file does NOT exist', function () {
describe('> when clobber is true', function () {
describe('> when overwrite is true', function () {
it('should copy the file and not throw an error', function () {
fs.copySync(src, dest, {clobber: true})
fs.copySync(src, dest, {overwrite: true})
var destData = fs.readFileSync(dest, 'utf8')
assert.strictEqual(srcData, destData)
})
})
describe('> when clobber is false', function () {
describe('> when overwrite is false', function () {
it('should copy the file and not throw an error', function () {
fs.copySync(src, dest, {clobber: false})
fs.copySync(src, dest, {overwrite: false})
var destData = fs.readFileSync(dest, 'utf8')
assert.strictEqual(srcData, destData)
})
@ -158,17 +158,17 @@ describe('+ copySync()', function () {
fs.writeFileSync(dest, destData)
})
describe('> when clobber is true', function () {
describe('> when overwrite is true', function () {
it('should copy the file and not throw an error', function () {
fs.copySync(src, dest, {clobber: true})
fs.copySync(src, dest, {overwrite: true})
destData = fs.readFileSync(dest, 'utf8')
assert.strictEqual(srcData, destData)
})
})
describe('> when clobber is false', function () {
describe('> when overwrite is false', function () {
it('should not throw an error', function () {
fs.copySync(src, dest, {clobber: false})
fs.copySync(src, dest, {overwrite: false})
// copy never happened
var destDataNew = fs.readFileSync(dest, 'utf8')
@ -176,7 +176,7 @@ describe('+ copySync()', function () {
})
it('should throw an error when errorOnExist is true', function () {
assert.throws(function () {
fs.copySync(src, dest, {clobber: false, errorOnExist: true})
fs.copySync(src, dest, {overwrite: false, errorOnExist: true})
})
// copy never happened
@ -185,11 +185,11 @@ describe('+ copySync()', function () {
})
})
describe('> when clobber is true and dest is readonly', function () {
describe('> when overwrite is true and dest is readonly', function () {
it('should copy the file and not throw an error', function () {
try {
fs.chmodSync(dest, parseInt('444', 8))
fs.copySync(src, dest, {clobber: true})
fs.copySync(src, dest, {overwrite: true})
destData = fs.readFileSync(dest, 'utf8')
assert.strictEqual(srcData, destData)
} finally {
@ -200,5 +200,25 @@ describe('+ copySync()', function () {
})
})
})
describe('clobber', function () {
var src, dest, srcData, destData
beforeEach(function () {
src = path.join(TEST_DIR, 'src-file')
dest = path.join(TEST_DIR, 'des-file')
srcData = 'some src data'
destData = 'some dest data'
fs.writeFileSync(src, srcData)
fs.writeFileSync(dest, destData)
})
it('is an alias for overwrite', function () {
fs.copySync(src, dest, {clobber: false})
// copy never happened
var destDataNew = fs.readFileSync(dest, 'utf8')
assert.strictEqual(destData, destDataNew)
})
})
})
})

View File

@ -4,12 +4,12 @@ var BUF_LENGTH = 64 * 1024
var _buff = new Buffer(BUF_LENGTH)
function copyFileSync (srcFile, destFile, options) {
var clobber = options.clobber
var overwrite = options.overwrite
var errorOnExist = options.errorOnExist
var preserveTimestamps = options.preserveTimestamps
if (fs.existsSync(destFile)) {
if (clobber) {
if (overwrite) {
fs.unlinkSync(destFile)
} else if (errorOnExist) {
throw new Error(destFile + ' already exists')

View File

@ -13,6 +13,8 @@ function copySync (src, dest, options) {
// default to true for now
options.clobber = 'clobber' in options ? !!options.clobber : true
// overwrite falls back to clobber
options.overwrite = 'overwrite' in options ? !!options.overwrite : options.clobber
options.dereference = 'dereference' in options ? !!options.dereference : false
options.preserveTimestamps = 'preserveTimestamps' in options ? !!options.preserveTimestamps : false
@ -37,7 +39,7 @@ function copySync (src, dest, options) {
if (stats.isFile() && performCopy) {
if (!destFolderExists) mkdir.mkdirsSync(destFolder)
copyFileSync(src, dest, {
clobber: options.clobber,
overwrite: options.overwrite,
errorOnExist: options.errorOnExist,
preserveTimestamps: options.preserveTimestamps
})

View File

@ -67,7 +67,7 @@ describe('ncp', function () {
})
})
describe('when using clobber=true', function () {
describe('when using overwrite=true', function () {
before(function () {
this.originalCreateReadStream = fs.createReadStream
})
@ -77,7 +77,7 @@ describe('ncp', function () {
})
it('the copy is complete after callback', function (done) {
ncp(src, out, {clobber: true}, function (err) {
ncp(src, out, {overwrite: true}, function (err) {
fs.createReadStream = function () {
done(new Error('createReadStream after callback'))
}
@ -87,25 +87,43 @@ describe('ncp', function () {
})
})
describe('when using clobber=false', function () {
describe('when using overwrite=false', function () {
beforeEach(function (done) {
rimraf(out, done)
})
it('works', function (cb) {
ncp(src, out, {clobber: false}, function (err) {
ncp(src, out, {overwrite: false}, function (err) {
assert.ifError(err)
cb()
})
})
it('should not error if files exist', function (cb) {
ncp(src, out, function () {
ncp(src, out, {clobber: false}, function (err) {
ncp(src, out, {overwrite: false}, function (err) {
assert.ifError(err)
cb()
})
})
})
it('should error if errorOnExist and file exists', function (cb) {
ncp(src, out, function () {
ncp(src, out, {
overwrite: false,
errorOnExist: true
}, function (err) {
assert(err)
cb()
})
})
})
})
describe('clobber', function () {
beforeEach(function (done) {
rimraf(out, done)
})
it('is an alias for overwrite', function (cb) {
ncp(src, out, function () {
ncp(src, out, {
clobber: false,

View File

@ -16,7 +16,10 @@ function ncp (source, dest, options, callback) {
var filter = options.filter
var transform = options.transform
var clobber = options.clobber !== false // default true
var overwrite = options.overwrite
// If overwrite is undefined, use clobber, otherwise default to true:
if (overwrite === undefined) overwrite = options.clobber
if (overwrite === undefined) overwrite = true
var errorOnExist = options.errorOnExist
var dereference = options.dereference
var preserveTimestamps = options.preserveTimestamps === true
@ -78,7 +81,7 @@ function ncp (source, dest, options, callback) {
if (writable) {
copyFile(file, target)
} else {
if (clobber) {
if (overwrite) {
rmFile(target, function () {
copyFile(file, target)
})

View File

@ -6,7 +6,7 @@ var fse = require(process.cwd())
/* global afterEach, beforeEach, describe, it */
describe('move / clobber', function () {
describe('move / overwrite', function () {
var TEST_DIR, FIXTURES_DIR
beforeEach(function (done) {
@ -26,9 +26,9 @@ describe('move / clobber', function () {
fse.remove(TEST_DIR, done)
})
describe('> when clobber = true', function () {
describe('> when overwrite = true', function () {
describe('> when dest is a directory', function () {
it('should clobber the destination', function (done) {
it('should overwrite the destination', function (done) {
// Tests fail on appveyor/Windows due to
// https://github.com/isaacs/node-graceful-fs/issues/98.
// Workaround by increasing the timeout by a minute (because
@ -54,7 +54,7 @@ describe('move / clobber', function () {
assert(paths.indexOf('some-file') >= 0)
assert(paths.indexOf('some-folder') >= 0)
fse.move(src, dest, {clobber: true}, function (err) {
fse.move(src, dest, {overwrite: true}, function (err) {
if (err) return done(err)
// verify dest does not have old stuff
@ -71,4 +71,42 @@ describe('move / clobber', function () {
})
})
})
describe('> clobber', function () {
it('is an alias for overwrite', function (done) {
// Tests fail on appveyor/Windows due to
// https://github.com/isaacs/node-graceful-fs/issues/98.
// Workaround by increasing the timeout by a minute (because
// graceful times out after a minute).
this.timeout(90000)
// use fixtures dir as dest since it has stuff
var dest = FIXTURES_DIR
var paths = fs.readdirSync(dest)
// verify dest has stuff
assert(paths.indexOf('a-file') >= 0)
// create new source dir
var src = path.join(TEST_DIR, 'src')
fse.ensureDirSync(src)
fs.writeFileSync(path.join(src, 'some-file'), 'hi')
// verify source has stuff
paths = fs.readdirSync(src)
assert(paths.indexOf('some-file') >= 0)
fse.move(src, dest, {clobber: true}, function (err) {
if (err) return done(err)
// verify dest does not have old stuff
var paths = fs.readdirSync(dest)
assert.strictEqual(paths.indexOf('a-file'), -1)
// verify dest has new stuff
assert(paths.indexOf('some-file') >= 0)
done()
})
})
})
})

View File

@ -68,14 +68,14 @@ describe('move', function () {
})
})
it('should not overwrite if clobber = false', function (done) {
it('should not overwrite if overwrite = false', function (done) {
var src = FIXTURES_DIR + '/a-file'
var dest = FIXTURES_DIR + '/a-folder/another-file'
// verify file exists already
assert(fs.existsSync(dest))
fse.move(src, dest, {clobber: false}, function (err) {
fse.move(src, dest, {overwrite: false}, function (err) {
assert.ok(err && err.code === 'EEXIST', 'throw EEXIST')
done()
})
@ -173,7 +173,7 @@ describe('move', function () {
})
})
it('should clobber folders across devices', function (done) {
it('should overwrite folders across devices', function (done) {
var src = FIXTURES_DIR + '/a-folder'
var dest = FIXTURES_DIR + '/a-folder-dest'
@ -181,7 +181,7 @@ describe('move', function () {
setUpMockFs('EXDEV')
fse.move(src, dest, {clobber: true}, function (err) {
fse.move(src, dest, {overwrite: true}, function (err) {
assert.ifError(err)
assert.strictEqual(fs.rename.callCount, 1)

View File

@ -17,7 +17,7 @@ function mv (source, dest, options, callback) {
}
var shouldMkdirp = ('mkdirp' in options) ? options.mkdirp : true
var clobber = ('clobber' in options) ? options.clobber : false
var overwrite = options.overwrite || options.clobber || false
if (shouldMkdirp) {
mkdirs()
@ -33,14 +33,14 @@ function mv (source, dest, options, callback) {
}
function doRename () {
if (clobber) {
if (overwrite) {
fs.rename(source, dest, function (err) {
if (!err) return callback()
if (err.code === 'ENOTEMPTY' || err.code === 'EEXIST') {
remove(dest, function (err) {
if (err) return callback(err)
options.clobber = false // just clobbered it, no need to do it again
options.overwrite = false // just overwriteed it, no need to do it again
mv(source, dest, options, callback)
})
return
@ -51,7 +51,7 @@ function mv (source, dest, options, callback) {
setTimeout(function () {
remove(dest, function (err) {
if (err) return callback(err)
options.clobber = false
options.overwrite = false
mv(source, dest, options, callback)
})
}, 200)
@ -59,13 +59,13 @@ function mv (source, dest, options, callback) {
}
if (err.code !== 'EXDEV') return callback(err)
moveAcrossDevice(source, dest, clobber, callback)
moveAcrossDevice(source, dest, overwrite, callback)
})
} else {
fs.link(source, dest, function (err) {
if (err) {
if (err.code === 'EXDEV' || err.code === 'EISDIR' || err.code === 'EPERM') {
moveAcrossDevice(source, dest, clobber, callback)
moveAcrossDevice(source, dest, overwrite, callback)
return
}
callback(err)
@ -77,7 +77,7 @@ function mv (source, dest, options, callback) {
}
}
function moveAcrossDevice (source, dest, clobber, callback) {
function moveAcrossDevice (source, dest, overwrite, callback) {
fs.stat(source, function (err, stat) {
if (err) {
callback(err)
@ -85,15 +85,15 @@ function moveAcrossDevice (source, dest, clobber, callback) {
}
if (stat.isDirectory()) {
moveDirAcrossDevice(source, dest, clobber, callback)
moveDirAcrossDevice(source, dest, overwrite, callback)
} else {
moveFileAcrossDevice(source, dest, clobber, callback)
moveFileAcrossDevice(source, dest, overwrite, callback)
}
})
}
function moveFileAcrossDevice (source, dest, clobber, callback) {
var outFlags = clobber ? 'w' : 'wx'
function moveFileAcrossDevice (source, dest, overwrite, callback) {
var outFlags = overwrite ? 'w' : 'wx'
var ins = fs.createReadStream(source)
var outs = fs.createWriteStream(dest, {flags: outFlags})
@ -108,7 +108,7 @@ function moveFileAcrossDevice (source, dest, clobber, callback) {
fs.unlink(dest, function () {
// note: `err` here is from the input stream errror
if (err.code === 'EISDIR' || err.code === 'EPERM') {
moveDirAcrossDevice(source, dest, clobber, callback)
moveDirAcrossDevice(source, dest, overwrite, callback)
} else {
callback(err)
}
@ -130,10 +130,10 @@ function moveFileAcrossDevice (source, dest, clobber, callback) {
}
}
function moveDirAcrossDevice (source, dest, clobber, callback) {
function moveDirAcrossDevice (source, dest, overwrite, callback) {
var options = {
stopOnErr: true,
clobber: false
overwrite: false
}
function startNcp () {
@ -143,7 +143,7 @@ function moveDirAcrossDevice (source, dest, clobber, callback) {
})
}
if (clobber) {
if (overwrite) {
remove(dest, function (err) {
if (err) return callback(err)
startNcp()