mirror of
https://github.com/bower/bower.git
synced 2026-02-12 15:05:05 -05:00
117 lines
2.5 KiB
JavaScript
117 lines
2.5 KiB
JavaScript
var fstream = require('fstream');
|
|
var fstreamIgnore = require('fstream-ignore');
|
|
var fs = require('fs');
|
|
var Q = require('q');
|
|
|
|
function copy(reader, writer) {
|
|
var deferred = Q.defer(),
|
|
ignore,
|
|
finish;
|
|
|
|
finish = function (err) {
|
|
writer.removeAllListeners();
|
|
reader.removeAllListeners();
|
|
|
|
// If we got an error, simply reject the deferred
|
|
if (err) {
|
|
return deferred.reject(err);
|
|
}
|
|
|
|
return deferred.resolve();
|
|
};
|
|
|
|
// Reader
|
|
if (reader.type === 'Directory' && reader.ignore) {
|
|
ignore = reader.ignore;
|
|
reader = fstreamIgnore(reader);
|
|
reader.addIgnoreRules(ignore);
|
|
} else {
|
|
reader = fstream.Reader(reader);
|
|
}
|
|
|
|
reader.on('error', finish);
|
|
|
|
// Writer
|
|
writer = fstream.Writer(writer)
|
|
.on('error', finish)
|
|
.on('close', finish);
|
|
|
|
// Finally pipe reader to writer
|
|
reader.pipe(writer);
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
function copyMode(src, dst) {
|
|
return Q.nfcall(fs.stat, src)
|
|
.then(function (stat) {
|
|
return Q.nfcall(fs.chmod, dst, stat.mode);
|
|
});
|
|
}
|
|
|
|
function parseOptions(opts) {
|
|
opts = opts || {};
|
|
|
|
if (opts.mode != null) {
|
|
opts.copyMode = false;
|
|
} else if (opts.copyMode == null) {
|
|
opts.copyMode = true;
|
|
}
|
|
|
|
return opts;
|
|
}
|
|
|
|
// ---------------------
|
|
|
|
// Available options:
|
|
// - mode: force final mode of dest (defaults to null)
|
|
// - copyMode: copy mode of src to dest, only if mode is not specified (defaults to true)
|
|
function copyFile(src, dst, opts) {
|
|
var promise;
|
|
|
|
opts = parseOptions(opts);
|
|
|
|
promise = copy({
|
|
path: src,
|
|
type: 'File'
|
|
}, {
|
|
path: dst,
|
|
mode: opts.mode,
|
|
type: 'File'
|
|
});
|
|
|
|
if (opts.copyMode) {
|
|
promise = promise.then(copyMode.bind(copyMode, src, dst));
|
|
}
|
|
|
|
return promise;
|
|
}
|
|
|
|
// Available options:
|
|
// - ignore: array of patterns to be ignored (defaults to null)
|
|
// - mode: force final mode of dest (defaults to null)
|
|
// - copyMode: copy mode of src to dest, only if mode is not specified (defaults to true)
|
|
function copyDir(src, dst, opts) {
|
|
var promise;
|
|
|
|
opts = parseOptions(opts);
|
|
|
|
promise = copy({
|
|
path: src,
|
|
type: 'Directory',
|
|
ignore: opts.ignore
|
|
}, {
|
|
path: dst,
|
|
mode: opts.mode,
|
|
type: 'Directory'
|
|
});
|
|
|
|
if (opts.copyMode) {
|
|
promise = promise.then(copyMode.bind(copyMode, src, dst));
|
|
}
|
|
|
|
return promise;
|
|
}
|
|
|
|
module.exports.copyDir = copyDir;
|
|
module.exports.copyFile = copyFile; |