Resolves #164 case insensitive branch comparison with test and validation

This commit is contained in:
Peter Cottle 2014-02-27 11:32:11 -08:00
parent 0be3577572
commit 43579378e8
5 changed files with 47 additions and 8 deletions

View file

@ -6,7 +6,7 @@ var loadTree = function(json) {
};
var compareLevelTree = function(headless, levelBlob) {
var actualTree = headless.gitEngine.exportTree();
var actualTree = headless.gitEngine.printTree();
return TreeCompare.dispatchFromLevel(levelBlob, actualTree);
};
@ -30,6 +30,7 @@ var expectLevelAsync = function(headless, levelBlob) {
return;
}
var hasWarned = false;
var start;
runs(function() {
start = Date.now();
@ -37,8 +38,11 @@ var expectLevelAsync = function(headless, levelBlob) {
});
waitsFor(function() {
var diff = (Date.now() - start);
if (diff > TIME - 10) {
console.log('not going to match', command);
if (diff > TIME - 10 && !hasWarned) {
hasWarned = true;
console.log('this goal tree', loadTree(levelBlob.goalTreeString));
console.log('not going to match with command', command);
console.log(getHeadlessSummary(headless));
}
var result = compareLevelTree(headless, levelBlob);
if (result) {

View file

@ -6,7 +6,8 @@ describe('GitEngine Levels', function() {
var sequences = require('../src/levels/index').levelSequences;
_.each(Object.keys(sequences), function(sequenceKey) {
var levels = sequences[sequenceKey];
_.each(levels, function(levelBlob) {
_.each(levels, function(levelBlob, index) {
console.log('testing level', levelBlob.name.en_US);
base.expectLevelSolved(levelBlob);
});
});

View file

@ -55,6 +55,8 @@ describe('Tree Compare', function() {
// state with originTree
'{"branches":{"master":{"target":"C1","id":"master"},"o/master":{"target":"C1","id":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"remoteTrackingBranch":null,"remote":false,"target":"C1","id":"master","type":"branch"}},"commits":{"C0":{"type":"commit","parents":[],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C0","rootCommit":true},"C1":{"type":"commit","parents":["C0"],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C1"}},"HEAD":{"target":"master","id":"HEAD","type":"general ref"}}}',
{
// different cases for origin tree too
'{"branches":{"MaStEr":{"target":"C1","id":"MaStEr"},"o/master":{"target":"C1","id":"o/MaStEr"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"MaStEr","id":"HEAD"},"originTree":{"branches":{"MaStEr":{"remoteTrackingBranch":null,"remote":false,"target":"C1","id":"MaStEr","type":"branch"}},"commits":{"C0":{"type":"commit","parents":[],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C0","rootCommit":true},"C1":{"type":"commit","parents":["C0"],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 09:58:50 GMT-0800 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C1"}},"HEAD":{"target":"MaStEr","id":"HEAD","type":"general ref"}}}': true,
// one extra commit in origin
'{"branches":{"master":{"target":"C1","id":"master"},"o/master":{"target":"C1","id":"o/master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"remoteTrackingBranch":null,"remote":false,"target":"C2","id":"master","type":"branch"}},"commits":{"C0":{"type":"commit","parents":[],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 10:24:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C0","rootCommit":true},"C1":{"type":"commit","parents":["C0"],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 10:24:50 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C1"},"C2":{"type":"commit","parents":["C1"],"author":"Peter Cottle","createTime":"Wed Jul 24 2013 10:24:55 GMT-0700 (PDT)","commitMessage":"Quick commit. Go Bears!","id":"C2"}},"HEAD":{"target":"master","id":"HEAD","type":"general ref"}}}': false,
// extra commit local
@ -88,6 +90,8 @@ describe('Tree Compare', function() {
{
// side branch that is checked out
'{"branches":{"master":{"target":"C2","id":"master"},"side":{"target":"C3","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"side","id":"HEAD"}}': false,
// different cases of branches
'{"branches":{"mAsTeR":{"target":"C3","id":"mAsTeR"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"mAsTeR","id":"HEAD"}}': true,
// head detached
'{"branches":{"master":{"target":"C3","id":"master"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"C2","id":"HEAD"}}': false
}

View file

@ -618,6 +618,14 @@ GitEngine.prototype.validateBranchName = function(name) {
)
});
}
if (/^[cC]\d+$/.test(name)) {
throw new GitError({
msg: intl.str(
'bad-branch-name',
{ branch: name }
)
});
}
if (/[hH][eE][aA][dD]/.test(name)) {
throw new GitError({
msg: intl.str(
@ -644,7 +652,7 @@ GitEngine.prototype.validateAndMakeBranch = function(id, target) {
throw new GitError({
msg: intl.str(
'bad-branch-name',
{ branch: name }
{ branch: id }
)
});
}

View file

@ -80,7 +80,7 @@ TreeCompare.compareAllBranchesWithinTreesAndHEAD = function(treeA, treeB) {
treeB = this.convertTreeSafe(treeB);
// also compare tags!! for just one level
return treeA.HEAD.target == treeB.HEAD.target &&
return treeA.HEAD.target === treeB.HEAD.target &&
this.compareAllBranchesWithinTrees(treeA, treeB) &&
this.compareAllTagsWithinTrees(treeA, treeB);
};
@ -319,9 +319,31 @@ TreeCompare.getRecurseCompare = function(treeA, treeB, options) {
return recurseCompare;
};
TreeCompare.lowercaseTree = function(tree) {
if (tree.HEAD) {
tree.HEAD.target = tree.HEAD.target.toLocaleLowerCase();
}
var branches = tree.branches;
tree.branches = {};
_.each(branches, function(obj, name) {
obj.id = obj.id.toLocaleLowerCase();
tree.branches[name.toLocaleLowerCase()] = obj;
});
return tree;
};
TreeCompare.convertTreeSafe = function(tree) {
if (typeof tree == 'string') {
return JSON.parse(unescape(tree));
if (typeof tree !== 'string') {
return tree;
}
tree = JSON.parse(unescape(tree));
// ok we are almost done -- but we need to case insensitive
// certain fields. so go ahead and do that.
// handle HEAD target first
this.lowercaseTree(tree);
if (tree.originTree) {
tree.originTree = this.lowercaseTree(tree.originTree);
}
return tree;
};