feature(flop) add from npm

This commit is contained in:
coderaiser 2014-11-20 07:33:06 -05:00
parent fdce2eb201
commit 822d444964
11 changed files with 23 additions and 726 deletions

View file

@ -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);
});
};
})();

View file

@ -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);
}
}
}
}

View file

@ -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 ' +

View file

@ -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;
}
})();

View file

@ -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 = {};

View file

@ -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),

View file

@ -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;

View file

@ -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),

View file

@ -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);
});
});
}
}
})();

View file

@ -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);
});
};
})();

View file

@ -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",