Added testable interactive rebase. It doesn't fully test everything (mainly the GUI), but is a start

This commit is contained in:
Patrick 2014-07-24 17:24:24 -04:00
parent 55ac6da589
commit 72cc7d6bd3
2 changed files with 71 additions and 14 deletions

View file

@ -569,6 +569,7 @@ var commandConfig = {
sc: /^gr($|\s)/, sc: /^gr($|\s)/,
options: [ options: [
'-i', '-i',
'--interactive-test',
'--aboveAll', '--aboveAll',
'-p', '-p',
'--preserve-merges' '--preserve-merges'
@ -581,12 +582,23 @@ var commandConfig = {
if (commandOptions['-i']) { if (commandOptions['-i']) {
var args = commandOptions['-i'].concat(generalArgs); var args = commandOptions['-i'].concat(generalArgs);
command.twoArgsImpliedHead(args, ' -i'); command.twoArgsImpliedHead(args, ' -i');
engine.rebaseInteractive(
args[0], if (commandOptions['--interactive-test']) {
args[1], { engine.rebaseInteractiveTest(
aboveAll: !!commandOptions['--aboveAll'] args[0],
} args[1], {
); interactiveTest: commandOptions['--interactive-test']
}
);
}
else {
engine.rebaseInteractive(
args[0],
args[1], {
aboveAll: !!commandOptions['--aboveAll'],
}
);
}
return; return;
} }

View file

@ -2070,15 +2070,10 @@ GitEngine.prototype.getUpstreamDiffFromSet = function(stopSet, location) {
return result; return result;
}; };
GitEngine.prototype.rebaseInteractive = function(targetSource, currentLocation, options) { GitEngine.prototype.getInteractiveRebaseCommits = function(targetSource, currentLocation) {
options = options || {};
// there are a reduced set of checks now, so we can't exactly use parts of the rebase function
// but it will look similar.
// now get the stop set
var stopSet = Graph.getUpstreamSet(this, targetSource); var stopSet = Graph.getUpstreamSet(this, targetSource);
var toRebaseRough = []; var toRebaseRough = [];
// standard BFS // standard BFS
var pQueue = [this.getCommitFromRef(currentLocation)]; var pQueue = [this.getCommitFromRef(currentLocation)];
@ -2101,12 +2096,62 @@ GitEngine.prototype.rebaseInteractive = function(targetSource, currentLocation,
toRebase.push(commit); toRebase.push(commit);
} }
}); });
if (!toRebase.length) { if (!toRebase.length) {
throw new GitError({ throw new GitError({
msg: intl.str('git-error-rebase-none') msg: intl.str('git-error-rebase-none')
}); });
} }
return toRebase;
};
GitEngine.prototype.rebaseInteractiveTest = function(targetSource, currentLocation, options) {
options = options || {};
// Get the list of commits that would be displayed to the user
var toRebase = this.getInteractiveRebaseCommits(targetSource, currentLocation);
var rebaseMap = {};
_.each(toRebase, function(commit) {
var id = commit.get('id');
rebaseMap[id] = commit;
});
var rebaseOrder;
if (options['interactiveTest'].length === 0) {
// If no commits were explicitly specified for the rebase, act like the user didn't change anything
// in the rebase dialog and hit confirm
rebaseOrder = toRebase;
} else {
// Get the list and order of commits specified
var idsToRebase = options['interactiveTest'][0].split(',');
// Verify each chosen commit exists in the list of commits given to the user
var extraCommits = [];
rebaseOrder = [];
_.each(idsToRebase, function(id) {
if (id in rebaseMap) {
rebaseOrder.push(rebaseMap[id]);
} else {
extraCommits.push(id);
}
});
if (extraCommits.length > 0) {
// What to do here?
}
}
this.rebaseFinish(rebaseOrder, {}, targetSource, currentLocation);
};
GitEngine.prototype.rebaseInteractive = function(targetSource, currentLocation, options) {
options = options || {};
// there are a reduced set of checks now, so we can't exactly use parts of the rebase function
// but it will look similar.
var toRebase = this.getInteractiveRebaseCommits(targetSource, currentLocation);
// now do stuff :D since all our validation checks have passed, we are going to defer animation // now do stuff :D since all our validation checks have passed, we are going to defer animation
// and actually launch the dialog // and actually launch the dialog