kopia lustrzana https://github.com/c9/core
134 wiersze
3.6 KiB
JavaScript
134 wiersze
3.6 KiB
JavaScript
|
var fs = require('fs');
|
||
|
var path = require('path');
|
||
|
var mkdirSync = require('mkdirp').sync;
|
||
|
|
||
|
function convertPath(dir){
|
||
|
if (process.platform == 'win32' && dir[0] == '/')
|
||
|
dir = dir.replace(/(?:\/cygdrive)?\/(\w)\//, '$1:/');
|
||
|
return dir;
|
||
|
}
|
||
|
|
||
|
function copyBinaryFile(srcFile, destFile) {
|
||
|
var BUF_LENGTH = 64*1024;
|
||
|
var buf = new Buffer(BUF_LENGTH);
|
||
|
var bytesRead = BUF_LENGTH;
|
||
|
var pos = 0;
|
||
|
var fdr = fs.openSync(srcFile, 'r');
|
||
|
var fdw = fs.openSync(destFile, 'w');
|
||
|
|
||
|
while (bytesRead === BUF_LENGTH) {
|
||
|
bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos);
|
||
|
fs.writeSync(fdw, buf, 0, bytesRead);
|
||
|
pos += bytesRead;
|
||
|
}
|
||
|
|
||
|
fs.closeSync(fdr);
|
||
|
fs.closeSync(fdw);
|
||
|
}
|
||
|
|
||
|
function $testFn(re) {
|
||
|
if (!re || typeof re == "function") return re;
|
||
|
return function(name) { return re.test(name); };
|
||
|
}
|
||
|
|
||
|
function copy(from, to, options) {
|
||
|
from = convertPath(from);
|
||
|
to = convertPath(to);
|
||
|
if (!options) options = {};
|
||
|
var exclude = $testFn(options.exclude);
|
||
|
var include = $testFn(options.include);
|
||
|
if (!options.onError) options.onError = logError;
|
||
|
|
||
|
function excludePath(name, parent) {
|
||
|
if ((exclude && exclude(name, parent)) && !(include && include(name, parent)))
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
function filterCopyDir(from, to) {
|
||
|
var files;
|
||
|
try {
|
||
|
files = fs.readdirSync(from);
|
||
|
} catch(e) {
|
||
|
return options.onError(e);
|
||
|
}
|
||
|
var dirCreated = false;
|
||
|
files.forEach(function(x) {
|
||
|
if (excludePath(x, from))
|
||
|
return;
|
||
|
var stat; try {
|
||
|
stat = fs.lstatSync(from + '/' + x);
|
||
|
} catch(e) {
|
||
|
return options.onError(e);
|
||
|
}
|
||
|
|
||
|
if (stat.isSymbolicLink())
|
||
|
return;
|
||
|
if (stat.isDirectory()) {
|
||
|
if (options.shallow)
|
||
|
return;
|
||
|
filterCopyDir(from + '/' + x, to + '/' + x);
|
||
|
} else {
|
||
|
if (!dirCreated) {
|
||
|
if (options.onDir && options.onDir(from, to) === false)
|
||
|
return;
|
||
|
try {
|
||
|
mkdirSync(to);
|
||
|
} catch (e) {
|
||
|
return options.onError(e);
|
||
|
}
|
||
|
dirCreated = true;
|
||
|
}
|
||
|
try {
|
||
|
copy.file(from+ '/' + x, to+ '/' + x, options.replace);
|
||
|
} catch(e) {
|
||
|
return options.onError(e);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
filterCopyDir(from, to);
|
||
|
}
|
||
|
copy.dirs = function(from, to, dirs, options) {
|
||
|
dirs.forEach(function(d) {
|
||
|
copy(from + "/" + d, to + "/" + d, options);
|
||
|
});
|
||
|
};
|
||
|
copy.file = function(from, to, replace) {
|
||
|
from = convertPath(from);
|
||
|
to = convertPath(to);
|
||
|
|
||
|
if (replace) {
|
||
|
var data = fs.readFileSync(from, "utf8");
|
||
|
if (Array.isArray(replace))
|
||
|
data = replace.reduce(function(a, f) {return f(a)}, data);
|
||
|
else if (replace)
|
||
|
data = replace(data);
|
||
|
}
|
||
|
|
||
|
function write() {
|
||
|
if (replace)
|
||
|
fs.writeFileSync(to, data, "utf8");
|
||
|
else
|
||
|
copyBinaryFile(from, to);
|
||
|
}
|
||
|
try {
|
||
|
write();
|
||
|
} catch(e) {
|
||
|
if (e.code == "ENOENT") {
|
||
|
mkdirSync(path.dirname(to));
|
||
|
write();
|
||
|
} else {
|
||
|
throw e;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
function logError() {
|
||
|
console.error.apply(console, arguments);
|
||
|
}
|
||
|
|
||
|
copy.convertPath = convertPath;
|
||
|
module.exports = copy;
|
||
|
|