mirror of
https://github.com/pcottle/learnGitBranching.git
synced 2025-06-27 08:28:50 +02:00
80 lines
2.6 KiB
JavaScript
80 lines
2.6 KiB
JavaScript
var _ = require('underscore');
|
|
var Q = require('q');
|
|
|
|
var Main = require('../app');
|
|
var MultiView = require('../views/multiView').MultiView;
|
|
|
|
function GitShim(options) {
|
|
options = options || {};
|
|
|
|
// these variables are just functions called before / after for
|
|
// simple things (like incrementing a counter)
|
|
this.beforeCB = options.beforeCB || function() {};
|
|
this.afterCB = options.afterCB || function() {};
|
|
|
|
// these guys handle an optional async process before the git
|
|
// command executes or afterwards. If there is none,
|
|
// it just resolves the deferred immediately
|
|
var resolveImmediately = function(deferred) {
|
|
deferred.resolve();
|
|
};
|
|
this.beforeDeferHandler = options.beforeDeferHandler || resolveImmediately;
|
|
this.afterDeferHandler = options.afterDeferHandler || resolveImmediately;
|
|
this.eventBaton = options.eventBaton || Main.getEventBaton();
|
|
}
|
|
|
|
GitShim.prototype.insertShim = function() {
|
|
this.eventBaton.stealBaton('processGitCommand', this.processGitCommand, this);
|
|
};
|
|
|
|
GitShim.prototype.processGitCommand = function(command, deferred) {
|
|
this.beforeCB(command);
|
|
|
|
// ok we make a NEW deferred that will, upon resolution,
|
|
// call our afterGitCommandProcessed. This inserts the 'after' shim
|
|
// functionality. we give this new deferred to the eventBaton handler
|
|
var newDeferred = Q.defer();
|
|
newDeferred.promise
|
|
.then(_.bind(function() {
|
|
// give this method the original defer so it can resolve it
|
|
this.afterGitCommandProcessed(command, deferred);
|
|
}, this))
|
|
.done();
|
|
|
|
// now our shim owner might want to launch some kind of deferred beforehand, like
|
|
// a modal or something. in order to do this, we need to defer the passing
|
|
// of the event baton backwards, and either resolve that promise immediately or
|
|
// give it to our shim owner.
|
|
var passBaton = _.bind(function() {
|
|
// punt to the previous listener
|
|
this.eventBaton.passBatonBack('processGitCommand', this.processGitCommand, this, [command, newDeferred]);
|
|
}, this);
|
|
|
|
var beforeDefer = Q.defer();
|
|
beforeDefer.promise
|
|
.then(passBaton)
|
|
.done();
|
|
|
|
// if we didnt receive a defer handler in the options, this just
|
|
// resolves immediately
|
|
this.beforeDeferHandler(beforeDefer, command);
|
|
};
|
|
|
|
GitShim.prototype.afterGitCommandProcessed = function(command, deferred) {
|
|
this.afterCB(command);
|
|
|
|
// again we can't just resolve this deferred right away... our shim owner might
|
|
// want to insert some promise functionality before that happens. so again
|
|
// we make a defer
|
|
var afterDefer = Q.defer();
|
|
afterDefer.promise
|
|
.then(function() {
|
|
deferred.resolve();
|
|
})
|
|
.done();
|
|
|
|
this.afterDeferHandler(afterDefer, command);
|
|
};
|
|
|
|
exports.GitShim = GitShim;
|
|
|