new options: 'preserveFiles' and 'inflateSymlinks' #38
7 changed files with 157 additions and 4 deletions
|
|
@ -151,7 +151,7 @@ exports.rmdirSyncRecursive = function(path, failSilent) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now that we know everything in the sub-tree has been deleted, we can delete the main
|
/* Now that we know everything in the sub-tree has been deleted, we can delete the main
|
||||||
directory. Huzzah for the shopkeep. */
|
directory. Huzzah for the shopkeep. */
|
||||||
return fs.rmdirSync(path);
|
return fs.rmdirSync(path);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -190,16 +190,35 @@ exports.copyDirSyncRecursive = function(sourceDir, newDirLocation, opts) {
|
||||||
if (opts.excludeHiddenUnix && /^\./.test(files[i])) continue;
|
if (opts.excludeHiddenUnix && /^\./.test(files[i])) continue;
|
||||||
|
|
||||||
var currFile = fs.lstatSync(sourceDir + "/" + files[i]);
|
var currFile = fs.lstatSync(sourceDir + "/" + files[i]);
|
||||||
|
|
||||||
|
var fCopyFile = function(srcFile, destFile) {
|
||||||
|
if (opts.preserveFiles && fs.existsSync(destFile)) return;
|
||||||
|
|
||||||
|
var contents = fs.readFileSync(srcFile);
|
||||||
|
fs.writeFileSync(destFile, contents);
|
||||||
|
};
|
||||||
|
|
||||||
if(currFile.isDirectory()) {
|
if(currFile.isDirectory()) {
|
||||||
/* recursion this thing right on back. */
|
/* recursion this thing right on back. */
|
||||||
exports.copyDirSyncRecursive(sourceDir + "/" + files[i], newDirLocation + "/" + files[i], opts);
|
exports.copyDirSyncRecursive(sourceDir + "/" + files[i], newDirLocation + "/" + files[i], opts);
|
||||||
} else if(currFile.isSymbolicLink()) {
|
} else if(currFile.isSymbolicLink()) {
|
||||||
var symlinkFull = fs.readlinkSync(sourceDir + "/" + files[i]);
|
var symlinkFull = fs.readlinkSync(sourceDir + "/" + files[i]);
|
||||||
fs.symlinkSync(symlinkFull, newDirLocation + "/" + files[i]);
|
|
||||||
|
if (!opts.inflateSymlinks) {
|
||||||
|
fs.symlinkSync(symlinkFull, newDirLocation + "/" + files[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var tmpCurrFile = fs.lstatSync(sourceDir + "/" + symlinkFull);
|
||||||
|
if (tmpCurrFile.isDirectory()) {
|
||||||
|
exports.copyDirSyncRecursive(sourceDir + "/" + symlinkFull, newDirLocation + "/" + files[i], opts);
|
||||||
|
} else {
|
||||||
|
/* At this point, we've hit a file actually worth copying... so copy it on over. */
|
||||||
|
fCopyFile(sourceDir + "/" + symlinkFull, newDirLocation + "/" + files[i]);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* At this point, we've hit a file actually worth copying... so copy it on over. */
|
/* At this point, we've hit a file actually worth copying... so copy it on over. */
|
||||||
var contents = fs.readFileSync(sourceDir + "/" + files[i]);
|
fCopyFile(sourceDir + "/" + files[i], newDirLocation + "/" + files[i]);
|
||||||
fs.writeFileSync(newDirLocation + "/" + files[i], contents);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,50 @@ function checkResultShown(test, files) {
|
||||||
test.deepEqual(files, check);
|
test.deepEqual(files, check);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function checkResultInflate(test, files) {
|
||||||
|
var check = [
|
||||||
|
'.hidden',
|
||||||
|
'bar.txt',
|
||||||
|
'test',
|
||||||
|
path.join('.hidden', 'dolor.md')
|
||||||
|
];
|
||||||
|
|
||||||
|
test.deepEqual(files, check);
|
||||||
|
|
||||||
|
test.deepEqual(fs.lstatSync(path.join(__dirname, 'testdir/.hidden')).isSymbolicLink(), false);
|
||||||
|
test.deepEqual(fs.lstatSync(path.join(__dirname, 'testdir/bar.txt')).isSymbolicLink(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkResultDontInflate(test, files) {
|
||||||
|
var check = [
|
||||||
|
'.hidden',
|
||||||
|
'bar.txt',
|
||||||
|
'test',
|
||||||
|
path.join('.hidden', 'dolor.md')
|
||||||
|
];
|
||||||
|
|
||||||
|
test.deepEqual(files, check);
|
||||||
|
|
||||||
|
test.deepEqual(fs.lstatSync(path.join(__dirname, 'testdir/.hidden')).isSymbolicLink(), true);
|
||||||
|
test.deepEqual(fs.lstatSync(path.join(__dirname, 'testdir/bar.txt')).isSymbolicLink(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkResultPreserveFiles(test, files) {
|
||||||
|
checkResultHidden(test, files);
|
||||||
|
var contents = fs.readFileSync(path.join(__dirname, path.join('testdir2', '.hidden.txt')), "utf8");
|
||||||
|
test.deepEqual(contents, 'hidden file');
|
||||||
|
contents = fs.readFileSync(path.join(__dirname, path.join('testdir2', 'bar.txt')), "utf8");
|
||||||
|
test.deepEqual(contents, 'shown file');
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkResultOverwriteFiles(test, files) {
|
||||||
|
checkResultHidden(test, files);
|
||||||
|
var contents = fs.readFileSync(path.join(__dirname, path.join('testdir2', '.hidden.txt')), "utf8");
|
||||||
|
test.deepEqual(contents, 'just some text for .hidden.txt');
|
||||||
|
contents = fs.readFileSync(path.join(__dirname, path.join('testdir2', 'bar.txt')), "utf8");
|
||||||
|
test.deepEqual(contents, 'just some text for bar.txt');
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = testCase({
|
module.exports = testCase({
|
||||||
test_copyDirSyncRecursiveHidden: function(test) {
|
test_copyDirSyncRecursiveHidden: function(test) {
|
||||||
var dir = path.join(__dirname, 'shown');
|
var dir = path.join(__dirname, 'shown');
|
||||||
|
|
@ -65,8 +109,93 @@ module.exports = testCase({
|
||||||
|
|
||||||
wrench.rmdirSyncRecursive(testdir);
|
wrench.rmdirSyncRecursive(testdir);
|
||||||
|
|
||||||
|
test.done();
|
||||||
|
},
|
||||||
|
test_copyDirSyncRecursiveInflate: function(test) {
|
||||||
|
var dir = path.join(__dirname, 'withsymlinks');
|
||||||
|
var testdir = path.join(__dirname, 'testdir');
|
||||||
|
|
||||||
|
test.ok(path.existsSync(dir), 'Folders should exist');
|
||||||
|
|
||||||
|
wrench.mkdirSyncRecursive(testdir, 0777);
|
||||||
|
wrench.copyDirSyncRecursive(dir, testdir, { excludeHiddenUnix: false, inflateSymlinks: true });
|
||||||
|
|
||||||
|
var files = wrench.readdirSyncRecursive(testdir);
|
||||||
|
|
||||||
|
checkResultInflate(test, files);
|
||||||
|
|
||||||
|
wrench.rmdirSyncRecursive(testdir);
|
||||||
|
|
||||||
|
test.done();
|
||||||
|
},
|
||||||
|
test_copyDirSyncRecursiveDontInflate: function(test) {
|
||||||
|
var dir = path.join(__dirname, 'withsymlinks');
|
||||||
|
var testdir = path.join(__dirname, 'testdir');
|
||||||
|
|
||||||
|
test.ok(path.existsSync(dir), 'Folders should exist');
|
||||||
|
|
||||||
|
wrench.mkdirSyncRecursive(testdir, 0777);
|
||||||
|
wrench.copyDirSyncRecursive(dir, testdir, { excludeHiddenUnix: false, inflateSymlinks: false });
|
||||||
|
|
||||||
|
var files = wrench.readdirSyncRecursive(testdir);
|
||||||
|
|
||||||
|
checkResultDontInflate(test, files);
|
||||||
|
|
||||||
|
wrench.rmdirSyncRecursive(testdir);
|
||||||
|
|
||||||
|
test.done();
|
||||||
|
},
|
||||||
|
test_copyDirSyncRecursivePreserveFiles: function(test) {
|
||||||
|
var dir = path.join(__dirname, 'shown'),
|
||||||
|
testdir1 = path.join(__dirname, 'testdir1'),
|
||||||
|
testdir2 = path.join(__dirname, 'testdir2');
|
||||||
|
|
||||||
|
test.ok(path.existsSync(dir), 'Folders should exist');
|
||||||
|
|
||||||
|
wrench.mkdirSyncRecursive(testdir1, 0777);
|
||||||
|
wrench.copyDirSyncRecursive(dir, testdir1, { excludeHiddenUnix: false });
|
||||||
|
wrench.copyDirSyncRecursive(dir, testdir2, { excludeHiddenUnix: false });
|
||||||
|
|
||||||
|
fs.writeFileSync(path.join(testdir1, ".hidden.txt"), 'just some text for .hidden.txt');
|
||||||
|
fs.writeFileSync(path.join(testdir1, "bar.txt"), 'just some text for bar.txt');
|
||||||
|
|
||||||
|
wrench.copyDirSyncRecursive(testdir1, testdir2, { preserve: true, excludeHiddenUnix: false, preserveFiles: true });
|
||||||
|
|
||||||
|
var files = wrench.readdirSyncRecursive(testdir2);
|
||||||
|
|
||||||
|
checkResultPreserveFiles(test, files);
|
||||||
|
|
||||||
|
wrench.rmdirSyncRecursive(testdir1);
|
||||||
|
wrench.rmdirSyncRecursive(testdir2);
|
||||||
|
|
||||||
|
test.done();
|
||||||
|
},
|
||||||
|
test_copyDirSyncRecursiveOverwriteFiles: function(test) {
|
||||||
|
var dir = path.join(__dirname, 'shown'),
|
||||||
|
testdir1 = path.join(__dirname, 'testdir1'),
|
||||||
|
testdir2 = path.join(__dirname, 'testdir2');
|
||||||
|
|
||||||
|
test.ok(path.existsSync(dir), 'Folders should exist');
|
||||||
|
|
||||||
|
wrench.mkdirSyncRecursive(testdir1, 0777);
|
||||||
|
wrench.copyDirSyncRecursive(dir, testdir1, { excludeHiddenUnix: false });
|
||||||
|
wrench.copyDirSyncRecursive(dir, testdir2, { excludeHiddenUnix: false });
|
||||||
|
|
||||||
|
fs.writeFileSync(path.join(testdir1, ".hidden.txt"), 'just some text for .hidden.txt');
|
||||||
|
fs.writeFileSync(path.join(testdir1, "bar.txt"), 'just some text for bar.txt');
|
||||||
|
|
||||||
|
wrench.copyDirSyncRecursive(testdir1, testdir2, { preserve: true, excludeHiddenUnix: false, preserveFiles: false });
|
||||||
|
|
||||||
|
var files = wrench.readdirSyncRecursive(testdir2);
|
||||||
|
|
||||||
|
checkResultOverwriteFiles(test, files);
|
||||||
|
|
||||||
|
wrench.rmdirSyncRecursive(testdir1);
|
||||||
|
wrench.rmdirSyncRecursive(testdir2);
|
||||||
|
|
||||||
test.done();
|
test.done();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// vim: et ts=4 sw=4
|
// vim: et ts=4 sw=4
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
hidden file
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
shown file
|
||||||
1
tests/withsymlinks/.hidden
Symbolic link
1
tests/withsymlinks/.hidden
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../shown/.hidden
|
||||||
1
tests/withsymlinks/bar.txt
Symbolic link
1
tests/withsymlinks/bar.txt
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../shown/bar.txt
|
||||||
1
tests/withsymlinks/test
Normal file
1
tests/withsymlinks/test
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
aaa bbb ccc ddd
|
||||||
Reference in a new issue