git-101 / src /js /models /collections.js
mervenoyan's picture
initial commit
45a32e2
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() {
// touch buffer just essentially means we just check if our buffer is being
// processed. if it's not, we immediately process the first item
// and then set the timeout.
if (this.timeout) {
// timeout existence implies its being processed
return;
}
this.setTimeout();
},
setTimeout: function() {
this.timeout = setTimeout(function() {
this.sipFromBuffer();
}.bind(this), TIME.betweenCommandsDelay);
},
popAndProcess: function() {
var popped = this.buffer.shift(0);
// find a command with no error (aka unprocessed)
while (popped.get('error') && this.buffer.length) {
popped = this.buffer.shift(0);
}
if (!popped.get('error')) {
this.processCommand(popped);
} else {
// no more commands to process
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;