You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.3 KiB
62 lines
1.3 KiB
'use strict';
|
|
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
var through = require('through2');
|
|
var mkdirp = require('mkdirp');
|
|
var rimraf = require('rimraf');
|
|
|
|
function write(file) {
|
|
var dir = path.dirname(file.path);
|
|
if (!fs.existsSync(dir)) {
|
|
mkdirp.sync(dir);
|
|
}
|
|
|
|
fs.writeFileSync(file.path, file.contents, {
|
|
mode: file.stat ? file.stat.mode : null
|
|
});
|
|
}
|
|
|
|
function remove(file) {
|
|
rimraf.sync(file.path);
|
|
}
|
|
|
|
module.exports = function (filters, cb) {
|
|
var store = this.store;
|
|
|
|
if (arguments.length === 1) {
|
|
cb = filters;
|
|
filters = [];
|
|
}
|
|
|
|
var modifiedFilter = through.obj(function (file, enc, cb) {
|
|
// Don't process deleted file who haven't been commited yet.
|
|
if (file.state === 'modified' || (file.state === 'deleted' && !file.isNew)) {
|
|
this.push(file);
|
|
}
|
|
|
|
cb();
|
|
});
|
|
|
|
var commitFilter = through.obj(function (file, enc, cb) {
|
|
store.add(file);
|
|
if (file.state === 'modified') {
|
|
write(file);
|
|
} else if (file.state === 'deleted') {
|
|
remove(file);
|
|
}
|
|
|
|
delete file.state;
|
|
delete file.isNew;
|
|
cb();
|
|
});
|
|
|
|
filters.unshift(modifiedFilter);
|
|
filters.push(commitFilter);
|
|
|
|
var stream = filters.reduce(function (stream, filter) {
|
|
return stream.pipe(filter);
|
|
}, this.store.stream());
|
|
|
|
stream.on('finish', cb);
|
|
};
|
|
|