From f03f13f1d342cb198d5bd937a5c50d1d0aeca237 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 23 Jun 2014 07:37:32 -0400 Subject: [PATCH] feature(size) add options --- lib/server/flop.js | 2 +- lib/server/size.js | 108 ++++++++++++++++++++++++++------------------- 2 files changed, 64 insertions(+), 46 deletions(-) diff --git a/lib/server/flop.js b/lib/server/flop.js index f099ad16..ff82f9ed 100644 --- a/lib/server/flop.js +++ b/lib/server/flop.js @@ -37,7 +37,7 @@ break; case 'size raw': - size.get(path, 'raw', callback); + size.get(path, { type: 'raw' }, callback); break; case 'time': diff --git a/lib/server/size.js b/lib/server/size.js index f8076eee..3e3e5f7a 100644 --- a/lib/server/size.js +++ b/lib/server/size.js @@ -18,20 +18,32 @@ */ stat = fs.lstat; - exports.get = function(dir, type, callback) { - var total = 0; + exports.get = function(dir, options, callback) { + var type, stopOnError, + total = 0; Util.checkArgs(arguments, ['dir', 'callback']); - if (!callback) - callback = type; - - function calcSize(error, size) { - if (!error) - total += size; + if (!callback) { + callback = options; + } else { + type = options.type; + stopOnError = options.stopOnError; } - processDir(dir, calcSize, function(error) { + function calcSize(error, size) { + + if (error) + if (stopOnError) + Util.exec(callback, error); + else + size = 0; + + total += size; + + } + + processDir(dir, calcSize, {stopOnError: false}, function(error) { var result; if (type !== 'raw') @@ -43,19 +55,21 @@ }); }; - function processDir(dir, func, callback) { - var asyncRunning = 0, + function processDir(dir, func, options, callback) { + var stopOnError = options.stopOnError, + wasError = false, + asyncRunning = 0, fileCounter = 1, execCallBack = function () { if (!fileCounter && !asyncRunning) - Util.exec(callback); + callback(); }, getDirInfo = function(dir) { stat(dir, Util.exec.with(getStat, dir)); }; - + getDirInfo(dir); function getStat(dir, error, stat) { @@ -63,42 +77,46 @@ --fileCounter; - if (error) { - callback(error); - } else { - isFile = stat.isFile(), - isDir = stat.isDirectory(); - - if (isFile) - func(null, stat.size); - else if (isDir) { - ++asyncRunning; + if (!wasError || !stopOnError) { + if (error) { + wasError = true; + func(error); + } else { + isFile = stat.isFile(), + isDir = stat.isDirectory(); - fs.readdir(dir, function(error, files) { - var getInfo, dirPath, file, n, i; - - asyncRunning--; - - if (!error) { - n = files.length; - fileCounter += n; - - for (i = 0; i < n; i++) { - file = files[i]; - dirPath = path.join(dir, file); - getInfo = Util.exec.with(getDirInfo, dirPath); - - process.nextTick(getInfo); - } - } - - if (!n) - execCallBack(); - }); + if (isFile) + func(null, stat.size); + else if (isDir) { + ++asyncRunning; + fs.readdir(dir, onReaddir); + } } + + execCallBack(); + } + } + + function onReaddir(error, files) { + var n; + + asyncRunning--; + + if (!error) { + n = files.length; + fileCounter += n; + + files.forEach(function(file) { + var dirPath = path.join(dir, file); + + process.nextTick(function() { + getDirInfo(dirPath); + }); + }); } - execCallBack(); + if (!n) + execCallBack(); } }