Thanks to visit codestin.com
Credit goes to github.com

Skip to content
2 changes: 1 addition & 1 deletion src/cp.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ function _cp(options, sources, dest) {

try {
common.statFollowLinks(path.dirname(dest));
cpdirSyncRecursive(src, newDest, 0, { no_force: options.no_force, followsymlink: options.followsymlink });
cpdirSyncRecursive(src, newDest, 0, { no_force: options.no_force, followsymlink: options.followsymlink, update: options.update });
} catch (e) {
/* istanbul ignore next */
common.error("cannot create directory '" + dest + "': No such file or directory");
Expand Down
44 changes: 44 additions & 0 deletions test/cp.js
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,50 @@ test('-R implies -P', t => {
});
});

test('-Ru respects the -u flag recursively (don\'t update newer file)', t => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You might be able to replace this with a template literal to avoid escaping the apostrophe. I can't remember if our lint currently forbids this (see #788). If lint complains, just leave as-is.

// Setup code
const TWO_DAYS_IN_MS = 2 * 24 * 60 * 60 * 1000;
const dir = `${t.context.tmp}/cp-Ru`;
const sourceDir = `${dir}/old`;
const sourceFile = `${sourceDir}/file`;
const destDir = `${dir}/new`;
const destFile = `${destDir}/file`;
[sourceDir, destDir].forEach(d => shell.mkdir('-p', d));
shell.ShellString('Source File Contents\n').to(sourceFile);
shell.ShellString('Destination File Contents\n').to(destFile);
// End setup
// Get the old mtime for dest
const oldTime = fs.statSync(destFile).mtimeMs;
// Set the source file to be older than the destination file
shell.touch('-m', oldTime - TWO_DAYS_IN_MS, sourceFile);
// Now, copy the old dir to the new one
shell.cp('-Ru', sourceDir, destDir);
// Check that dest has not been updated
t.is(shell.cat(destFile).stdout, 'Destination File Contents\n');
});

test('-Ru respects the -u flag recursively (update older file)', t => {
// Setup code
const TWO_DAYS_IN_MS = 2 * 24 * 60 * 60 * 1000;
const dir = `${t.context.tmp}/cp-Ru`;
const sourceDir = `${dir}/old`;
const sourceFile = `${sourceDir}/file`;
const destDir = `${dir}/new`;
const destFile = `${destDir}/file`;
[sourceDir, destDir].forEach(d => shell.mkdir('-p', d));
shell.ShellString('Source File Contents\n').to(sourceFile);
shell.ShellString('Destination File Contents\n').to(destFile);
// End setup
// Get the old mtime for dest
const oldTime = fs.statSync(destFile).mtimeMs;
// Set the destination file to be older than the source file
shell.touch('-m', oldTime + TWO_DAYS_IN_MS, sourceFile);
// Now, copy the old dir to the new one
shell.cp('-Ru', sourceDir, destDir);
// Check that dest has been updated
t.is(shell.cat(sourceFile).stdout, 'Source File Contents\n');
});

test('using -P explicitly works', t => {
utils.skipOnWin(t, () => {
shell.cp('-P', 'test/resources/cp/links/sym.lnk', t.context.tmp);
Expand Down