diff --git a/lib/server/flop.js b/lib/server/flop.js deleted file mode 100644 index 82928b2b..00000000 --- a/lib/server/flop.js +++ /dev/null @@ -1,107 +0,0 @@ -/* - * FLOP - FiLe OPerations - */ - -(function() { - 'use strict'; - - var fs = require('fs'), - DIR = './', - - Util = require(DIR + '../util'), - - size = require(DIR + 'size'), - readify = require(DIR + 'readify'), - time = require(DIR + 'timem'), - files = require(DIR + 'files'), - tryRequire = require(DIR + 'tryRequire'), - - ncp = tryRequire('./ncp'), - rimraf = tryRequire('rimraf'), - mkdir = tryRequire('mkdirp') || fs.mkdir; - - exports.create = function(path, type, callback) { - Util.check(arguments, ['path', 'callback']); - - mkdir(path, callback); - }; - - exports.read = function(path, type, callback) { - Util.check(arguments, ['path', 'callback']); - - if (!callback) - callback = type; - - switch (type) { - case 'size': - size(path, callback); - break; - - case 'size raw': - size(path, { type: 'raw' }, callback); - break; - - case 'time': - time(path, callback); - break; - - case 'time raw': - time(path, 'raw', callback); - break; - - default: - readify(path, callback); - break; - } - }; - - exports.delete = function(path, callback) { - Util.check(arguments, ['path', 'callback']); - - if (rimraf) - rimraf(path, callback); - else - fs.unlink(path, function(error) { - var isDir = error && error.code === 'EISDIR'; - - if (isDir) - fs.rmdir(path, callback); - else - callback(error); - }); - }; - - exports.move = function(from, to, callback) { - Util.check(arguments, ['path', 'to', 'callback']); - - fs.rename(from, to, function(error) { - var isExDev = error && error.code === 'EXDEV'; - - if (ncp && rimraf && isExDev) - ncp(from, to, { - stopOnError: true - }, function() { - rimraf(from, callback); - }); - else - callback(error); - }); - }; - - exports.copy = function(from, to, callback) { - Util.check(arguments, ['from', 'to', 'callback']); - - fs.lstat(from, function(error, stat) { - var isDir = stat && stat.isDirectory(); - - if (error) - callback(error); - else if (isDir && ncp) - ncp(from, to, { - stopOnError: true - }, callback); - else - files.pipe(from, to, callback); - }); - }; -})(); diff --git a/lib/server/ncp.js b/lib/server/ncp.js deleted file mode 100644 index 46a75836..00000000 --- a/lib/server/ncp.js +++ /dev/null @@ -1,265 +0,0 @@ -'use strict'; - -var fs = require('fs'), - path = require('path'); - -var modern = /^v0\.1\d\.\d+/.test(process.version); - -module.exports = ncp; -ncp.ncp = ncp; - -function ncp (source, dest, options, callback) { - var cback = callback; - - if (!callback) { - cback = options; - options = {}; - } - - var basePath = process.cwd(), - currentPath = path.resolve(basePath, source), - targetPath = path.resolve(basePath, dest), - filter = options.filter, - rename = options.rename, - transform = options.transform, - clobber = options.clobber !== false, - modified = options.modified, - dereference = options.dereference, - errs = null, - eventName = modern ? 'finish' : 'close', - defer = modern ? setImmediate : process.nextTick, - started = 0, - finished = 0, - running = 0, - limit = options.limit || ncp.limit || 16; - - limit = (limit < 1) ? 1 : (limit > 512) ? 512 : limit; - - startCopy(currentPath); - - function startCopy(source) { - started++; - if (filter) { - if (filter instanceof RegExp) { - if (!filter.test(source)) { - return cb(true); - } - } - else if (typeof filter === 'function') { - if (!filter(source)) { - return cb(true); - } - } - } - return getStats(source); - } - - function getStats(source) { - var stat = dereference ? fs.stat : fs.lstat; - if (running >= limit) { - return defer(function () { - getStats(source); - }); - } - running++; - stat(source, function (err, stats) { - var item = {}; - if (err) { - return onError(err); - } - - // We need to get the mode from the stats object and preserve it. - item.name = source; - item.mode = stats.mode; - item.mtime = stats.mtime; //modified time - item.atime = stats.atime; //access time - - if (stats.isDirectory()) { - return onDir(item); - } - else if (stats.isFile()) { - return onFile(item); - } - else if (stats.isSymbolicLink()) { - // Symlinks don't really need to know about the mode. - return onLink(source); - } - }); - } - - function onFile(file) { - var target = file.name.replace(currentPath, targetPath); - if(rename) { - target = rename(target); - } - isWritable(target, function (writable) { - if (writable) { - return copyFile(file, target); - } else if (clobber) { - rmFile(target, function () { - copyFile(file, target); - }); - } else if (modified) { - var stat = dereference ? fs.stat : fs.lstat; - stat(target, function(err, stats) { - //if souce modified time greater to target modified time copy file - if (file.mtime.getTime()>stats.mtime.getTime()) - copyFile(file, target); - else return cb(); - }); - } else { - cb(); - } - }); - } - - function copyFile(file, target) { - var readStream = fs.createReadStream(file.name), - writeStream = fs.createWriteStream(target, { mode: file.mode }); - - readStream.on('error', onError); - writeStream.on('error', onError); - - if(transform) { - transform(readStream, writeStream, file); - } else { - writeStream.on('open', function() { - readStream.pipe(writeStream); - }); - } - writeStream.once(eventName, function() { - if (modified) { - //target file modified date sync. - fs.utimesSync(target, file.atime, file.mtime); - cb(); - } - else cb(); - }); - } - - function rmFile(file, done) { - fs.unlink(file, function (err) { - if (err) { - return onError(err); - } - return done(); - }); - } - - function onDir(dir) { - var target = dir.name.replace(currentPath, targetPath); - isWritable(target, function (writable) { - if (writable) { - return mkDir(dir, target); - } - copyDir(dir.name); - }); - } - - function mkDir(dir, target) { - fs.mkdir(target, dir.mode, function (err) { - if (err) { - return onError(err); - } - copyDir(dir.name); - }); - } - - function copyDir(dir) { - fs.readdir(dir, function (err, items) { - if (err) { - return onError(err); - } - items.forEach(function (item) { - startCopy(dir + '/' + item); - }); - return cb(); - }); - } - - function onLink(link) { - var target = link.replace(currentPath, targetPath); - fs.readlink(link, function (err, resolvedPath) { - if (err) { - return onError(err); - } - checkLink(resolvedPath, target); - }); - } - - function checkLink(resolvedPath, target) { - if (dereference) { - resolvedPath = path.resolve(basePath, resolvedPath); - } - isWritable(target, function (writable) { - if (writable) { - return makeLink(resolvedPath, target); - } - fs.readlink(target, function (err, targetDest) { - if (err) { - return onError(err); - } - if (dereference) { - targetDest = path.resolve(basePath, targetDest); - } - if (targetDest === resolvedPath) { - return cb(); - } - return rmFile(target, function () { - makeLink(resolvedPath, target); - }); - }); - }); - } - - function makeLink(linkPath, target) { - fs.symlink(linkPath, target, function (err) { - if (err) { - return onError(err); - } - return cb(); - }); - } - - function isWritable(path, done) { - fs.lstat(path, function (err) { - var result = false; - - if (err && err.code === 'ENOENT') - result = true; - - done(result); - }); - } - - function onError(err) { - if (options.stopOnError) { - return cback(err); - } - else if (!errs && options.errs) { - errs = fs.createWriteStream(options.errs); - } - else if (!errs) { - errs = []; - } - if (typeof errs.write === 'undefined') { - errs.push(err); - } - else { - errs.write(err.stack + '\n\n'); - } - return cb(); - } - - function cb(skipped) { - if (!skipped) running--; - finished++; - if ((started === finished) && (running === 0)) { - if (cback !== undefined ) { - return errs ? cback(errs) : cback(null); - } - } - } -} - - diff --git a/lib/server/patch.js b/lib/server/patch.js index 96b29419..6b93ca57 100644 --- a/lib/server/patch.js +++ b/lib/server/patch.js @@ -11,7 +11,8 @@ diffPatch = require(DIR + 'diff/diff-match-patch').diff_match_patch, diff = new (require(DIR + 'diff').DiffProto)(diffPatch), - flop = require(DIR_SERVER + 'flop'), + tryRequire = require(DIR_SERVER + 'tryRequire'), + flop = tryRequire('flop', {log: true, exit: true}), ERROR_MSG = 'File is to big. ' + 'Could not patch files ' + diff --git a/lib/server/readify.js b/lib/server/readify.js deleted file mode 100644 index 0d9a33cb..00000000 --- a/lib/server/readify.js +++ /dev/null @@ -1,181 +0,0 @@ -(function() { - 'use strict'; - - var fs = require('fs'), - - DIR = '../', - DIR_SERVER = DIR + 'server/', - - Util = require(DIR + 'util'), - format = require(DIR + 'format'), - tryRequire = require(DIR_SERVER + 'tryRequire'), - nicki = tryRequire('nicki', {callback: true}), - - funcEmpty = function() {}, - - WIN = process.platform === 'win32'; - - module.exports = function(path, callback) { - Util.check(arguments, ['path', 'callback']) - .type('path', path, 'string') - .type('callback', callback, 'function'); - - fs.readdir(path, function(error, names) { - if (error) - callback(error); - else - getAllStats(path, names, callback); - }); - }; - - /** - * @param path - * @param names - */ - function getAllStats(path, names, callback) { - var length = names.length, - funcs = names.length ? {} : [], - dir = format.addSlashToEnd(path); - - if (!length) - funcs.push(Util.exec); - else - names.forEach(function(name) { - var path = dir + name; - - funcs[name] = Util.exec.with(getStat, name, path); - }); - - Util.exec.parallel(funcs, function(error, files) { - fillJSON(dir, files || {}, callback); - }); - } - - function getStat(name, path, callback) { - fs.stat(path, function(error, data) { - callback(null, data || { - 'mode' : 0, - 'size' : 0, - 'isDirectory' : funcEmpty - }); - }); - } - - function parseStats(stats) { - var files; - - Util.check(arguments, ['stats']); - - files = Object.keys(stats).map(function(name) { - var file, isDir, size, mode, modeStr, - stat = stats[name], - owner = stat.uid; - - if (stat) { - /* Переводим права доступа в 8-ричную систему */ - modeStr = Number(stat.mode).toString(8); - mode = Number(modeStr); - isDir = stat.isDirectory(); - size = isDir ? 'dir' : stat.size; - } - - file = { - 'name' : name, - 'size' : format.size(size), - 'owner' : owner, - 'mode' : format.permissions.symbolic(mode) - }; - - return file; - }); - - return files; - } - - /** - * Function fill JSON by file stats - * - * @param params - { files, stats, path } - */ - function fillJSON(path, stats, callback) { - var files, - - json = { - path : '', - files : [] - }; - - Util.check(arguments, ['params']); - - files = parseStats(stats); - - /* sorting on Win and node v0.8.0 */ - files = sort(files); - - json.files = changeOrder(files); - json.path = format.addSlashToEnd(path); - - changeUIDToName(json, function() { - callback(null, json); - }); - } - - function changeUIDToName(json, callback) { - if (WIN) - callback(); - else - nicki(function(error, names) { - var files = json.files; - - if (error) - callback(error); - else - files.forEach(function(file) { - var owner = file.owner; - owner = names[owner]; - - if (owner) - file.owner = owner; - }); - - callback(); - }); - } - - function sort(files) { - var sorted = files; - - sorted = files.sort(function(fileA, fileB) { - var ret = 0, - more = fileA.name > fileB.name, - less = fileA.name < fileB.name; - - if (more) - ret = 1; - else if (less) - ret = -1; - - return ret; - }); - - return sorted; - } - - function changeOrder(json) { - var files = [], - dirs = [], - sorted = []; - - json.forEach(function(current) { - if (current.size === 'dir') - dirs.push(current); - else - files.push(current); - }); - - sorted = dirs.concat(files); - - return sorted; - } - -})(); diff --git a/lib/server/rest.js b/lib/server/rest.js index 9c17ffe5..0cf60310 100644 --- a/lib/server/rest.js +++ b/lib/server/rest.js @@ -22,13 +22,15 @@ markdown = require(DIR + 'rest/markdown'), github = require(DIR + 'github'), - flop = require(DIR + 'flop'), packer = require(DIR + 'packer'), - tryRequire = require('./tryRequire'), - mellow = tryRequire('mellow', {log: true, exit: true}), ponse = require(DIR + 'ponse'), pipe = require(DIR + 'pipe'), + tryRequire = require('./tryRequire'), + tryOptions = {log: true, exit: true}, + mellow = tryRequire('mellow', tryOptions), + flop = tryRequire('flop', tryOptions), + isWin32 = process.platform === 'win32', Fs = {}; diff --git a/lib/server/rest/fs/delete.js b/lib/server/rest/fs/delete.js index fdd30e71..a3e89b2c 100644 --- a/lib/server/rest/fs/delete.js +++ b/lib/server/rest/fs/delete.js @@ -5,7 +5,8 @@ DIR_SERVER = DIR + 'server/', Util = require(DIR + 'util'), - flop = require(DIR_SERVER + 'flop'); + tryRequire = require(DIR_SERVER + 'tryRequire'), + flop = tryRequire(DIR + 'flop', {log: true, exit: true}); module.exports = function(query, name, files, callback) { var func = Util.exec.ret(callback), diff --git a/lib/server/rest/fs/get.js b/lib/server/rest/fs/get.js index c4453963..3825693d 100644 --- a/lib/server/rest/fs/get.js +++ b/lib/server/rest/fs/get.js @@ -4,14 +4,18 @@ var path = require('path'), DIR = path.resolve(__dirname + '/../../../') + '/', DIR_SERVER = DIR + 'server/', + + Util = require(DIR + 'util'), + files = require(DIR_SERVER + 'files'), - flop = require(DIR_SERVER + 'flop'), hash = require(DIR_SERVER + 'hash'), - tryRequire = require(DIR_SERVER + 'tryRequire'), - mellow = tryRequire('mellow', {log: true, exit: true}), beautify = require(DIR_SERVER + 'beautify'), minify = require(DIR_SERVER + 'minify'), - Util = require(DIR + 'util'); + + tryRequire = require(DIR_SERVER + 'tryRequire'), + tryOptions = {log: true, exit: true}, + mellow = tryRequire('mellow', tryOptions), + flop = tryRequire('flop', tryOptions); module.exports = function(query, name, callback) { var hashStream, error; diff --git a/lib/server/rest/fs/put.js b/lib/server/rest/fs/put.js index dc12c678..011980f7 100644 --- a/lib/server/rest/fs/put.js +++ b/lib/server/rest/fs/put.js @@ -10,9 +10,12 @@ CloudFunc = require(DIR + 'cloudfunc'), Util = require(DIR + 'util'), - flop = require(DIR_SERVER + 'flop'), packer = require(DIR_SERVER + 'packer'), - files = require(DIR_SERVER + 'files'); + files = require(DIR_SERVER + 'files'), + tryRequire = require(DIR_SERVER + 'tryRequire'), + + tryOptions = {log: true, exit: true}, + flop = tryRequire('flop', tryOptions); module.exports = function(query, name, readStream, callback) { var baseName = path.basename(name), diff --git a/lib/server/size.js b/lib/server/size.js deleted file mode 100644 index a5dc6ef6..00000000 --- a/lib/server/size.js +++ /dev/null @@ -1,131 +0,0 @@ -/* inspired by http://procbits.com/2011/10/29/a-node-js-experiment-thinking-asynchronously-recursion-calculate-file-size-directory */ -(function(){ - 'use strict'; - - var fs = require('fs'), - path = require('path'), - - DIR = '../', - - format = require(DIR + 'format'), - Util = require(DIR + 'util'), - - EventEmitter= require('events').EventEmitter, - - /* The lstat() function shall be equivalent to stat(), - except when path refers to a symbolic link. In that case lstat() - shall return information about the link, while stat() shall return - information about the file the link references. - */ - stat = fs.lstat; - - module.exports = function(dir, options, callback) { - var type, stopOnError, - emitter = new EventEmitter(), - total = 0; - - Util.check(arguments, ['dir', 'callback']); - - if (!callback) { - callback = options; - options = {}; - } else { - type = options.type; - stopOnError = options.stopOnError; - } - - emitter.on('file', function(file, stat) { - total += stat.size; - }); - - emitter.on('error', function(error) { - callback(error); - }); - - emitter.on('end', function() { - var result; - - if (type !== 'raw') - result = format.size(total); - else - result = total; - - callback(null, result); - }); - - processDir(dir, options, emitter); - }; - - function processDir(dir, options, emitter) { - var stopOnError = options.stopOnError, - wasError = false, - asyncRunning = 0, - fileCounter = 1, - - execCallBack = function () { - var noErrors = !wasError || !stopOnError, - yesAllDone = !fileCounter && !asyncRunning; - - if (yesAllDone && noErrors) - emitter.emit('end'); - }, - - getDirInfo = function(dir) { - stat(dir, Util.exec.with(getStat, dir)); - }; - - getDirInfo(dir); - - function getStat(dir, error, stat) { - var isDir; - - --fileCounter; - - if (!wasError || !stopOnError) { - if (error && stopOnError) { - wasError = true; - emitter.emmit('error', error); - } else if (!error) { - isDir = stat.isDirectory(); - - if (!isDir) { - emitter.emit('file', dir, stat); - } else { - ++asyncRunning; - - fs.readdir(dir, function(error, files) { - asyncRunning--; - - if (!error) { - onReaddir(dir, files); - } else if (error && stopOnError) { - wasError = true; - emitter.emit('error', error); - } - }); - } - } - - execCallBack(); - } - } - - function onReaddir(dir, files) { - var n = files.length; - - fileCounter += n; - - if (!n) - execCallBack(); - else - files.forEach(function(file) { - var dirPath = path.join(dir, file); - - process.nextTick(function() { - getDirInfo(dirPath); - }); - }); - } - } - -})(); diff --git a/lib/server/timem.js b/lib/server/timem.js deleted file mode 100644 index ef6197d3..00000000 --- a/lib/server/timem.js +++ /dev/null @@ -1,31 +0,0 @@ -(function () { - 'use strict'; - - var fs = require('fs'), - Util = require('../util'); - - module.exports = function(filename, option, callback) { - var isRaw = option === 'raw'; - - if (!callback) - callback = option; - - Util.check(arguments, ['filename', 'callback']); - - fs.stat(filename, function(error, stat) { - var time, timeRet; - - if (!error) { - time = stat.mtime; - - if (isRaw) - timeRet = time.getTime(); - else - timeRet = time; - } - - callback(error, timeRet); - }); - }; - -})(); diff --git a/package.json b/package.json index ece8ced4..3fb41a2e 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "console-io": "~1.10.0", "dropbox": "0.10.x", "express": "~4.10.0", + "flop": "~1.0.25", "fstream": "~1.0.2", "http-auth": "2.1.x", "js-beautify": "~1.5.4",