diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 05e72932..cfe6317d 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -60,6 +60,13 @@ describe('Git', function() { ); }); + it('Switches', function() { + return expectTreeAsync( + 'git switch -c side', + '{"branches":{"master":{"target":"C1","id":"master"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}' + ); + }); + it('Rebases', function() { return expectTreeAsync( 'gc; git checkout -b side C1; gc; git rebase master', @@ -172,6 +179,13 @@ describe('Git', function() { ); }); + it('switches after a rebase ', function() { + return expectTreeAsync( + 'git commit; git switch -c bugFix C1; git commit; git rebase master;git switch master', + '%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22master%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D' + ); + }); + it('checks out after an interactive rebase', function() { return expectTreeAsync( 'git commit; git checkout -b bugFix C1; git commit; git rebase -i master --interactive-test;git checkout master', diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 008fc48b..1e883ea0 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -855,6 +855,48 @@ var commandConfig = { command.twoArgsImpliedHead(generalArgs); engine.tag(generalArgs[0], generalArgs[1]); } + }, + + switch: { + sc: /^(gsw|git sw)($|\s)/, + regex: /^git +switch($|\s)/, + options: [ + '-c', + '-' + ], + execute: function(engine, command) { + var generalArgs = command.getGeneralArgs(); + var commandOptions = command.getOptionsMap(); + + var args = null; + if (commandOptions['-c']) { + // the user is really trying to just make a + // branch and then switch to it. so first: + args = commandOptions['-c'].concat(generalArgs); + command.twoArgsImpliedHead(args, '-c'); + + var validId = engine.validateBranchName(args[0]); + engine.branch(validId, args[1]); + engine.checkout(validId); + return; + } + + if (commandOptions['-']) { + // get the heads last location + var lastPlace = engine.HEAD.get('lastLastTarget'); + if (!lastPlace) { + throw new GitError({ + msg: intl.str('git-result-nothing') + }); + } + engine.HEAD.set('target', lastPlace); + return; + } + + command.validateArgBounds(generalArgs, 1, 1); + + engine.checkout(engine.crappyUnescape(generalArgs[0])); + } } };