diff --git a/lib/server/patch.js b/lib/server/patch.js new file mode 100644 index 00000000..a75e1e5b --- /dev/null +++ b/lib/server/patch.js @@ -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); + } + }); + } +})(); diff --git a/lib/server/rest/fs/put.js b/lib/server/rest/fs/put.js index e29d7580..cba76505 100644 --- a/lib/server/rest/fs/put.js +++ b/lib/server/rest/fs/put.js @@ -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); - } - } })();