summaryrefslogtreecommitdiffstats
path: root/lib/utils/fs.js
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-01-26 22:19:17 +0100
committerSamy Pessé <samypesse@gmail.com>2015-01-26 22:19:17 +0100
commit22bae559db876600b3a417bd2070ee695f526edc (patch)
tree8b189463966d7fd05079a1f518bbf2cc41f820d5 /lib/utils/fs.js
parent5cee07ee8c819a4609dc7d6660586a05e2540f87 (diff)
downloadgitbook-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.js114
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;