feature(patch) add

This commit is contained in:
coderaiser 2014-10-13 10:47:39 -04:00
parent 83020e29d3
commit f4539cac1c
2 changed files with 75 additions and 54 deletions

62
lib/server/patch.js Normal file
View file

@ -0,0 +1,62 @@
(function() {
'use strict';
var DIR = '../',
DIR_SERVER = './',
fs = require('fs'),
Util = require(DIR + 'util'),
diffPatch = require(DIR + 'diff/diff-match-patch').diff_match_patch,
diff = new (require(DIR + 'diff').DiffProto)(diffPatch),
flop = require(DIR_SERVER + 'flop'),
ERROR_MSG = 'File is to big. ' +
'Could not patch files ' +
'bigger then ';
module.exports = function(name, patch, options, callback) {
Util.checkArgs(arguments, ['name', 'patch', 'callback']);
if (!callback) {
callback = options;
options = {};
}
flop.read(name, 'size raw', function(error, size) {
if (!error)
if (isNaN(options.size) || size < options.size)
patchFile(name, patch, callback);
else
error = {
message: ERROR_MSG + options.size
};
if (error)
callback(error);
});
};
function patchFile(name, patch, callback) {
fs.readFile(name, 'utf8', function read(error, data) {
var diffResult;
if (error) {
callback(error);
} else {
error = Util.exec.tryLog(function() {
diffResult = diff.applyPatch(data, patch);
});
if (error || !diffResult)
callback({
message: 'Patch fail'
});
else
fs.writeFile(name, diffResult, callback);
}
});
}
})();

View file

@ -13,9 +13,7 @@
flop = require(DIR_SERVER + 'flop'),
pack = require(DIR_SERVER + 'pack'),
pipe = require(DIR_SERVER + 'pipe'),
diffPatch = require(DIR + 'diff/diff-match-patch').diff_match_patch,
diff = new (require(DIR + 'diff').DiffProto)(diffPatch);
patch = require(DIR_SERVER + 'patch');
module.exports = function(query, name, readStream, callback) {
var baseName = path.basename(name),
@ -48,60 +46,21 @@
break;
case 'patch':
flop.read(name, 'size raw', function(error, size) {
var MAX_SIZE = CloudFunc.MAX_FILE_SIZE;
pipe.getBody(readStream, function(error, data) {
var options = {
size: CloudFunc.MAX_FILE_SIZE
};
if (!error)
if (size < MAX_SIZE)
pipe.getBody(readStream, function(error, patch) {
if (error)
callback(error);
else
patchFile(name, patch, callback);
});
else
error = 'File is to big. ' +
'Could not patch files ' +
'bigger then' + MAX_SIZE;
if (error)
callback(error);
patch(name, data, options, function(error) {
var msg;
if (!error)
msg = CloudFunc.formatMsg('patch', baseName);
callback(error, msg);
});
});
break;
}
};
function patchFile(name, patch, callback) {
var baseName = path.basename(name),
PATCH_FAIL = CloudFunc.formatMsg('patch', baseName, 'fail');
fs.readFile(name, 'utf8', read);
function read(error, data) {
var diffResult;
if (error) {
callback(error);
} else {
error = Util.exec.tryLog(function() {
diffResult = diff.applyPatch(data, patch);
});
if (error || !diffResult)
callback(PATCH_FAIL);
else
fs.writeFile(name, diffResult, onWrite);
}
}
function onWrite(error) {
var msg,
baseName = path.basename(name);
if (!error)
msg = CloudFunc.formatMsg('patch', baseName);
callback(error, msg);
}
}
})();