diff options
author | Samy Pessé <samypesse@gmail.com> | 2015-01-26 22:19:17 +0100 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2015-01-26 22:19:17 +0100 |
commit | 22bae559db876600b3a417bd2070ee695f526edc (patch) | |
tree | 8b189463966d7fd05079a1f518bbf2cc41f820d5 /lib/utils/fs.js | |
parent | 5cee07ee8c819a4609dc7d6660586a05e2540f87 (diff) | |
download | gitbook-22bae559db876600b3a417bd2070ee695f526edc.zip gitbook-22bae559db876600b3a417bd2070ee695f526edc.tar.gz gitbook-22bae559db876600b3a417bd2070ee695f526edc.tar.bz2 |
Fix #273: clean the output without removing .git and .svn
Diffstat (limited to 'lib/utils/fs.js')
-rw-r--r-- | lib/utils/fs.js | 114 |
1 files changed, 78 insertions, 36 deletions
diff --git a/lib/utils/fs.js b/lib/utils/fs.js index 352f57a..8d8c189 100644 --- a/lib/utils/fs.js +++ b/lib/utils/fs.js @@ -1,11 +1,54 @@ var _ = require("lodash"); var Q = require("q"); var tmp = require("tmp"); +var path = require("path"); var fs = require("graceful-fs"); var fsExtra = require("fs-extra"); var Ignore = require("fstream-ignore"); -var listFiles = function(path, options) { +var fsUtils = { + tmp: { + file: function() { + return Q.nfcall(tmp.file.bind(tmp)).get(0) + }, + dir: function() { + return Q.nfcall(tmp.dir.bind(tmp)).get(0) + } + }, + list: listFiles, + stat: Q.denodeify(fs.stat), + readdir: Q.denodeify(fs.readdir), + readFile: Q.denodeify(fs.readFile), + writeFile: function(filename, data, options) { + var d = Q.defer(); + + try { + fs.writeFileSync(filename, data, options) + } catch(err) { + d.reject(err); + } + d.resolve(); + + + return d.promise; + }, + mkdirp: Q.denodeify(fsExtra.mkdirp), + copy: Q.denodeify(fsExtra.copy), + remove: Q.denodeify(fsExtra.remove), + symlink: Q.denodeify(fsExtra.symlink), + exists: function(path) { + var d = Q.defer(); + fs.exists(path, d.resolve); + return d.promise; + }, + existsSync: fs.existsSync.bind(fs), + readFileSync: fs.readFileSync.bind(fs), + clean: cleanFolder +} + + +// List files in a directory +function listFiles(root, options) { options = _.defaults(options || {}, { ignoreFiles: [], ignoreRules: [] @@ -17,7 +60,7 @@ var listFiles = function(path, options) { var files = []; var ig = Ignore({ - path: path, + path: root, ignoreFiles: options.ignoreFiles }); @@ -46,45 +89,44 @@ var listFiles = function(path, options) { ig.on('error', d.reject); return d.promise; -}; - +} +// Clean a folder without removing .git and .svn +// Creates it if non existant +function cleanFolder(root) { + if (!fs.existsSync(root)) return fsUtils.mkdirp(root); -module.exports = { - tmp: { - file: function() { - return Q.nfcall(tmp.file.bind(tmp)).get(0) - }, - dir: function() { - return Q.nfcall(tmp.dir.bind(tmp)).get(0) - } - }, - list: listFiles, - stat: Q.denodeify(fs.stat), - readdir: Q.denodeify(fs.readdir), - readFile: Q.denodeify(fs.readFile), - writeFile: function(filename, data, options) { + return listFiles(root, { + ignoreFiles: [], + ignoreRules: [ + // Skip Git and SVN stuff + '.git/', + '.svn/' + ] + }) + .then(function(files) { var d = Q.defer(); - try { - fs.writeFileSync(filename, data, options) - } catch(err) { + _.reduce(files, function(prev, file, i) { + return prev.then(function() { + var _file = path.join(root, file); + + d.notify({ + i: i, + count: files.length, + file: _file + }); + return fsUtils.remove(_file); + }); + }, Q()) + .then(function() { + d.resolve(); + }, function(err) { d.reject(err); - } - d.resolve(); - + }); return d.promise; - }, - mkdirp: Q.denodeify(fsExtra.mkdirp), - copy: Q.denodeify(fsExtra.copy), - remove: Q.denodeify(fsExtra.remove), - symlink: Q.denodeify(fsExtra.symlink), - exists: function(path) { - var d = Q.defer(); - fs.exists(path, d.resolve); - return d.promise; - }, - existsSync: fs.existsSync.bind(fs), - readFileSync: fs.readFileSync.bind(fs) + }); }; + +module.exports = fsUtils; |