|
|
var Q = require('q'); |
|
|
var Backbone = require('backbone'); |
|
|
|
|
|
var Commit = require('../git').Commit; |
|
|
var Branch = require('../git').Branch; |
|
|
var Tag = require('../git').Tag; |
|
|
|
|
|
var Command = require('../models/commandModel').Command; |
|
|
var TIME = require('../util/constants').TIME; |
|
|
|
|
|
var intl = require('../intl'); |
|
|
|
|
|
var CommitCollection = Backbone.Collection.extend({ |
|
|
model: Commit |
|
|
}); |
|
|
|
|
|
var CommandCollection = Backbone.Collection.extend({ |
|
|
model: Command |
|
|
}); |
|
|
|
|
|
var BranchCollection = Backbone.Collection.extend({ |
|
|
model: Branch |
|
|
}); |
|
|
|
|
|
var TagCollection = Backbone.Collection.extend({ |
|
|
model: Tag |
|
|
}); |
|
|
|
|
|
var CommandBuffer = Backbone.Model.extend({ |
|
|
defaults: { |
|
|
collection: null |
|
|
}, |
|
|
|
|
|
initialize: function(options) { |
|
|
options.collection.bind('add', this.addCommand, this); |
|
|
|
|
|
this.buffer = []; |
|
|
this.timeout = null; |
|
|
}, |
|
|
|
|
|
addCommand: function(command) { |
|
|
this.buffer.push(command); |
|
|
this.touchBuffer(); |
|
|
}, |
|
|
|
|
|
touchBuffer: function() { |
|
|
|
|
|
|
|
|
|
|
|
if (this.timeout) { |
|
|
|
|
|
return; |
|
|
} |
|
|
this.setTimeout(); |
|
|
}, |
|
|
|
|
|
|
|
|
setTimeout: function() { |
|
|
this.timeout = setTimeout(function() { |
|
|
this.sipFromBuffer(); |
|
|
}.bind(this), TIME.betweenCommandsDelay); |
|
|
}, |
|
|
|
|
|
popAndProcess: function() { |
|
|
var popped = this.buffer.shift(0); |
|
|
|
|
|
|
|
|
while (popped.get('error') && this.buffer.length) { |
|
|
popped = this.buffer.shift(0); |
|
|
} |
|
|
if (!popped.get('error')) { |
|
|
this.processCommand(popped); |
|
|
} else { |
|
|
|
|
|
this.clear(); |
|
|
} |
|
|
}, |
|
|
|
|
|
processCommand: function(command) { |
|
|
command.set('status', 'processing'); |
|
|
|
|
|
var deferred = Q.defer(); |
|
|
deferred.promise.then(function() { |
|
|
this.setTimeout(); |
|
|
}.bind(this)); |
|
|
|
|
|
var eventName = command.get('eventName'); |
|
|
if (!eventName) { |
|
|
throw new Error('I need an event to trigger when this guy is parsed and ready'); |
|
|
} |
|
|
|
|
|
var Main = require('../app'); |
|
|
var eventBaton = Main.getEventBaton(); |
|
|
|
|
|
var numListeners = eventBaton.getNumListeners(eventName); |
|
|
if (!numListeners) { |
|
|
var Errors = require('../util/errors'); |
|
|
command.set('error', new Errors.GitError({ |
|
|
msg: intl.str('error-command-currently-not-supported') |
|
|
})); |
|
|
deferred.resolve(); |
|
|
return; |
|
|
} |
|
|
|
|
|
Main.getEventBaton().trigger(eventName, command, deferred); |
|
|
}, |
|
|
|
|
|
clear: function() { |
|
|
clearTimeout(this.timeout); |
|
|
this.timeout = null; |
|
|
}, |
|
|
|
|
|
sipFromBuffer: function() { |
|
|
if (!this.buffer.length) { |
|
|
this.clear(); |
|
|
return; |
|
|
} |
|
|
|
|
|
this.popAndProcess(); |
|
|
} |
|
|
}); |
|
|
|
|
|
exports.CommitCollection = CommitCollection; |
|
|
exports.CommandCollection = CommandCollection; |
|
|
exports.BranchCollection = BranchCollection; |
|
|
exports.TagCollection = TagCollection; |
|
|
exports.CommandBuffer = CommandBuffer; |
|
|
|
|
|
|