diff --git a/lib/server/rest.js b/lib/server/rest.js index 93fce0da..4153df08 100644 --- a/lib/server/rest.js +++ b/lib/server/rest.js @@ -202,18 +202,18 @@ else { files = Util.parseJSON(body); - onDelete(p.name, files, query, function(error, callback) { + onDelete(p.name, files, query, function(error) { var names; - if (error) + if (error) { sendError(params,error); - else { - names = (files && files.length) ? files : p.name; - - if (callback) - Util.exec(callback); + } else { + if (files && files.length) + names = files; else - sendMsg(params, 'delete', names); + names = p.name; + + sendMsg(params, 'delete', names); } }); } diff --git a/lib/server/rest/fs/delete.js b/lib/server/rest/fs/delete.js index 23dd30f5..31bfb72f 100644 --- a/lib/server/rest/fs/delete.js +++ b/lib/server/rest/fs/delete.js @@ -5,18 +5,18 @@ fs = require('fs'), dir = main.dir, Util = main.util, + rimraf = main.require('rimraf'), fse = { - delete : main.require('rimraf') || fs.rmdir, + delete : rimraf || fs.rmdir, }; exports.onDelete = onDelete; function onDelete(name, files, query, callback) { - var i, n, isDirFunc, onIsDir, dirPath, - assync = 0, - rmFile = fs.unlink, - rmDir = fse.delete, - func = Util.retExec(callback); + var func = Util.retExec(callback), + fileNames = Util.slice(files), + rmFile = fs.unlink, + rmDir = fse.delete; switch(query) { default: @@ -26,36 +26,46 @@ case 'dir': rmDir(name, func); break; - + case 'files': - n = files && files.length, - dirPath = name, - - onIsDir = function(name, error, isDir) { - var log = Util.log.bind(Util); - ++assync; - - if (error) - func(error); - else { - if (isDir) - rmDir(name, log); - else - rmFile(name, log); - - if (assync === n) - func(); - } - }; - - for (i = 0; i < n; i ++) { - name = dirPath + files[i]; - isDirFunc = Util.bind(onIsDir, name); - - dir.isDir(name, isDirFunc); - Util.log(name); - } + deleteFiles(name, fileNames, func); break; } } + + function deleteFiles(from, names, callback) { + var name, + rmFile = fs.unlink, + rmDir = fse.delete, + isLast = true; + + isLast = !names.length; + name = names.shift(); + + if (isLast) + callback(null); + else + Util.ifExec(rimraf, function(result, func) { + (func || rimraf)(from + name, function(error) { + if (error) + callback(error); + else + deleteFiles(from, names, callback); + }); + }, function(func) { + dir.isDir(name, function(error, isDir) { + var funcRm; + + if (error) + callback(error); + else if (isDir) + funcRm = rmDir; + else + funcRm = rmFile; + + func(null, funcRm); + }); + }); + } + })();