diff --git a/BuildServer/lib/git/copy.js b/BuildServer/lib/git/copy.js index 7093787..e1ce319 100644 --- a/BuildServer/lib/git/copy.js +++ b/BuildServer/lib/git/copy.js @@ -1,54 +1,83 @@ "use strict"; -var nodegit = require('nodegit'), - async = require('async'), +var EventEmitter = require('events').EventEmitter, + path = require('path'), fs = require('fs'), - fse = require('fs-extra'), - mkdirs = function (path) { - /*jslint stupid: true */ - fse.mkdirsSync(path); + nodegit = require('nodegit'), + async = require('async'), + Copier = require('recursive-tree-copy').Copier; + +var gitToFsCopier = new Copier({ + concurrency: 4, + walkSourceTree: function (tree) { + var emitter = new EventEmitter(); + process.nextTick(function () { + var entries; + try { + entries = tree.gitTree.entries(); + } catch(err) { + return emitter.emit('error', err); + } + + async.parallel(entries.map(function (entry) { + return function (callback) { + if (entry.isTree()) { + entry.getTree(function (err, subTree) { + if (err) { + return callback(err); + } + + emitter.emit('tree', { gitTree: subTree, name: entry.name() }); + callback(); + }); + } else if (entry.isFile()) { + emitter.emit('leaf', entry); + callback(); + } else { + callback(); + } + }; + }), function (err) { + if (err) { + return emitter.emit('error', err); + } + + return emitter.emit('done'); + }); + }); + return emitter; }, - removedirs = function (path) { - /*jslint stupid: true */ - fse.removeSync(path); - }; - -exports.gitToFs = function (commit, exportDir, globalCallback) { - var q = async.queue(function (task, callback) { - //console.log("Going to write file " + task.path + " (" + task.buffer.length + " bytes)"); - task.entry.getBlob(function (err, blob) { + createTargetTree: function (tree, targetDir, callback) { + var targetSubdir = path.join(targetDir, tree.name); + fs.mkdir(targetSubdir, function (err) { if (err) { return callback(err); } - fs.writeFile(exportDir + "/" + task.path, blob.content(), function (err, result) { - //console.log("Done writing file " + task.path); - callback(err, result); - }); + callback(undefined, targetSubdir); + }); + }, + finalizeTargetTree: function (targetSubdir, callback) { + callback(); + }, + copyLeaf: function (entry, targetDir, callback) { + var targetPath = path.join(targetDir, entry.name()); + entry.getBlob(function (err, blob) { + if (err) { + return callback(err); + } + + fs.writeFile(targetPath, blob.content(), callback); }); - }, 10); + } +}); +exports.gitToFs = function (commit, exportDir, callback) { commit.getTree(function (err, tree) { if (err) { - return globalCallback(err); + return callback(err); } - tree.walk(false) - .on('entry', function (entry) { - if (entry.isTree()) { - mkdirs(exportDir + "/" + entry.path()); - } else if (entry.isFile()) { - q.push({path: entry.path(), entry: entry }); - } - }) - .on('end', function () { - if (q.length() === 0) { - process.nextTick(globalCallback); - } else { - q.drain = globalCallback; - } - return; - }) - .start(); + gitToFsCopier.copy({ gitTree: tree, name: "." }, exportDir, callback); }); }; diff --git a/BuildServer/package.json b/BuildServer/package.json index c179758..8c8c514 100644 --- a/BuildServer/package.json +++ b/BuildServer/package.json @@ -15,6 +15,7 @@ "glob": "~3.2.7", "nodemailer": "~0.6.0", "mustache": "~0.8.1", - "adm-zip": "~0.4.4" + "adm-zip": "~0.4.4", + "recursive-tree-copy": "0.0.1" } }