parent
749de1e28f
commit
91284c36e6
@ -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); |
||||
}, |
||||
removedirs = function (path) { |
||||
/*jslint stupid: true */ |
||||
fse.removeSync(path); |
||||
}; |
||||
nodegit = require('nodegit'), |
||||
async = require('async'), |
||||
Copier = require('recursive-tree-copy').Copier; |
||||
|
||||
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) { |
||||
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); |
||||
} |
||||
|
||||
fs.writeFile(exportDir + "/" + task.path, blob.content(), function (err, result) { |
||||
//console.log("Done writing file " + task.path);
|
||||
callback(err, result); |
||||
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'); |
||||
}); |
||||
}); |
||||
}, 10); |
||||
return emitter; |
||||
}, |
||||
createTargetTree: function (tree, targetDir, callback) { |
||||
var targetSubdir = path.join(targetDir, tree.name); |
||||
fs.mkdir(targetSubdir, function (err) { |
||||
if (err) { |
||||
return callback(err); |
||||
} |
||||
|
||||
commit.getTree(function (err, tree) { |
||||
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 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 }); |
||||
fs.writeFile(targetPath, blob.content(), callback); |
||||
}); |
||||
} |
||||
}) |
||||
.on('end', function () { |
||||
if (q.length() === 0) { |
||||
process.nextTick(globalCallback); |
||||
} else { |
||||
q.drain = globalCallback; |
||||
}); |
||||
|
||||
exports.gitToFs = function (commit, exportDir, callback) { |
||||
commit.getTree(function (err, tree) { |
||||
if (err) { |
||||
return callback(err); |
||||
} |
||||
return; |
||||
}) |
||||
.start(); |
||||
|
||||
gitToFsCopier.copy({ gitTree: tree, name: "." }, exportDir, callback); |
||||
}); |
||||
}; |
||||
|
Loading…
Reference in new issue