From 8a3dd90e35efa0863bc4b16a1a7b8ee9620af1a8 Mon Sep 17 00:00:00 2001 From: kazzna Date: Tue, 19 Sep 2023 13:43:58 +0900 Subject: [PATCH 1/4] Refactor git switch tests --- __tests__/git.spec.js | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 5f8489da..cca87973 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -60,11 +60,28 @@ 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('Rebases', function() { From 2edc86e9a063f86ec727a2979359f5f3f9382cc4 Mon Sep 17 00:00:00 2001 From: kazzna Date: Tue, 19 Sep 2023 13:45:02 +0900 Subject: [PATCH 2/4] Add git switch --create --- __tests__/git.spec.js | 7 +++++++ src/js/git/commands.js | 23 +++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index cca87973..f1756b6e 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -82,6 +82,13 @@ describe('Git', function() { '{"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('Rebases', function() { diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 7508f3e2..62976dd1 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -923,23 +923,26 @@ var commandConfig = { regex: /^git +switch($|\s)/, options: [ '-c', + '--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: + var args = createOption.concat(generalArgs) + command.twoArgsImpliedHead(args, '-c'); - var validId = engine.validateBranchName(args[0]); - engine.branch(validId, args[1]); - engine.checkout(validId); - return; + var validId = engine.validateBranchName(args[0]); + engine.branch(validId, args[1]); + engine.checkout(validId); + return; + } } if (commandOptions['-']) { From 86bf7c7a7164348bc87ccf566ce8e2590f0a20ae Mon Sep 17 00:00:00 2001 From: kazzna Date: Tue, 19 Sep 2023 13:45:26 +0900 Subject: [PATCH 3/4] Add git switch -C --- __tests__/git.spec.js | 16 ++++++++++++++++ src/js/git/commands.js | 19 +++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index f1756b6e..526b90ef 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -89,6 +89,22 @@ describe('Git', function() { '{"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('Rebases', function() { diff --git a/src/js/git/commands.js b/src/js/git/commands.js index 62976dd1..29de9ee1 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -924,6 +924,7 @@ var commandConfig = { options: [ '-c', '--create', + '-C', '-' ], execute: function(engine, command) { @@ -935,16 +936,30 @@ var commandConfig = { if (createOption) { // the user is really trying to just make a // branch and then switch to it. so first: - var args = createOption.concat(generalArgs) + let args = createOption.concat(generalArgs) command.twoArgsImpliedHead(args, '-c'); - var validId = engine.validateBranchName(args[0]); + let validId = engine.validateBranchName(args[0]); engine.branch(validId, args[1]); engine.checkout(validId); return; } } + { + let fc = '-C'; + let fcOption = commandOptions[fc]; + if (fcOption) { + let args = fcOption.concat(generalArgs); + command.twoArgsImpliedHead(args, fc); + + let validId = engine.validateBranchName(args[0]); + engine.forceBranch(validId, args[1]); + engine.checkout(validId); + return; + } + } + if (commandOptions['-']) { // get the heads last location var lastPlace = engine.HEAD.get('lastLastTarget'); From 199f0219c4c70cbd5ad2ce6bd08aa14f15e07dce Mon Sep 17 00:00:00 2001 From: kazzna Date: Tue, 19 Sep 2023 13:45:53 +0900 Subject: [PATCH 4/4] Add git switch --force-create --- __tests__/git.spec.js | 16 ++++++++++++++++ src/js/git/commands.js | 8 +++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/__tests__/git.spec.js b/__tests__/git.spec.js index 526b90ef..8b1040f9 100644 --- a/__tests__/git.spec.js +++ b/__tests__/git.spec.js @@ -105,6 +105,22 @@ describe('Git', function() { '{"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 29de9ee1..ea27a278 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -925,6 +925,7 @@ var commandConfig = { '-c', '--create', '-C', + '--force-create', '-' ], execute: function(engine, command) { @@ -947,11 +948,12 @@ var commandConfig = { } { - let fc = '-C'; - let fcOption = commandOptions[fc]; + 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, fc); + command.twoArgsImpliedHead(args, sfc); let validId = engine.validateBranchName(args[0]); engine.forceBranch(validId, args[1]);