diff --git a/spec/base.js b/spec/base.js index d0d4247b..69152432 100644 --- a/spec/base.js +++ b/spec/base.js @@ -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) { diff --git a/spec/levels.spec.js b/spec/levels.spec.js index 6661ee8b..290b2c6d 100644 --- a/spec/levels.spec.js +++ b/spec/levels.spec.js @@ -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); }); }); diff --git a/spec/treeCompare.spec.js b/spec/treeCompare.spec.js index 9e88c906..c502c917 100644 --- a/spec/treeCompare.spec.js +++ b/spec/treeCompare.spec.js @@ -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 } diff --git a/src/js/git/index.js b/src/js/git/index.js index 43a6468a..c6f55158 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -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 } ) }); } diff --git a/src/js/graph/treeCompare.js b/src/js/graph/treeCompare.js index fa2c7e19..068614ce 100644 --- a/src/js/graph/treeCompare.js +++ b/src/js/graph/treeCompare.js @@ -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; };