c9-core/node_modules/architect-build/copy.js

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;