diff --git a/lib/copy-sync/__tests__/copy-sync-preserve-time.test.js b/lib/copy-sync/__tests__/copy-sync-preserve-time.test.js index 6a4ad9f2..3f9f60ce 100644 --- a/lib/copy-sync/__tests__/copy-sync-preserve-time.test.js +++ b/lib/copy-sync/__tests__/copy-sync-preserve-time.test.js @@ -21,11 +21,11 @@ describeIf64('copySync', () => { require(process.cwd()).emptyDir(TEST_DIR, done) }) - describe('> modification option', () => { + describe('> preserveTimestamps option', () => { const SRC_FIXTURES_DIR = path.join(__dirname, './fixtures') const FILES = ['a-file', path.join('a-folder', 'another-file'), path.join('a-folder', 'another-folder', 'file3')] - describe('> when modified option is turned off', () => { + describe('> when preserveTimestamps option is false', () => { it('should have different timestamps on copy', () => { const from = path.join(SRC_FIXTURES_DIR) copySync(from, TEST_DIR, {preserveTimestamps: false}) @@ -33,7 +33,7 @@ describeIf64('copySync', () => { }) }) - describe('> when modified option is turned on', () => { + describe('> when preserveTimestamps option is true', () => { it('should have the same timestamps on copy', () => { const from = path.join(SRC_FIXTURES_DIR) copySync(from, TEST_DIR, {preserveTimestamps: true}) diff --git a/lib/copy-sync/copy-file-sync.js b/lib/copy-sync/copy-file-sync.js index 102a6be6..452ca6cc 100644 --- a/lib/copy-sync/copy-file-sync.js +++ b/lib/copy-sync/copy-file-sync.js @@ -1,6 +1,7 @@ 'use strict' const fs = require('graceful-fs') +const utimesSync = require('../util/utimes.js').utimesMillisSync const BUF_LENGTH = 64 * 1024 const _buff = require('../util/buffer')(BUF_LENGTH) @@ -18,6 +19,17 @@ function copyFileSync (srcFile, destFile, options) { } else return } + if (typeof fs.copyFileSync === 'function') { + fs.copyFileSync(srcFile, destFile) + const st = fs.lstatSync(srcFile) + fs.chmodSync(destFile, st.mode) + if (preserveTimestamps) utimesSync(destFile, st.atime, st.mtime) + return undefined + } + return copyFileSyncFallback(srcFile, destFile, preserveTimestamps) +} + +function copyFileSyncFallback (srcFile, destFile, preserveTimestamps) { const fdr = fs.openSync(srcFile, 'r') const stat = fs.fstatSync(fdr) const fdw = fs.openSync(destFile, 'w', stat.mode) @@ -30,10 +42,7 @@ function copyFileSync (srcFile, destFile, options) { pos += bytesRead } - if (preserveTimestamps) { - fs.futimesSync(fdw, stat.atime, stat.mtime) - } - + if (preserveTimestamps) fs.futimesSync(fdw, stat.atime, stat.mtime) fs.closeSync(fdr) fs.closeSync(fdw) } diff --git a/lib/copy/copy.js b/lib/copy/copy.js index 32463b6e..5288dd1c 100644 --- a/lib/copy/copy.js +++ b/lib/copy/copy.js @@ -100,7 +100,7 @@ function copyFile (srcStat, src, dest, opts, cb) { if (typeof fs.copyFile === 'function') { return fs.copyFile(src, dest, err => { if (err) return cb(err) - return handleDestModeAndTimestamps(srcStat, dest, opts, cb) + return setDestModeAndTimestamps(srcStat, dest, opts, cb) }) } return copyFileFallback(srcStat, src, dest, opts, cb) @@ -114,10 +114,10 @@ function copyFileFallback (srcStat, src, dest, opts, cb) { ws.on('error', err => cb(err)) ws.on('open', () => rs.pipe(ws)) - .once('close', () => handleDestModeAndTimestamps(srcStat, dest, opts, cb)) + .once('close', () => setDestModeAndTimestamps(srcStat, dest, opts, cb)) } -function handleDestModeAndTimestamps (srcStat, dest, opts, cb) { +function setDestModeAndTimestamps (srcStat, dest, opts, cb) { fs.chmod(dest, srcStat.mode, err => { if (err) return cb(err) if (opts.preserveTimestamps) { diff --git a/lib/util/utimes.js b/lib/util/utimes.js index 4c320993..8916a1b8 100644 --- a/lib/util/utimes.js +++ b/lib/util/utimes.js @@ -64,9 +64,16 @@ function utimesMillis (path, atime, mtime, callback) { }) } +function utimesMillisSync (path, atime, mtime) { + const fd = fs.openSync(path, 'r+') + fs.futimesSync(fd, atime, mtime) + return fs.closeSync(fd) +} + module.exports = { hasMillisRes, hasMillisResSync, timeRemoveMillis, - utimesMillis + utimesMillis, + utimesMillisSync }