|
1 | 1 | var async = require("async");
|
| 2 | +var util = require("util"); |
2 | 3 | var Git = require("./git");
|
3 | 4 | var App = coderlib.App;
|
4 | 5 | var LocalApp = coderlib.LocalApp;
|
5 | 6 |
|
6 |
| -var GitApp = exports.GitApp = function(name, rev) { |
| 7 | +var GitApp = exports = function(name, rev) { |
7 | 8 | GitApp.super_.call(this, name);
|
8 | 9 |
|
9 | 10 | this.revision = rev;
|
| 11 | + this.localApp = null; |
| 12 | + this.repo = null; |
| 13 | + this.tree = null; |
| 14 | + this.module = null; |
10 | 15 | }
|
11 | 16 |
|
12 | 17 | util.inherits(GitApp, App);
|
13 | 18 |
|
14 | 19 | GitApp.appcache = {}
|
15 | 20 |
|
16 | 21 | GitApp.prototype.load = function(callback) {
|
| 22 | + var self = this; |
17 | 23 | async.waterfall([
|
18 | 24 | function(callback) {
|
19 |
| - LocalApp.find(this.name, callback); |
| 25 | + LocalApp.find(self.name, callback); |
20 | 26 | },
|
21 | 27 | function(app, callback) {
|
22 |
| - this.localApp = app; |
23 |
| - this.repo = new Git(this.localApp.rootPath); |
| 28 | + self.localApp = app; |
| 29 | + self.repo = new Git(self.localApp.rootPath); |
24 | 30 |
|
25 |
| - this.repo.parseCommit(this.revision, callback); |
| 31 | + self.repo.parseCommit(self.revision, callback); |
26 | 32 | },
|
27 | 33 | function(commit, callback) {
|
28 |
| - this.tree = commit.tree; |
| 34 | + self.tree = commit.tree; |
29 | 35 | callback(null);
|
30 | 36 | }
|
31 | 37 | ], callback);
|
32 | 38 | }
|
33 | 39 |
|
34 |
| -GitApp.prototype.require = function() { |
35 |
| - return null; |
| 40 | +GitApp.prototype.require = function(callback) { |
| 41 | + var self = this; |
| 42 | + if (this.module) { |
| 43 | + callback(null, this.module); |
| 44 | + return; |
| 45 | + } |
| 46 | + |
| 47 | + async.waterfall([ |
| 48 | + function(callback) { |
| 49 | + self.repo.findBlob(self.tree, "/app/index.js", callback); |
| 50 | + }, |
| 51 | + function(blob, callback) { |
| 52 | + self.repo.cat_file(blob.object, blob.type, callback); |
| 53 | + }, |
| 54 | + function(src, callback) { |
| 55 | + var Module = module.constructor; |
| 56 | + var m = new Module(); |
| 57 | + m.paths = module.paths; |
| 58 | + m._compile(src, "/app/index.js"); |
| 59 | + self.module = m; |
| 60 | + |
| 61 | + callback(null, m); |
| 62 | + } |
| 63 | + ], callback); |
36 | 64 | }
|
37 | 65 |
|
| 66 | +GitApp.find = function(name, rev, callback) { |
| 67 | + callback = callback || function() {}; |
| 68 | + |
| 69 | + if (GitApp.appcache[name] && GitApp.appcache[name][rev]) { |
| 70 | + callback(null, GitApp.appcache[name][rev]); |
| 71 | + } |
| 72 | + |
| 73 | + var userapp = new GitApp(name, rev); |
| 74 | + userapp.load(function(err) { |
| 75 | + if (err) { |
| 76 | + callback(err, null); |
| 77 | + } |
| 78 | + else { |
| 79 | + GitApp.appcache[name] = GitApp.appcache[name] || Object.create(null); |
| 80 | + GitApp.appcache[name][rev] = userapp; |
| 81 | + callback(null, userapp); |
| 82 | + } |
| 83 | + }); |
| 84 | +} |
38 | 85 |
|
0 commit comments