diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 5f8489da..8b1040f9 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -60,11 +60,67 @@ describe('Git', function() { ); }); - it('Switches', function() { - return expectTreeAsync( - 'git switch -c side', - '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}' - ); + describe('Switches', function() { + it("to a commit", function () { + return expectTreeAsync( + 'git switch C0', + '{"branches":{"main":{"target":"C1","id":"main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"C0","id":"HEAD"}}' + ); + }); + + it("to a branch", function () { + return expectTreeAsync( + 'git switch side', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}' + ); + }); + + it('to a branch with -c option', function() { + return expectTreeAsync( + 'git switch -c side', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}' + ); + }); + + it('to a branch with --create option', function() { + return expectTreeAsync( + 'git switch --create side', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}' + ); + }); + + it('to a branch with -C option', function() { + return expectTreeAsync( + 'git switch -C side', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}' + ); + }); + + it('to a branch with -C option and given base branch', function() { + return expectTreeAsync( + 'git switch -C side main', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"C0","id":"HEAD"}}' + ); + }); + + it('to a branch with --force-create option', function() { + return expectTreeAsync( + 'git switch --force-create side', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}' + ); + }); + + it('to a branch with --force-create option and given base branch', function() { + return expectTreeAsync( + 'git switch --force-create side main', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C1","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"side","id":"HEAD"}}', + '{"branches":{"main":{"target":"C1","id":"main"},"side":{"target":"C0","id":"side"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"C0","id":"HEAD"}}' + ); + }); }); it('Rebases', function() { diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 7508f3e2..ea27a278 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -923,23 +923,43 @@ var commandConfig = { regex: /^git +switch($|\s)/, options: [ '-c', + '--create', + '-C', + '--force-create', '-' ], 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'); + { + let createOption = commandOptions['-c'] ? commandOptions['-c'] : commandOptions['--create']; + if (createOption) { + // the user is really trying to just make a + // branch and then switch to it. so first: + let args = createOption.concat(generalArgs) + command.twoArgsImpliedHead(args, '-c'); - var validId = engine.validateBranchName(args[0]); - engine.branch(validId, args[1]); - engine.checkout(validId); - return; + let validId = engine.validateBranchName(args[0]); + engine.branch(validId, args[1]); + engine.checkout(validId); + return; + } + } + + { + let sfc = '-C'; + let lfc = '--force-create'; + let fcOption = commandOptions[sfc] ? commandOptions[sfc] : commandOptions[lfc]; + if (fcOption) { + let args = fcOption.concat(generalArgs); + command.twoArgsImpliedHead(args, sfc); + + let validId = engine.validateBranchName(args[0]); + engine.forceBranch(validId, args[1]); + engine.checkout(validId); + return; + } } if (commandOptions['-']) {