Skip to content

Commit 8377b92

Browse files
committed
fix(cp): add -n option, make -f default behavior
1 parent f729896 commit 8377b92

File tree

3 files changed

+27
-8
lines changed

3 files changed

+27
-8
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`
209209
### cp([options,] source_array, dest)
210210
Available options:
211211

212-
+ `-f`: force
212+
+ `-f`: force (default behavior)
213+
+ `-n`: no-clobber
213214
+ `-r, -R`: recursive
214215

215216
Examples:

src/cp.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) {
7676
fs.symlinkSync(symlinkFull, destFile, os.platform() === "win32" ? "junction" : null);
7777
} else {
7878
/* At this point, we've hit a file actually worth copying... so copy it on over. */
79-
if (fs.existsSync(destFile) && !opts.force) {
79+
if (fs.existsSync(destFile) && opts.no_force) {
8080
common.log('skipping existing file: ' + files[i]);
8181
} else {
8282
copyFileSync(srcFile, destFile);
@@ -92,7 +92,8 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) {
9292
//@ ### cp([options,] source_array, dest)
9393
//@ Available options:
9494
//@
95-
//@ + `-f`: force
95+
//@ + `-f`: force (default behavior)
96+
//@ + `-n`: no-clobber
9697
//@ + `-r, -R`: recursive
9798
//@
9899
//@ Examples:
@@ -106,7 +107,8 @@ function cpdirSyncRecursive(sourceDir, destDir, opts) {
106107
//@ Copies files. The wildcard `*` is accepted.
107108
function _cp(options, sources, dest) {
108109
options = common.parseOptions(options, {
109-
'f': 'force',
110+
'f': '!no_force',
111+
'n': 'no_force',
110112
'R': 'recursive',
111113
'r': 'recursive'
112114
});
@@ -133,7 +135,7 @@ function _cp(options, sources, dest) {
133135
common.error('dest is not a directory (too many sources)');
134136

135137
// Dest is an existing file, but no -f given
136-
if (exists && stats.isFile() && !options.force)
138+
if (exists && stats.isFile() && options.no_force)
137139
common.error('dest file already exists: ' + dest);
138140

139141
if (options.recursive) {
@@ -184,7 +186,7 @@ function _cp(options, sources, dest) {
184186
}
185187
}
186188

187-
cpdirSyncRecursive(src, newDest, {force: options.force});
189+
cpdirSyncRecursive(src, newDest, {no_force: options.no_force});
188190
}
189191
return; // done with dir
190192
}
@@ -197,7 +199,7 @@ function _cp(options, sources, dest) {
197199
if (fs.existsSync(dest) && fs.statSync(dest).isDirectory())
198200
thisDest = path.normalize(dest + '/' + path.basename(src));
199201

200-
if (fs.existsSync(thisDest) && !options.force) {
202+
if (fs.existsSync(thisDest) && options.no_force) {
201203
common.error('dest file already exists: ' + thisDest, true);
202204
return; // skip file
203205
}

test/cp.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ assert.equal(fs.existsSync('tmp/asdfasdf2'), false);
4646
shell.cp('asdfasdf1', 'asdfasdf2', 'resources/file1'); // too many sources (dest is file)
4747
assert.ok(shell.error());
4848

49-
shell.cp('resources/file1', 'resources/file2'); // dest already exists
49+
shell.cp('-n', 'resources/file1', 'resources/file2'); // dest already exists
5050
assert.ok(shell.error());
5151

5252
shell.cp('resources/file1', 'resources/file2', 'tmp/a_file'); // too many sources
@@ -57,6 +57,22 @@ assert.equal(fs.existsSync('tmp/a_file'), false);
5757
// Valids
5858
//
5959

60+
// -f by default
61+
shell.cp('resources/file2', 'resources/copyfile2');
62+
shell.cp('resources/file1', 'resources/file2'); // dest already exists
63+
assert.ok(!shell.error());
64+
assert.equal(shell.cat('resources/file1'), shell.cat('resources/file2')); // after cp
65+
shell.mv('resources/copyfile2', 'resources/file2'); // restore
66+
assert.ok(!shell.error());
67+
68+
// -f (explicitly)
69+
shell.cp('resources/file2', 'resources/copyfile2');
70+
shell.cp('-f', 'resources/file1', 'resources/file2'); // dest already exists
71+
assert.ok(!shell.error());
72+
assert.equal(shell.cat('resources/file1'), shell.cat('resources/file2')); // after cp
73+
shell.mv('resources/copyfile2', 'resources/file2'); // restore
74+
assert.ok(!shell.error());
75+
6076
// simple - to dir
6177
shell.cp('resources/file1', 'tmp');
6278
assert.equal(shell.error(), null);

0 commit comments

Comments
 (0)