mirror of
https://github.com/jprichardson/node-fs-extra.git
synced 2026-01-25 16:42:57 +00:00
Merge pull request #333 from jprichardson/overwrite
Rename clobber to overwrite
This commit is contained in:
commit
f6e2109a95
@ -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:
|
||||
|
||||
|
||||
@ -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)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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
|
||||
})
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
})
|
||||
|
||||
@ -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()
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user